gpt4 book ai didi

java - 多对多额外列 eclipselink 不起作用

转载 作者:行者123 更新时间:2023-12-01 11:42:32 26 4
gpt4 key购买 nike

我试图用额外的列(日期)表示多对多关联,如下所示:

Encaissement(id)-----Etat_Encaissement(id_etat)(多对多关系)

新关联是 EncaissementEtatEncaissement,它将包含两个实体的 ID 和一个额外的 Date-Etat 列。

我已遵循此文档并执行了完全相同的步骤。这是我的类(class):===================实体启用====================== =

@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(){

}

}

================Entity Encaissement_Etat_Encaissement====================该实体包含 Encaissement 和 Etat_Encaissement 的 id 以及日期列

@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(){

}
}

最后一个类的 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

问题:

我在 Encaissement 类的 addEtat 方法中得到 java.lang.Exception [ this.etats_enc_etats.add(encaiss_etat_encaiss); ] 并且日志表明 etats_enc_etats 为 null 所以我无法将 Encaissement_Etat (在本例中为记录)添加到 Encaissement (在本例中为 encaissEspece),而所有这一切都是因为 etats_enc_etats== 的实例空

(再次:

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

任何人都可以帮我解决这个问题吗?谢谢。

最佳答案

您遇到的问题可能是由于您未设置的基本映射上有@ID。由于这些值为 null,JPA 将 null 插入到 PK 值中。您必须在当前设置中手动设置 ID 映射,这需要首先保留 Encaissement 和 Etat_Encaissement 实例并刷新以便分配它们的 ID,然后使用这些值来设置 EncaissementEtatEncaissement 实例的 id_etat_encaissement 和 id_encaissement 值。

如果您使用的是 JPA 2.1,您可以使用 @ID 标记 EncaissementEtatEncaissement etat_encaissements 和 encaissement 关系,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属性,但如果不使用它们,则不需要它们。

关于java - 多对多额外列 eclipselink 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29417191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com