如何使用 hibernate ManyToMany 从数据库中获取数据

How to fetch data from database using hibernate 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 工作。但是获取 Matiereprofesseur 其主键存在于连接 table 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);
    }*/

你有循环引用。您需要通过 @JsonIgnoreProperties

排除字段 professeursmatieres

这个问题与Hibernate无关。请仔细检查堆栈跟踪:您的 Enseigner.toString() 调用 Professeur.toString(),后者又调用 Enseigner.toString(),依此类推。

这些天我越来越注意到这个问题,因为人们盲目地使用 Lombok 及其 @Data(几乎不应该使用)、@ToString@EqualsAndHashCode。这些生成各自的方法,包括 all 字段!

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

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