如何使用 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 工作。但是获取 Matiere 或 professeur 其主键存在于连接 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
排除字段 professeurs
和 matieres
这个问题与Hibernate无关。请仔细检查堆栈跟踪:您的 Enseigner.toString()
调用 Professeur.toString()
,后者又调用 Enseigner.toString()
,依此类推。
这些天我越来越注意到这个问题,因为人们盲目地使用 Lombok 及其 @Data
(几乎不应该使用)、@ToString
和 @EqualsAndHashCode
。这些生成各自的方法,包括 all 字段!
您需要删除这些注释或对其进行设置,以便它们仅使用您真正需要的字段。大多数情况下,当您使用 ORM 编写 Web 应用程序时,不需要 equals()
和 hashCode()
。 Hibernate 确保您没有同一实体的 2 个实例。
另一方面,toString()
可能很有用,但我们不应在其中包含所有字段 - 仅包含有助于识别实体的字段。
我正在使用具有多对多关系的休眠模式,我想显示来自数据库的数据
提前致谢。
我收到以下错误:
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 或 professeur 其主键存在于连接 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
professeurs
和 matieres
这个问题与Hibernate无关。请仔细检查堆栈跟踪:您的 Enseigner.toString()
调用 Professeur.toString()
,后者又调用 Enseigner.toString()
,依此类推。
这些天我越来越注意到这个问题,因为人们盲目地使用 Lombok 及其 @Data
(几乎不应该使用)、@ToString
和 @EqualsAndHashCode
。这些生成各自的方法,包括 all 字段!
您需要删除这些注释或对其进行设置,以便它们仅使用您真正需要的字段。大多数情况下,当您使用 ORM 编写 Web 应用程序时,不需要 equals()
和 hashCode()
。 Hibernate 确保您没有同一实体的 2 个实例。
另一方面,toString()
可能很有用,但我们不应在其中包含所有字段 - 仅包含有助于识别实体的字段。