[英]Configuring JPA to handle HIBERNATE composite-id and key-property
I am trying to find the correct way to convert the below (Hibernate) XML to JPA annotations: 我正在尝试找到将以下(休眠)XML转换为JPA批注的正确方法:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<class name="TesTEntry" table="RAW_SCORE">
<composite-id mapped="false" unsaved-value="undefined">
<key-property column="SSN" name="ssn" type="string"/>
<key-property column="SUB_TEST_CD" name="subTestCd" type="string"/>
</composite-id>
<property column="TEST_QY" generated="never" lazy="false"
name="testQy" type="java.lang.Short"/>
<property column="SYS_REC" generated="never" lazy="false"
name="sysRec" type="java.util.Date"/>
<property column="SYS_ID" generated="never" lazy="false"
name="sysId" type="java.lang.String"/>
</class>
Since I have two <key-property>
I am not sure if I use @Id
, or @EmbeddedId
由于我有两个<key-property>
因此不确定使用@Id
还是@EmbeddedId
Since I have two I am not sure if I use @Id, or @EmbeddedId 由于我有两个,所以我不确定是否使用@Id或@EmbeddedId
You mean probably IdClass
. 您的意思可能是IdClass
。 And it doesn't matter which one you use. 而且,使用哪一个都没关系。
Let us say, you want to use @IdClass
: 假设您要使用@IdClass
:
equals
and hashCode
methods 实现equals
和hashCode
方法 Serializable
interface 实现Serializable
接口 Here is an example implementation (equals & hashCode are generated from IDE): 这是一个示例实现(equals和hashCode从IDE生成):
public class TestEntityPK implements Serializable {
private static final long serialVersionUID = -3424067518791080014L;
private String ssn;
private String subTestCd;
public TestEntityPK() { // }
public TestEntityPK(String ssn, String subTestCd) {
this.ssn = ssn;
this.subTestCd;
}
public String getSsn() {
return ssn;
}
public String getSubTestCd() {
return subTestCd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((ssn == null) ? 0 : ssn.hashCode());
result = prime * result
+ ((subTestCd == null) ? 0 : subTestCd.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestEntityPK other = (TestEntityPK) obj;
if (ssn == null) {
if (other.ssn != null)
return false;
} else if (!ssn.equals(other.ssn))
return false;
if (subTestCd == null) {
if (other.subTestCd != null)
return false;
} else if (!subTestCd.equals(other.subTestCd))
return false;
return true;
}
} }
And use it in the entity as follows: 并在实体中使用它,如下所示:
@Entity
@Table(name="RAW_SCORE")
@IdClass(TestEntityPK.class)
public class TestEntity {
@Id private String ssn;
@Id
@Column(name="SUB_TEST_CD")
private String subTestCd;
@Column(name="TEST_QY")
private short testQy;
@Column(name="SYS_REC")
@Temporal(TemporalType.DATE)
private Date sysRec;
@Column(name="SYS_ID")
private String sysId;
// getters and setters
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.