我真的很难在我的项目中使用Hibernate。我在这里描述的一些问题:Hibernate: getting too many rows我开始想知道我的代码是否正确。我正在开发一个庞大的项目,我不得不自己定义带注释的映射类。但是当问题开始出现时,我决定重新创建与项目分开的数据库部分,并尝试在IDE中生成实体。
我有两个表:My
和Option
。 My
有主键:列qwerty
和property
。 Property
是来自Option
表的外键。当然Option
有property
作为主键。
在我的解决方案中,我创建了@Embeddable
MyPK
类,其中包含两个属性:String qwerty
和String property
。在我的My
实体中,我当然有@EmbeddedId
MyPK
和property
(与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>
哪种选择最合适且问题较少?我描述的那个还是粘贴的那个?
答案 0 :(得分:1)
摆脱属性private String lang;
/ private String property;
它已经由manytoone定义。你也不需要MyEntity主键的类。 MyEntity可以是自己的id类,其中两个属性qwerty
和option
作为其键属性,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,则不需要在其中注释的字段/属性,因为它们是直接在实体中访问和映射的。