2015-04-02 50 views
0

我想代表多對多關聯有一個額外的列(日期)如下:多對多額外的列的EclipseLink不工作

Encaissement(ID)----- Etat_Encaissement(id_etat )(多對多關係)

新的關聯是EncaissementEtatEncaissement,它將具有兩個實體的ID和一個額外的列Date-Etat。

我按照這個文檔做了完全相同的步驟。這裏是我的課程: ==================== Entity Encaissement ==================== ==

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="ENCAISS_TYPE") 
@Table(name="ENCAISSEMENT") 
public class Encaissement extends encaiss implements Serializable{ 

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
    @JoinColumn(name = "ID_CLIENT") 
    protected Client Client; 


    @OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy="encaissement") 
    protected Set<EncaissementEtatEncaissement> etats_enc_etats; 

    // Ajouter un etat a l'encaissement. 
    public void addEtat(Etat_Encaissement etat, Date dateEtat) { 
     EncaissementEtatEncaissement encaiss_etat_encaiss = new EncaissementEtatEncaissement(); 
     encaiss_etat_encaiss.setEtat_encaissements(etat); 
     encaiss_etat_encaiss.setEncaissement(this); 
     encaiss_etat_encaiss.setId_etat_encaissement(etat.getId_etat_encaissement()); 
     encaiss_etat_encaiss.setId_encaissement(this.getId_encaissement()); 
     encaiss_etat_encaiss.setDateEtat(dateEtat); 

     this.etats_enc_etats.add(encaiss_etat_encaiss); 
     // Also add the association object to the etat. 
     etat.getEncaissements().add(encaiss_etat_encaiss); 
    } 

    @Column(name="LIBELLE") 
    protected String libelle; 
    @Column(name="PIECE_JOINTE") 
    protected String piece_jointe; 
    public Set<EncaissementEtatEncaissement> getEtats_enc_etats() { 
     return etats_enc_etats; 
    } 

    public void setEtats_enc_etats(Set<EncaissementEtatEncaissement> etats_enc_etats) { 
     this.etats_enc_etats = etats_enc_etats; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name="DATE_ENCAISSEMENT") 
    protected Date date_encaissement; 
    @Embedded 
    protected Avis_Recette avis_recette; 

    public Encaissement(String libelle, String piece_jointe, Date date_encaissement){ 
     this.libelle=libelle; 
     this.piece_jointe=piece_jointe; 
     this.date_encaissement=date_encaissement; 
    } 

    public Encaissement(){ 

    } 

} 

==================== 實體Etat_Encaissement ================= =====

@Entity 
@Table(name="ETAT_ENCAISSEMENT") 
public class Etat_Encaissement implements Serializable{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="etat_encaissement_seq_gen") 
    @SequenceGenerator(name="etat_encaissement_seq_gen", sequenceName="ETAT_ENCAISSEMENT_SEQ", allocationSize = 1, initialValue = 1) 
    private long id_etat_encaissement; 

    //@ManyToMany(mappedBy="etats", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
    //private Set<Encaissement> Encaissements; 

    @OneToMany(mappedBy="etat_encaissements") 
    private Set<EncaissementEtatEncaissement> encaissements; 


    @Column(name="LIBELLE") 
    private String libelle; 

    public Etat_Encaissement(String libelle){ 
     this.libelle=libelle; 
    } 

    public Etat_Encaissement(){ 

    } 

} 

================ 實體Encaissement_Etat_Encaissement ================== == 該實體包含Encaissement和Etat_Encaissement的編號加上日期列

@Entity 
@Table(name="ENCAISSEMENT_ETAT_ENCAISSEMENT") 
@IdClass(EncaissementEtatEncaissementId.class) 
public class EncaissementEtatEncaissement { 

     @Id 
     private long id_etat_encaissement; 
     @Id 
     private long id_encaissement; 


     @Temporal(TemporalType.DATE) 
     @Column(name="DATE_ETAT_ENCAISS") 
     private Date dateEtat; 

     @ManyToOne 
     @PrimaryKeyJoinColumn(name="ID_ETAT_ENCAISSEMENT", referencedColumnName="ID_ETAT_ENCAISSEMENT") 

     private Etat_Encaissement etat_encaissements; 

    @ManyToOne 
     @PrimaryKeyJoinColumn(name="ID_ENCAISSEMENT", referencedColumnName="ID_ENCAISSEMENT") 
false, referencedColumnName = "id") 

     private Encaissement encaissement; 


     public EncaissementEtatEncaissement(Date dateEtat){ 
      this.dateEtat=dateEtat; 
     } 

     public EncaissementEtatEncaissement(){ 

     } 
} 

