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)
4

2 回答 2

2

从代码片段中我可以看出一件事是错误的:

  1. <class name="rStudent" table="STUDENT">当班级名称为学生时,更改此项并重新运行。

当 hibernate 没有找到 No Arg 构造函数或者您有循环依赖项时,通常会引发此异常,因为在您的代码中我看到 No Arg 构造函数可用并且对于初始化不存在循环依赖项,更正名称应该有助于解决此问题。

根据编辑:

您的课程设置器、设置器不正确

代替

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;
    }
}
于 2012-05-29T11:56:21.007 回答
1

我可以发现几个问题:

.hbm.xml有以下内容:<set name="courses" …&gt;. 属性的值name必须是实体上的属性名称。但是,您的Student课程只有方法getcourse()setcourse(). 这就是堆栈跟踪显示的原因:

在课堂上找不到第一门课程的吸气剂。学生

定义属性的正确方法名称coursesgetCourses()and setCourses()对属性重要的是 getter/setter 方法名称,而不是字段的名称。(您应该为您拥有的所有 getter 和 setter 更正此问题。)

Another thing is that your naming convention doesn't follow the official convention. In Java, the standard is to camelCase fields and methods. While this isn't as important for fields, it's necessary when using the JavaBean specification which a lot of frameworks rely on.

于 2012-05-29T12:17:57.013 回答