【问题标题】:How to fetch data from database using hibernate ManyToMany如何使用休眠多对多从数据库中获取数据
【发布时间】:2021-12-27 21:49:31
【问题描述】:

我正在使用带有 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 中的 Matiereprofesseur 会产生错误:

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);
    }*/

【问题讨论】:

    标签: database hibernate many-to-many hql java-ee-6


    【解决方案1】:

    此问题与 Hibernate 无关。请仔细检查堆栈跟踪:您的Enseigner.toString() 调用Professeur.toString() 又调用Enseigner.toString() 等等。

    当人们盲目地使用 Lombok 及其 @Data(几乎不应该使用)、@ToString@EqualsAndHashCode 时,我越来越注意到这个问题。这些生成包含所有字段的相应方法!

    您需要删除这些注释或将它们设置为仅使用您真正需要的字段。大多数情况下,当您使用 ORM 编写 Web 应用程序时,不需要您的 equals()hashCode()。 Hibernate 确保您没有同一实体的 2 个实例。

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

    【讨论】:

    • 再次感谢您,先生,您帮了大忙,不知怎的,我没想过这个解决方案。
    【解决方案2】:

    你有循环引用。您需要通过@JsonIgnoreProperties 排除字段professeursmatieres

    【讨论】:

    • 我添加了它,但后来我得到了@JsonIgnoreProperties cannot be resolved to a type,所以我添加了一个导入并得到了The import com.fasterxml.jackson cannot be resolved
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2011-08-16
    • 1970-01-01
    • 2011-12-23
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多