这是正确的(更好的)对象关系映射吗?

时间:2012-10-11 22:28:47

标签: java hibernate jpa persistence

我真的很难在我的项目中使用Hibernate。我在这里描述的一些问题:Hibernate: getting too many rows我开始想知道我的代码是否正确。我正在开发一个庞大的项目,我不得不自己定义带注释的映射类。但是当问题开始出现时,我决定重新创建与项目分开的数据库部分,并尝试在IDE中生成实体。

我有两个表:MyOptionMy有主键:列qwertypropertyProperty是来自Option表的外键。当然Optionproperty作为主键。

在我的解决方案中,我创建了@Embeddable MyPK类,其中包含两个属性:String qwertyString property。在我的My实体中,我当然有@EmbeddedId MyPKproperty(与MyPK中的列名相同),但这是{{1} } object,而不是Option中的String。

MyPK

这是由Intellij Idea中的Hibernate Tools生成的实体。没有@ManyToOne @JoinColumn(name = "property", nullable = false, insertable = false, updatable = false) protected Option option; ,但有EmbeddedId。我认为@IdClass仅适用于基本类型。但我有一个对象作为我的主键的一部分。但是这里也有@IdClass个对象。保持一列的基本类型和对象类型是否正确?

OptionEntity

这是@javax.persistence.IdClass(test.go.MyEntityPK.class) @javax.persistence.Table(name = "MY", schema = "PUBLIC", catalog = "PUBLIC") @Entity public class MyEntity { private String qwerty; @javax.persistence.Column(name = "QWERTY") @Id public String getQwerty() { return qwerty; } public void setQwerty(String qwerty) { this.qwerty = qwerty; } private String text; @javax.persistence.Column(name = "TEXT") @Basic public String getText() { return text; } public void setText(String text) { this.text = text; } private String lang; @javax.persistence.Column(name = "PROPERTY") @Id public String getProperty() { return property; } public void setProperty(String property) { this.property= property; } @Override public boolean equals(Object o) { //equals } @Override public int hashCode() { //hashCode } private OptionEntity optionByProperty; @ManyToOne @javax.persistence.JoinColumn(name = "PROPERTY", referencedColumnName = "PROPERTY", nullable = false) public OptionEntity getOptionByProperty() { return optionByProperty; } public void setOptionByProperty(OptionEntity optionByProperty) { this.optionByProperty = optionByProperty; } } 生成的类:

MyEntityPK

public class MyEntityPK implements Serializable { private String qwerty; @Id @Column(name = "qwerty") public String getQwerty() { return qwerty; } public void setQwerty(String qwerty) { this.qwerty = qwerty; } private String property; @Id @Column(name = "PROPERTY") public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } @Override public boolean equals(Object o) { //equals } @Override public int hashCode() { //hashCode } } 以下。此实体中没有特殊要点。我希望OptionEntity属性上只有@Version注释,而version代替List<MyEntity>

Collection<MyEntity>

哪种选择最合适且问题较少?我描述的那个还是粘贴的那个?

2 个答案:

答案 0 :(得分:1)

摆脱属性private String lang; / private String property;它已经由manytoone定义。你也不需要MyEntity主键的类。 MyEntity可以是自己的id类,其中两个属性qwertyoption作为其键属性,key-manytoone。

答案 1 :(得分:1)

使用派生ID查看JPA 2.0示例: http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers 这似乎是你所追求的。

在JPA中,你的id不需要embeddedId,但是如果使用复合PK,你需要一个类来保存构成pk的多个值。此类的实例将传递给em.find方法,它可以是EmbeddedId或PKClass。我更喜欢自己使用PKClass,但它取决于你 - 使用嵌入式只是将字段放在可嵌入类中,因此您使用嵌入对象来设置映射并访问值。如果使用pkClass,则不需要在其中注释的字段/属性,因为它们是直接在实体中访问和映射的。