而且finaly這最後類的Id:

public class EncaissementEtatEncaissementId implements Serializable{ 

    private long id_etat_encaissement; 

    private long id_encaissement; 

    public int hashCode() { 
     return (int)(id_etat_encaissement + id_encaissement); 
     } 

    public boolean equals(Object object) { 
     if (object instanceof EncaissementEtatEncaissementId) { 
      EncaissementEtatEncaissementId otherId = (EncaissementEtatEncaissementId) object; 
      return (otherId.id_etat_encaissement == this.id_etat_encaissement) && (otherId.id_encaissement == this.id_encaissement); 
     } 
     return false; 
     } 

} 

==============我用這個簡單的代碼,相關的實例的Etat_encaissement到Encaissement,通常一個新的行會被添加到Encaissement_Etat_Encaissement =============================

private Etat_Encaissement etat_record; 

    //Code here 

etat_record=saut.getEtatFromLibelle("source_identifiee");//This just return an instance of Etat 

encaissEspece.addEtat(etat_record, new java.util.Date()); // here i call addEtat which trigger the problem 

問題:

我得到java.lang.Exception的在addEtat方法是在類Encaissement [this.etats_enc_etats.add(encaiss_etat_encaiss);]和日誌表明etats_enc_etats是,所以我不能在這種情況下添加Encaissement_Etat(記錄)到Encaissement(encaissEspece在這種情況下),而這一切是因爲etats_enc_etats的實例== NULL

(再次:

@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy="encaissement") 
    protected Set<EncaissementEtatEncaissement> etats_enc_etats; //) 

任何人都可以^ h用這個幫我一下。謝謝。

回答

1

您遇到的問題可能是由於您沒有設置基本映射上的@ID。由於這些值爲null,因此JPA會將null插入到PK值中。您必須在當前設置中手動設置ID映射,這需要先持續Encaissement和Etat_Encaissement實例並刷新,以便分配其ID,然後使用這些值設置EncaissementEtatEncaissement實例的id_etat_encaissement和id_encaissement值。

如果您使用的是JPA 2。1,您可以標記EncaissementEtatEncaissement etat_encaissements和encaissement關係與@ID和JPA會爲你設置的值:

@Entity 
@Table(name="ENCAISSEMENT_ETAT_ENCAISSEMENT") 
@IdClass(EncaissementEtatEncaissementId.class) 
public class EncaissementEtatEncaissement { 

    @Temporal(TemporalType.DATE) 
    @Column(name="DATE_ETAT_ENCAISS") 
    private Date dateEtat; 

    @Id 
    @ManyToOne 
    @JoinColumn(name="ID_ETAT_ENCAISSEMENT", referencedColumnName="ID_ETAT_ENCAISSEMENT") 
    private Etat_Encaissement etat_encaissements; 

    @Id 
    @ManyToOne 
    @JoinColumn(name="ID_ENCAISSEMENT", referencedColumnName = "id") 
    private Encaissement encaissement; 
.. 
} 

您還可以使用@MapsId註釋和保持id_etat_encaissement和id_encaissement屬性,但如果你不要使用它們,你不需要它們。

+0

它有它的用途。如果您希望將實體映射爲實體內的基本映射,那麼請使用MapsId。如果模型從不需要直接在EncaissementEtatEncaissement中使用該字段(因爲它可以從引用的encaissement和etat_encaissements中訪問),那麼我不會。不要忘記確保PKClass使用etat_encaissements和encaissement屬性名稱,而不是先前的id_etat_encaissement和id_encaissement,以便JPA可以將long值與正確的引用實體相匹配。 – Chris 2015-04-02 19:57:51

+0

謝謝@Chris,我會試一試,讓你知道,但是你沒有告訴我關於類EncaissementEtatEncaissementId是否應該將ID註釋添加到屬性:id_etat_encaissements和id_encaissements。感謝您的幫助 – Amine 2015-04-02 20:20:15

+0

您知道@Chris經過所有修改後,仍然無法在表Encaissement_Etat_Encaissement中找到Encaissement_Etat_Encaissement實例,儘管addEtat方法正在運行(我從中刪除了這兩行://this.etats_enc_etats。添加(encaiss_etat_encaiss); //etat.getEncaissements().add(encaiss_etat_encaiss,因爲我仍然得到null異常!!!!!) – Amine 2015-04-02 22:36:46

相關問題