2012-10-25 47 views
2

使用JPA,我嘗試修改多語言內容的持久對象,這意味着我需要具有ID和語言的組合鍵。該id還需要使用序列遞增(我正在使用Oracle)。如何做呢?使用JPA和Oracle管理具有增量ID的複合主鍵

目前,我得到一個Contenu類:

@Entity 
@Table(name = "CONTENUS") 
public class Contenus implements java.io.Serializable { 

    private ContenusId id; 
    ... 
} 

和ContenusId類:

@Embeddable 
public class ContenusId implements java.io.Serializable { 

    private Long id; 
    private String langue; 
    ... 
} 

但這不處理增量ID。任何想法?

回答

2

首先,您需要爲JPA實體管理器創建和ID類,以瞭解如何檢查兩個對象是否相等。此ID類應覆蓋equals()hashcode()方法。

/** 
* ContenusPK.java 
* 
* $Source$ 
*/ 
import java.io.Serializable; 

public class ContenusPK implements Serializable 
{ 
    public static final long serialVersionUID = 1L; 

    private Long id; 
    private String langue; 

    /* 
    * (non-Javadoc) 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() 
    { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     result = prime * result + ((langue == null) ? 0 : langue.hashCode()); 
     return result; 
    } 

    /* 
    * (non-Javadoc) 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     ContenusPK other = (ContenusPK) obj; 
     if (id == null) 
     { 
      if (other.id != null) 
       return false; 
     } 
     else if (!id.equals(other.id)) 
      return false; 
     if (langue == null) 
     { 
      if (other.langue != null) 
       return false; 
     } 
     else if (!langue.equals(other.langue)) 
      return false; 
     return true; 
    } 

    /** 
    * @return the serialversionuid 
    */ 
    public static long getSerialversionuid() 
    { 
     return serialVersionUID; 
    } 

    /** 
    * @return the id 
    */ 
    public Long getId() 
    { 
     return id; 
    } 

    /** 
    * @return the langue 
    */ 
    public String getLangue() 
    { 
     return langue; 
    } 

    /** 
    * @param id the id to set 
    */ 
    protected void setId(Long id) 
    { 
     this.id = id; 
    } 

    /** 
    * @param langue the langue to set 
    */ 
    protected void setLangue(String langue) 
    { 
     this.langue = langue; 
    } 

} 

然後,你需要聲明的複合主鍵屬性的實體,該ID類與實體相關聯,並定義ID​​生成策略,具體如下:

@IdClass(ContenusPK.class) 
@Entity 
@TableName(name="") 
public class Contenus { 

    @Id 
    @GeneratedValue(
     strategy = GenerationType.SEQUENCE, 
     generator = "GENERATOR_NAME") 
    @SequenceGenerator(
     name = "GENERATOR_NAME", 
     sequenceName = "SEQUENCE NAME IN DB") 
    @Column(name = "CONTENUS_ID") 
    private Long id; 

    @Id 
    @Column(name = "LANGUE") 
    private String langue; 

    ... 
} 
+0

所以,如果我創建3 Contenus對象語法值爲「en」,「fr」和「de」,我稱之爲'myEntityManager.persist();',這3個對象是否會被保存爲相同的id值? –

+0

不,序列會爲每個記錄生成不同的ID。 – Vikdor

+1

我認爲這是Alexis試圖避免的。由於它是一個組合鍵,因此只有在需要時才能使用下一個序列值。應該可以手動使用下一個序列號,這樣就可以決定何時必須增加id。 – Macilias