2016-05-27 2 views
0

Я пытаюсь найти правильный путь для преобразования ниже (Hibernate) XML в JPA аннотацию:Настройки JPA для обработки Hibernate композитного идентификатора и ключ-свойства

<!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> 

Поскольку у меня есть два <key-property> я не уверен, что если я использую @Id или @EmbeddedId

+1

ЧТО XML является то, что? Недействительно JPA orm.xml. –

+0

@BillyFrost Я переношу его в JPA. Класс - это база данных Entity, и я пытаюсь избавиться от всех этих проектов XML и использовать аннотации. – Drew1208

+1

Да, и ЧТО ЭТО ЗНАЧИТ XML? Вы не определяете, от чего это (это, конечно, не от JPA). Документация JPA рассказывает вам, как поддерживать составные ПК, например, этот документ http://www.datanucleus.org/products/accessplatform_5_0/jpa/application_identity.html#Multiple_PrimaryKey_field определяет несколько полей Id и определяет IdClass –

ответ

0

Поскольку у меня есть два я не уверен, если я использую @Id или @EmbeddedId

Вы означает, вероятно, IdClass. И не имеет значения, какой из них вы используете.

Допустим, вы хотите использовать @IdClass:

  • Определение класса для вашего ID.
  • Реализовать equals и hashCode методы
  • Реализовать конструктор по умолчанию
  • Реализовать интерфейс Serializable

Ниже приведен пример реализации (равна & хэш-код генерируется из 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; 
     } 

}

И использовать его в объекте следующим образом:

@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 
} 
Смежные вопросы