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... }
其中表中的每一列都被读作地图的一个条目。 因此,在给定的示例中,地图将具有具有适当值的密钥ID
, name
, email
等。
如果Hibernate需要,我可以和一个单独的id
成员一起生活,但我想避免在一个类中有50个成员 。
这可能在Hibernate 4中吗?
我不确定是否可以维护Map
,如果可以,它是如何影响可读性的。
但您可以使用@Embeddable
和@AttributeOverride
anotations。
为了避免在一个类中有50个成员,您可以按一些公共属性对成员进行分组,并将每个组放在一个单独的类中。 然后,您将必须使用@Embeddable
对每个类进行@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类。 拥有一个包含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. }