我是hibernate的新手。我有三张桌子(课程 - 学生 - 课程学生)。以下是我的代码,但它没有用。我也写了cfg.xml。我认为我的问题是我的hbm文件,但我无法解决。
public class Student {
private int student_id;
private String student_name;
public Student()
{
}
public Student(int id,String name)
{
this.student_id=id;
this.student_name=name;
}
private Set<Course> courses = new HashSet<Course>();
public int getstudentid()
{
return student_id;
}
public void setstudentid(int id)
{
this.student_id=id;
}
public String getstudentname()
{
return student_name;
}
public void setstudentname(String name)
{
this.student_name=name;
}
public Set<Course> getcourse()
{
return courses;
}
public void setcourse(Set<Course> courses)
{
this.courses=courses;
}
}
public class Course {
private int course_id;
private String course_name;
private Set<Student> students= new HashSet<Student>();
public Course()
{
}
public Course(int id, String name)
{
this.course_id=id;
this.course_name=name;
}
public int getcourseid()
{
return course_id;
}
public void setcourseid(int id)
{
this.course_id=id;
}
public String getcoursename()
{
return course_name;
}
public void setcoursename(String name)
{
this.course_name=name;
}
public Set<Student> getstudents()
{
return students;
}
public void setstudents(Set<Student> students)
{
this.students=students;
}
}
的hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated May 29, 2012 3:19:54 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="first">
<class name="Course" table="COURSE">
<id name="course_id" type="int" access="field">
<column name="COURSE_ID" />
<generator class="assigned" />
</id>
<property name="course_name" type="java.lang.String" access="field">
<column name="COURSE_NAME" />
</property>
<set name="students" table="student_course"
inverse="false" lazy="true" fetch="join" cascade="all">
<key column="student_id" />
<many-to-many column="course_id" class="Course" />
</set>
</class>
</hibernate-mapping>
和
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated May 29, 2012 3:19:54 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="first">
<class name="Student" table="STUDENT">
<id name="student_id" type="int" access="field">
<column name="STUDENT_ID" />
<generator class="assigned" />
</id>
<property name="student_name" type="java.lang.String" access="field">
<column name="STUDENT_NAME" />
</property>
<set name="courses" table="student_course"
inverse="false" lazy="true" fetch="join" cascade="all">
<key column="student_id" />
<many-to-many column="course_id" class="Course" />
</set>
</class>
</hibernate-mapping>
我的托管代码:
public class ManageStudent {
private static SessionFactory sf;
private static ServiceRegistry serviceRegistry;
public static void main(String[] args) {
try {
Configuration configuration = new Configuration().addResource("first/Student.hbm.xml").addResource("first/Course.hbm.xml");
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()).buildServiceRegistry();
sf = configuration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
System.out.println("Hibernate Many to Many Mapping Example Using Xml ");
Session session = sf.openSession();
session.beginTransaction();
Student s1=new Student(1,"mina");
Student s2=new Student(2,"samira");
Course c1=new Course(10,"math");
Course c2=new Course(11,"sport");
s1.getcourse().add(c2);
s2.getcourse().add(c1);
s2.getcourse().add(c2);
session.save(s1);
session.save(s2);
session.getTransaction().commit();
session.close();
}
}
我的错误是:
Failed to create sessionFactory object.org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
Exception in thread "main" java.lang.ExceptionInInitializerError
at first.ManageStudent.main(ManageStudent.java:21)
Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:180)
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:131)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:346)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at first.ManageStudent.main(ManageStudent.java:18)
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:138)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:188)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:336)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:498)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:142)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:158)
... 4 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:135)
... 13 more
Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for courses in class first.Student
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:316)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:310)
at org.hibernate.mapping.Property.getGetter(Property.java:298)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:436)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:200)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:82)
... 18 more
请帮帮我。 我的新错误:
Failed to create sessionFactory object.org.hibernate.HibernateException: Wrong column type in SYSTEM.COURSE for column COURSE_NAME. Found: number, expected: varchar2(255 char)
Exception in thread "main" java.lang.ExceptionInInitializerError
at first.ManageStudent.main(ManageStudent.java:21)
Caused by: org.hibernate.HibernateException: Wrong column type in SYSTEM.COURSE for column COURSE_NAME. Found: number, expected: varchar2(255 char)
at org.hibernate.mapping.Table.validateColumns(Table.java:282)
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at first.ManageStudent.main(ManageStudent.java:18)
答案 0 :(得分:2)
从代码片段中我可以看到一件事:
<class name="rStudent" table="STUDENT">
当班级名称为学生时,请更改此项并重新运行。当hibernate没有找到No Arg构造函数或者你有循环依赖时,通常会抛出此异常,因为在代码中我看到No Arg构造函数可用,并且初始化没有循环依赖,因此更正名称应该有助于解决此问题问题。
根据编辑:
你的getter,课程设置者不正确
而不是
public Set<Course> getcourse() // this should be getCourses
{
return courses;
}
public void setcourse(Set<Course> courses) // this should be setCourses
{
this.courses=courses;
}
在类似的行上,请在Courses.java中更改以下内容
public Set<Student> getstudents() // Make it getStudents
{
return students;
}
public void setstudents(Set<Student> students) // Make it setStudents
{
this.students=students;
}
你的getter,setter不遵循hibernate所需的正确命名约定。
使用以下代码检查您的getter,setter for Student:
import java.util.HashSet;
import java.util.Set;
public class Student {
private int student_id;
private String student_name;
private Set<Course> courses = new HashSet<Course>();
public Student() {
}
public Student(int id, String name) {
this.student_id = id;
this.student_name = name;
}
/**
* @return the student_id
*/
public int getStudent_id() {
return student_id;
}
/**
* @param student_id the student_id to set
*/
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
/**
* @return the student_name
*/
public String getStudent_name() {
return student_name;
}
/**
* @param student_name the student_name to set
*/
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
/**
* @return the courses
*/
public Set<Course> getCourses() {
return courses;
}
/**
* @param courses the courses to set
*/
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
类似课程
import java.util.HashSet;
import java.util.Set;
public class Course {
private int course_id;
private String course_name;
private Set<Student> students = new HashSet<Student>();
public Course() {
}
public Course(int id, String name) {
this.course_id = id;
this.course_name = name;
}
/**
* @return the course_id
*/
public int getCourse_id() {
return course_id;
}
/**
* @param course_id the course_id to set
*/
public void setCourse_id(int course_id) {
this.course_id = course_id;
}
/**
* @return the course_name
*/
public String getCourse_name() {
return course_name;
}
/**
* @param course_name the course_name to set
*/
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
/**
* @return the students
*/
public Set<Student> getStudents() {
return students;
}
/**
* @param students the students to set
*/
public void setStudents(Set<Student> students) {
this.students = students;
}
}
答案 1 :(得分:1)
我可以发现几个问题:
您的.hbm.xml
具有以下内容:<set name="courses" …>
。 name
属性的值必须是实体上属性的名称。但是,您的Student
班级只有getcourse()
和setcourse()
方法。这就是堆栈跟踪说明的原因:
无法在课堂上找到课程的获取者。学生
定义属性courses
的正确方法名称为getCourses()
和setCourses()
。它是对属性非常重要的getter / setter方法名称,而不是字段的名称。 (你应该为你拥有的所有getter和setter纠正这个。)
另一件事是您的命名约定不遵循官方惯例。在Java中,标准是camelCase字段和方法。虽然这对于字段并不重要,但在使用许多框架所依赖的JavaBean规范时,这是必要的。