简体   繁体   English

配置JPA以处理HIBERNATE复合ID和密钥属性

[英]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

  • Define a class for your ID. 为您的ID定义一个类。
  • Implement equals and hashCode methods 实现equalshashCode方法
  • Implement public default constructor 实现公共默认构造函数
  • Implement the 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM