如何从数据库获取数据使用hibernate manymany

2022-01-22 00:08:05 标签 databasehibernatemany-to-manyhqljava-ee-6

我使用hibernate与manymany关系,我想显示来自数据库的数据

提前谢谢你。

我得到这样的错误:

数据库:

代码如下:

类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...

类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...

类教授:

@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;
}

类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()方法:

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

###这个问题与Hibernate无关。请仔细检查堆栈跟踪:你的Enseigner.toString() calls Professeur.toString() which in turn calls Enseigner.toString() agai调用Professeur.toString() which 它反过来调用Enseigner.toString() again and so on.

如此类推。

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

您需要删除这些注释或设置它们,以便它们只使用您真正需要的字段。大多数时候,你的equals()和hashCode()在你用ORM编写web应用时是不需要的。Hibernate确保不会有同一个实体的两个实例。

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

你有循环引用。你需要排除字段professeurs and matieres by @JsonIgnorePropertie和matieres by <通过@JsonIgnoreProperties

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码