2012-05-29 81 views
2

我是新来的休眠。我有三个表(课程 - 学生课程的学生)。以下是我的代码,但它没有工作。我也写了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

将您的完整堆栈跟踪 – mprabhat

回答

2

从代码片段,我可以看到一点毛病:

  1. <class name="rStudent" table="STUDENT">当类名是学生,改变这一点,重新运行。

此异常通常是抛出当Hibernate犯规找到一个无参数的构造函数,或者你有一个循环依赖,因为在你的代码,我看到没有参数的构造函数可用于初始化没有循环依赖存在,纠正名称应帮助解决这个问题。

按编辑:

你的getter,setter方法的课程是不正确的

而不是

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不遵循正确的命名约定红色休眠。

检查你的getter,setter方法为学生与下面的代码:

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; 
    } 
} 
+0

名称正确。它是学生。但问题没有解决。 – samira

+0

好的,你可以请给出完整的堆栈跟踪.. – mprabhat

+0

你到底意味着什么?我无法理解堆栈跟踪。 – samira

1

有几个问题我可以发现:

.hbm.xml有以下几点: <set name="courses" …>name属性的值必须是实体上属性的名称。然而,您的Student类只有方法getcourse()setcourse()。这就是堆栈跟踪的原因:

找不到课程的第一个getter。学生

正确的方法名来定义属性coursesgetCourses()setCourses()。这是对属性重要的getter/setter方法名称,而不是该字段的名称。 (你应该纠正这个问题,对于你所有的获得者和装配者。)

另一件事是你的命名约定不遵循官方约定。在Java中,标准是camelCase字段和方法。虽然这对于领域并不重要,但在使用大量框架所依赖的JavaBean规范时,这是必要的。