我想代表多对多关联有一个额外的列(日期)如下:多对多额外的列的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