我使用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