我想代表多對多關聯有一個額外的列(日期)如下:多對多額外的列的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用這個幫我一下。謝謝。
它有它的用途。如果您希望將實體映射爲實體內的基本映射,那麼請使用MapsId。如果模型從不需要直接在EncaissementEtatEncaissement中使用該字段(因爲它可以從引用的encaissement和etat_encaissements中訪問),那麼我不會。不要忘記確保PKClass使用etat_encaissements和encaissement屬性名稱,而不是先前的id_etat_encaissement和id_encaissement,以便JPA可以將long值與正確的引用實體相匹配。 – Chris 2015-04-02 19:57:51
謝謝@Chris,我會試一試,讓你知道,但是你沒有告訴我關於類EncaissementEtatEncaissementId是否應該將ID註釋添加到屬性:id_etat_encaissements和id_encaissements。感謝您的幫助 – Amine 2015-04-02 20:20:15
您知道@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