如何使用Hibernate ManyToMany从数据库中获取数据 [英] How to fetch data from database using hibernate ManyToMany
本文介绍了如何使用Hibernate ManyToMany从数据库中获取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用带有许多ToMany关系的Hibernate,并且我想显示数据库中的数据
提前谢谢您。
我收到以下错误:
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工作的教授。但是当我执行以下操作时,获取主键存在于连接表中的Matiere或专业Enseigner会产生错误:
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);
}*/
推荐答案
此问题与休眠无关。请仔细检查堆栈跟踪:您的Enseigner.toString()
调用Professeur.toString()
,然后它再次调用Enseigner.toString()
,以此类推。
当人们盲目地使用Lombok的@Data
(几乎永远不应该使用)、@ToString
和@EqualsAndHashCode
时,我越来越注意到这个问题。它们分别生成包含所有字段的方法!
equals()
和hashCode()
。休眠可确保您不会有同一实体的两个实例。
另一方面,toString()
可能很有用,但我们不应该在其中包括所有字段-只包括那些有助于标识实体的字段。
这篇关于如何使用Hibernate ManyToMany从数据库中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文