Map的条目用于分隔Hibernate中的列

假设我有一个Players表:

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

有很多列(比如50),每个列(除了ID )都可能为空。 请忽略桌面设计,现在必须保持这种方式:-(

我想将这个表映射到一个实体(即我希望它能同时用于保存和读取):

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

其中表中的每一列都被读作地图的一个条目。 因此,在给定的示例中,地图将具有具有适当值的密钥IDnameemail等。

如果Hibernate需要,我可以和一个单独的id成员一起生活,但我想避免在一个类中有50个成员

这可能在Hibernate 4中吗?

我不确定是否可以维护Map ,如果可以,它是如何影响可读性的。

但您可以使用@Embeddable@AttributeOverride anotations。

为了避免在一个类中有50个成员,您可以按一些公共属性对成员进行分组,并将每个组放在一个单独的类中。 然后,您将必须使用@Embeddable对每个类进行@Embeddable ,这将使其实例成为可嵌入对象(或组件)。 这些对象的属性与拥有实体的表映射到同一个表。 例如,假设您已决定将nameageemail属性分组到一个名为PersonalData类中

或者,您可以根据需要为属性命名,但是您必须使用@Column注释告诉Hibernate您正在讨论哪个确切的数据库表列。

 @Embeddable public class PersonalData implements Serializable { private String fullname; private String email; private String age; //accessors } 

您可以创建@Embeddable -annotatated类。 拥有一个包含50个成员的单个@Embeddable类并不是一个好主意,因此您可以将成员分散到多个类中。

完成后,我们回到@Entity -annotated类。 它的成员将是使用@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. }