如何使用Hibernate ManyToMany从数据库中获取数据 [英] How to fetch data from database using hibernate ManyToMany

查看:28
本文介绍了如何使用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时,我越来越注意到这个问题。它们分别生成包含所有字段的方法!

您需要删除这些注释或对其进行设置,以便它们只使用您真正需要的字段。当您使用ORM编写Web应用程序时,大多数情况下不需要您的equals()hashCode()。休眠可确保您不会有同一实体的两个实例。

另一方面,toString()可能很有用,但我们不应该在其中包括所有字段-只包括那些有助于标识实体的字段。

这篇关于如何使用Hibernate ManyToMany从数据库中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