org.hibernate.MappingException: Impossible de déterminer le type pour: java.util.List, à la table: College, pour les colonnes:

Maintenant, j’apprends l’hibernation et j’ai commencé à l’utiliser dans mon projet. C’est une application CRUD. J’ai utilisé l’hibernation pour toutes les opérations crud. Cela fonctionne pour tous. Mais, le One-To-Many & Many-To-One, je suis fatigué de l’essayer. Enfin, cela me donne l’erreur ci-dessous.

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

Ensuite, je suis passé par ce tutoriel vidéo . C’est très simple pour moi, au début. Mais, je ne peux pas le faire fonctionner. Il dit aussi maintenant

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

J’ai effectué quelques recherches sur Internet, il y a quelqu’un qui raconte un bogue dans Hibernate , et certains disent, en ajoutant @GenereatedValue, cette erreur sera effacée. Mais rien ne fonctionne pour moi,

J’espère que je vais avoir un correctif !!

Merci!

Voici mon code:

College.java

 @Entity public class College { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int collegeId; private Ssortingng collegeName; private List students; @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) public List getStudents() { return students; } public void setStudents(List students) { this.students = students; }//Other gettters & setters omitted 

Student.java

 @Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int studentId; private Ssortingng studentName; private College college; @ManyToOne @JoinColumn(name="collegeId") public College getCollege() { return college; } public void setCollege(College college) { this.college = college; }//Other gettters & setters omitted 

Main.java:

 public class Main { private static org.hibernate.SessionFactory sessionFactory; public static SessionFactory getSessionFactory() { if (sessionFactory == null) { initSessionFactory(); } return sessionFactory; } private static synchronized void initSessionFactory() { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } public static Session getSession() { return getSessionFactory().openSession(); } public static void main (Ssortingng[] args) { Session session = getSession(); Transaction transaction = session.beginTransaction(); College college = new College(); college.setCollegeName("Dr.MCET"); Student student1 = new Student(); student1.setStudentName("Peter"); Student student2 = new Student(); student2.setStudentName("John"); student1.setCollege(college); student2.setCollege(college); session.save(student1); session.save(student2); transaction.commit(); } } 

Console:

  Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290) at org.hibernate.mapping.Property.isValid(Property.java:217) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:463) at org.hibernate.mapping.RootClass.validate(RootClass.java:235) at org.hibernate.cfg.Configuration.validate(Configuration.java:1330) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1833) at test.hibernate.Main.initSessionFactory(Main.java:22) at test.hibernate.Main.getSessionFactory(Main.java:16) at test.hibernate.Main.getSession(Main.java:27) at test.hibernate.Main.main(Main.java:43) 

Le XML:

      com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/dummy root 1234  1  org.hibernate.dialect.MySQLDialect  thread  org.hibernate.cache.NoCacheProvider  true  update    

Vous utilisez la stratégie d’access aux champs (déterminée par l’annotation @Id). Placez toute annotation liée à JPA juste au-dessus de chaque champ au lieu de la propriété getter

 @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) private List students; 

L’ajout de @ElementCollection au champ List a résolu ce problème:

  @Column @ElementCollection(targetClass=Integer.class) private List counsortinges; 

Problème avec les stratégies d’access

En tant que fournisseur JPA, Hibernate peut inspecter à la fois les atsortingbuts d’entité (champs d’instance) ou les accesseurs (propriétés d’instance). Par défaut, l’emplacement de l’annotation @Id donne la stratégie d’access par défaut. Lorsqu’il est placé sur un champ, Hibernate prendra un access basé sur le champ. Placé sur le getter d’identifiant, Hibernate utilisera un access basé sur la propriété.

Accès basé sur le terrain

Lorsque vous utilisez un access basé sur les champs, l’ajout d’autres méthodes au niveau de l’entité est beaucoup plus flexible car Hibernate ne considère pas les éléments de l’état de persistance

 @Entity public class Simple { @Id private Integer id; @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) private List students; //getter +setter } 

Accès basé sur la propriété

Lorsque vous utilisez un access basé sur des propriétés, Hibernate utilise les accesseurs pour lire et écrire l’état de l’entité

 @Entity public class Simple { private Integer id; private List students; @Id public Integer getId() { return id; } public void setId( Integer id ) { this.id = id; } @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) public List getStudents() { return students; } public void setStudents(List students) { this.students = students; } } 

Mais vous ne pouvez pas utiliser à la fois les access basés sur les champs et sur les propriétés. Il va montrer comme cette erreur pour vous

Pour plus d’idée, suivez ceci

 @Access(AccessType.PROPERTY) @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name="userId") public User getUser() { return user; } 

J’ai les mêmes problèmes, je l’ai résolu en ajoutant @Access(AccessType.PROPERTY)

Ne vous inquiétez pas! Ce problème se produit en raison de l’annotation. Au lieu d’un access basé sur les champs, l’access basé sur les propriétés résout ce problème. Le code comme suit:

 package onetomanymapping; import java.util.List; import javax.persistence.*; @Entity public class College { private int collegeId; private Ssortingng collegeName; private List students; @OneToMany(targetEntity = Student.class, mappedBy = "college", cascade = CascadeType.ALL, fetch = FetchType.EAGER) public List getStudents() { return students; } public void setStudents(List students) { this.students = students; } @Id @GeneratedValue public int getCollegeId() { return collegeId; } public void setCollegeId(int collegeId) { this.collegeId = collegeId; } public Ssortingng getCollegeName() { return collegeName; } public void setCollegeName(Ssortingng collegeName) { this.collegeName = collegeName; } 

}