2014-02-20 1 views
2

Предположим, у меня есть Players таблицу:МАП в отдельные столбцы в Hibernate

ID | name | email | age | ... 
1 | 'bob' | null | 23 | ... 

Существует много столбцов (например, 50), и каждый (кроме ID) может быть пустым. Не обращайте внимания на дизайн таблицы, это должно оставаться этим путем сейчас :-(

Я хочу, чтобы отобразить эту таблицу объекта (то есть я хотел бы, чтобы это работать как сохранение и чтение):

public class Player implements Serializable { 
    private Map<String, String> attributes; 
    // more code, ctor, setters, getters etc... 
} 

, где каждый столбец в таблице читается как запись на карту. Таким образом, в данном примере карта будет иметь ключи ID, name, email и т.д. с соответствующими значениями.

Я могу жить с отдельный id участник если требуется Hibernate, но I w ant, чтобы не иметь 50 членов в одном классе.

Возможно ли это в Hibernate 4?

ответ

0

Я не уверен, что возможно поддержание Map, и если да, то как это влияет на читаемость.

Но вместо этого вы можете использовать аномалии @Embeddable и @AttributeOverride.

Чтобы не иметь 50 членов в одном классе, вы можете группировать членов по некоторому общему свойству и размещать каждую из групп в отдельном классе. Затем вам нужно будет аннотировать каждый из классов с помощью @Embeddable, который сделает их экземпляр встраиваемых объектов (или компонентов). Это объекты, свойства которых сопоставляются с той же таблицей, что и таблица владельца объекта. Например, предположим, что вы решили сгруппировать name, age и email свойств в одном классе, называется PersonalData

При желании можно назвать свойства, что вы любите, но тогда вам придется использовать @Column аннотацию чтобы сообщить Hibernate, о какой именно колонке таблицы базы данных вы говорите.

@Embeddable 
public class PersonalData implements Serializable { 
    private String fullname; 

    private String email; 

    private String age; 

    //accessors 
} 

Вы можете создать столько, сколько @Embeddable -annotatated классы вам нужно. Не рекомендуется иметь один класс @Embeddable с 50 членами, поэтому вы можете распространять участников по нескольким классам.

По завершении мы вернемся к @Entity -номенному классу. Его членами будут экземпляры классов @Embeddable, аннотированных с помощью анонса Embeddable. Аннотации @AttributeOverrides будут полезны для сопоставления каждого из элементов встроенного компонента с конкретной таблицей столбцов базы данных. Например:

@Entity 
public class Person implements Serializable { 
    @Embedded (
     @AttributeOverrides(name = "fullname", column = @Column(name = "name")) 
     @AttributeOverrides(name = "email", column = @Column(name = "email")) 
     @AttributeOverrides(name = "age", column = @Column(name = "age")) 
    ) 
    private PersonalData personalData; 

    //other @Embedded-annotated members. 
} 
+0

Мне нравится '@ Embeddable' идея, я думал об этом .. к сожалению, столбцы совершенно не связаны, и это было бы искусственным«группировка» – Parobay

+0

Ну ... это не то, что огромный блокатор. Попробуйте. :) –