org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]
现在,我正在学习Hibernate,并开始在我的项目中使用它。这是一个CRUD应用程序。我用冬眠来做所有的积垢手术。它对所有人都有效。但是,一对多,多对一,我已经厌倦了尝试。最后,它给出了下面的错误。
然后我又看了一遍这个视频教程。一开始对我来说很简单。但是,我做不到。现在也一样,说
我在互联网上进行了一些搜索,有人告诉它在休眠中有一个错误,有人说,通过添加@generetreatedvalue,这个错误将被清除。但对我来说没什么用,
我希望我能得到一些解决办法!!
谢谢!
这里是我的代码:
爪哇大学
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Entity public class College { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int collegeId; private String collegeName; private List<Student> students; @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; }//Other gettters & setters omitted |
学生JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int studentId; private String 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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 (String[] 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(); } } |
慰问:
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/dummy</property> <property name="connection.username">root</property> <property name="connection.password">1234</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping class="test.hibernate.Student" /> <mapping class="test.hibernate.College" /> </session-factory> |
您正在使用字段访问策略(由@id annotation确定)。在每个字段的正上方放置任何与JPA相关的注释,而不是getter属性
1 2 | @OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) private List<Student> students; |
在列表字段中添加
1 2 3 |
访问策略问题
As a JPA provider, Hibernate can introspect both the entity attributes
(instance fields) or the accessors (instance properties). By default,
the placement of the@Id annotation gives the default access
strategy. When placed on a field, Hibernate will assume field-based
access. Placed on the identifier getter, Hibernate will use
property-based access.
基于字段的访问
当使用基于字段的访问时,添加其他实体级别的方法更加灵活,因为Hibernate不会考虑持久性状态的那些部分。
1 2 3 4 5 6 7 8 9 10 11 12 |
基于属性的访问
使用基于属性的访问时,Hibernate将访问器用于读取和写入实体状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @Entity public class Simple { private Integer id; private List<Student> 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<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } } |
但不能同时使用基于字段和基于属性的访问。它会对你显示出那样的错误
想了解更多的想法,请遵循以下步骤
1 2 3 4 5 6 | @Access(AccessType.PROPERTY) @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name="userId") public User getUser() { return user; } |
我也有同样的问题,我通过添加
虽然我刚开始冬眠,但几乎没有什么研究(我们可以说是反复试验)我发现这是由于在注释方法/文件时不一致造成的。
在变量上注释@id时,请确保所有其他注释也仅在变量上完成。当您在getter方法上注释它时,同样要确保只注释所有其他getter方法,而不是它们各自的变量。
别担心!出现此问题是因为注释。与基于字段的访问不同,基于属性的访问解决了这个问题。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package onetomanymapping; import java.util.List; import javax.persistence.*; @Entity public class College { private int collegeId; private String collegeName; private List<Student> students; @OneToMany(targetEntity = Student.class, mappedBy ="college", cascade = CascadeType.ALL, fetch = FetchType.EAGER) public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Id @GeneratedValue public int getCollegeId() { return collegeId; } public void setCollegeId(int collegeId) { this.collegeId = collegeId; } public String getCollegeName() { return collegeName; } public void setCollegeName(String collegeName) { this.collegeName = collegeName; } |
}