我正在使用具有 manyToMany 關系的休眠,我想顯示資料庫中的資料
先感謝您。
我收到此錯誤:

database :

這是代碼:
Class EnseignerId :
@Embeddable
public class EnseignerId implements Serializable {
//id professeur
@Column(name="professeur_code")
private int code;
//id matiere
@Column(name="matiere_reference")
private String reference;
public EnseignerId() {
super();
}
//getters and setters...
Class Enseigner :
@Entity
@Table(name="Enseigner")
public class Enseigner {
@EmbeddedId
private EnseignerId id = new EnseignerId();
//id prof
@ManyToOne
@MapsId("code")
private Professeur professeur;
//id matiere
@ManyToOne
@MapsId("reference")
private Matiere matiere;
@Column(name="heures")
private int heures;
//constructor getters and setters...
Class Professeur:
@Entity
@Table(name="professeur")
public class Professeur {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="code")
private int code ;
@Column(name="nom")
private String nom;
@Column(name="prenom")
private String prenom;
...
@OneToMany(
mappedBy="professeur",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<Enseigner> matieres; //List<Association> Class; //I followed a tutorial
//constructor getters and setters...
public List<Enseigner> getMatieres() {
return matieres;
}
Class Matiere :
@Entity
@Table(name="matiere")
public class Matiere {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="reference")
private String reference;
@Column(name="description")
String description;
@Column(name="volume")
int volume;
@OneToMany(
mappedBy= "matiere",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<Enseigner> professeurs;
//constructor getters and setters...
getProfesseur() method :
public Professeur getProfesseur(int code) {
SessionFactory sessionFactory = getSessionFactory(); //static method
Session session = sessionFactory.openSession();
Professeur professeur = null;
try {
session.getTransaction().begin();
System.out.println("------------Calling getProfesseur()----------");
professeur = session.get(Professeur.class, code);
if(professeur != null) {
System.out.println(professeur);
}else {
throw new DAOException( "CODE INVALIDE!" );
}
}
catch(Exception e ) {
System.out.println(e.getMessage());
}
finally {
session.close();
}
return professeur;
}
保存資料并獲得沒有Matiere作業的教授。但是當我執行以下操作時,獲取主鍵存在于連接表Enseigner中的Matiere或professeur 會生成錯誤:
Professeur prof =profDAO.getProfesseur(2); //*generates errors* //the professor with id=2 exists in database
System.out.println(prof);
List<Enseigner> enseigner = prof.getMatieres(); //*generates errors*...
List<Matiere> matieres = new ArrayList<>();
for(Enseigner ens : enseigner) {
matieres.add(ens.getMatiere());
System.out.println(ens);
}
/*for(Matiere mat : matieres) {
System.out.println(mat);
}*/
uj5u.com熱心網友回復:
這個問題與 Hibernate 無關。請仔細檢查堆疊跟蹤:您的Enseigner.toString()呼叫Professeur.toString()又會Enseigner.toString()再次呼叫,依此類推。
這些天,當人們盲目地使用 Lombok 及其@Data(幾乎不應該使用)@ToString和@EqualsAndHashCode. 這些生成包含所有欄位的相應方法!
您需要洗掉這些注釋或對其進行設定,以便它們僅使用您真正需要的欄位。大多數情況下,當您使用 ORM 撰寫 Web 應用程式時,不需要您的equals()和hashCode()。Hibernate 確保您沒有同一物體的 2 個實體。
另一方面toString()可能很有用,但我們不應該在其中包含所有欄位 - 僅包含有助于識別物體的欄位。
uj5u.com熱心網友回復:
你有回圈參考。您需要排除欄位professeurs和matieres通過@JsonIgnoreProperties
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/395402.html
