假设我有一个 Players
表:
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...
}
表中的每一列都被读取为 map 的条目。因此,在给定的示例中, map 将具有具有适当值的键 ID
、name
、email
等。
如果 Hibernate 需要,我可以使用单独的 id
成员,但我想避免在一个类中有 50 个成员。
这在 Hibernate 4 中可能吗?
最佳答案
我不确定维护 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
注释类。拥有一个包含 50 个成员的 @Embeddable
类并不是一个好主意,因此您可以将成员分散到多个类中。
完成后,我们回到被@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.
}
关于java - 将条目映射到 Hibernate 中的单独列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904041/