我写了这么几个类:Teacher ,Attend,Couse,Student分别负责老师,出勤统计,课程,学生的内容。在映射时
Student与Couse多对多关联,Teacher与Couse一对多关联,Couse与Attedn一对多关联,Student与Attend一对多关联。类的属性大致如下:
public class Attend { private Couse couse;
private Date date; private int id; private boolean isAttend; private Student student;public class Couse { private Set<Attend> attends = new HashSet<Attend>();
private String couseName; private int id;
private Set<Student> students = new HashSet<Student>(); private Teacher teacher;public class Student { private Set<Attend> attends = new HashSet<Attend>();
private int classNO;
private Set<Couse> couses = new HashSet<Couse>(); private int id; private String password;
private String studentName;
private String username;public class Teacher {
private int id;
private String password; private String teacherName; private String username;
private Set<Schedule> schedules = new HashSet<Schedule>(); private Set<Couse> couses = new HashSet<Couse>();Attend:
<class table="T_attend" name="edu.bwu.graduate.modul.Attend">
<id name="id">
<generator class="native"/>
</id>
<many-to-one name="student" class="edu.bwu.graduate.modul.Student" column="student_id" not-null="true"/>
<many-to-one name="couse" class="edu.bwu.graduate.modul.Couse" column="couse_id" not-null="true"/>
<property name="date"/>
<property name="isAttend"/>
</class>
Couse:
<class table="T_couse" name="edu.bwu.graduate.modul.Couse">
<id name="id">
<generator class="native"/>
</id>
<many-to-one name="teacher" class="edu.bwu.graduate.modul.Teacher" column="teacher_id" not-null="true"/>
<property name="couseName"/>
<set name="students" table="student_couse">
<key column="couse_id"/>
<many-to-many class="edu.bwu.graduate.modul.Student" column="student_id"/>
</set>
<set inverse="true" name="attends" lazy="true">
<key column="couse_id"/>
<one-to-many class="edu.bwu.graduate.modul.Attend"/>
</set>
</class>Student
<class table="T_Student" name="edu.bwu.graduate.modul.Student">
<id name="id">
<generator class="native"/>
</id>
<set name="couses" table="student_couse">
<key column="student_id"/>
<many-to-many class="edu.bwu.graduate.modul.Couse" column="couse_id"/>
</set>
<set inverse="true" name="attends" lazy="true">
<key column="student_id"/>
<one-to-many class="edu.bwu.graduate.modul.Attend"/>
</set>
<property name="password"/>
<property name="studentName"/>
<property name="username"/>
</class><class name="edu.bwu.graduate.modul.Teacher" table="T_Teacher">
<id name="id">
<generator class="native"/>
</id>
<property generated="never" lazy="false" name="password"/>
<property generated="never" lazy="false" name="teacherName"/>
<property generated="never" lazy="false" name="username"/>
<set inverse="true" name="schedules" lazy="false">
<key column="teacher_id"/>
<one-to-many class="edu.bwu.graduate.modul.Schedule"/>
</set>
<set inverse="true" name="couses" lazy="false">
<key column="teacher_id"/>
<one-to-many class="edu.bwu.graduate.modul.Couse"/>
</set>
</class>teacher和Schedule有一个一对多的关系,不过这个在项目01里面运行是正常的,在copy了项目02且增加了属性与关系后都不能运行了。
配置文件:
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/graduate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="edu/bwu/graduate/modul/Schedule.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Student.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Teacher.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Couse.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Attend.hbm.xml"/>
</session-factory另外我做的单元测试:Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
Student s = new Student();
Couse couse = new Couse();
Attend attend = new Attend();
Date date = new Date();
Teacher teacher = (Teacher)sess.load(Teacher.class, 1);
s.setClassNO(531);
s.setPassword("stuent");
s.setUsername("student");
s.setStudentName("王明");
sess.persist(s);
couse.setCouseName("数据库");
couse.setTeacher(teacher);
couse.getStudents().add(s);
couse.setTeacher(teacher);
s.getCouses().add(couse);
sess.save(couse);
tx.commit();
sess.close();
出的错:
org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:110)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
at edu.bwu.graduate.modul.ScheduleTest.newObject(ScheduleTest.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:107)
... 33 more
Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for isAttend in class edu.bwu.graduate.modul.Attend
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:306)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:299)
at org.hibernate.mapping.Property.getGetter(Property.java:294)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:300)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:141)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:78)
... 38 more
想问一下,多对多应该怎么用hibernate存储对象?顺序是怎么样的?再或者像我写的,一个表和一个表是多对多,同时另外一个是一对多,这种情况应该怎么写存储?顺序是怎么样的呢?
可能贴了不少代码,怕少贴了,高手不便于解答,麻烦各位了!请大家帮忙说一下,您尽管留言,因为我坚信,没有人比我更水了!
现在只能用30分了,实在不好意思,有了分追加给您!这个不是问题!
Student与Couse多对多关联,Teacher与Couse一对多关联,Couse与Attedn一对多关联,Student与Attend一对多关联。类的属性大致如下:
public class Attend { private Couse couse;
private Date date; private int id; private boolean isAttend; private Student student;public class Couse { private Set<Attend> attends = new HashSet<Attend>();
private String couseName; private int id;
private Set<Student> students = new HashSet<Student>(); private Teacher teacher;public class Student { private Set<Attend> attends = new HashSet<Attend>();
private int classNO;
private Set<Couse> couses = new HashSet<Couse>(); private int id; private String password;
private String studentName;
private String username;public class Teacher {
private int id;
private String password; private String teacherName; private String username;
private Set<Schedule> schedules = new HashSet<Schedule>(); private Set<Couse> couses = new HashSet<Couse>();Attend:
<class table="T_attend" name="edu.bwu.graduate.modul.Attend">
<id name="id">
<generator class="native"/>
</id>
<many-to-one name="student" class="edu.bwu.graduate.modul.Student" column="student_id" not-null="true"/>
<many-to-one name="couse" class="edu.bwu.graduate.modul.Couse" column="couse_id" not-null="true"/>
<property name="date"/>
<property name="isAttend"/>
</class>
Couse:
<class table="T_couse" name="edu.bwu.graduate.modul.Couse">
<id name="id">
<generator class="native"/>
</id>
<many-to-one name="teacher" class="edu.bwu.graduate.modul.Teacher" column="teacher_id" not-null="true"/>
<property name="couseName"/>
<set name="students" table="student_couse">
<key column="couse_id"/>
<many-to-many class="edu.bwu.graduate.modul.Student" column="student_id"/>
</set>
<set inverse="true" name="attends" lazy="true">
<key column="couse_id"/>
<one-to-many class="edu.bwu.graduate.modul.Attend"/>
</set>
</class>Student
<class table="T_Student" name="edu.bwu.graduate.modul.Student">
<id name="id">
<generator class="native"/>
</id>
<set name="couses" table="student_couse">
<key column="student_id"/>
<many-to-many class="edu.bwu.graduate.modul.Couse" column="couse_id"/>
</set>
<set inverse="true" name="attends" lazy="true">
<key column="student_id"/>
<one-to-many class="edu.bwu.graduate.modul.Attend"/>
</set>
<property name="password"/>
<property name="studentName"/>
<property name="username"/>
</class><class name="edu.bwu.graduate.modul.Teacher" table="T_Teacher">
<id name="id">
<generator class="native"/>
</id>
<property generated="never" lazy="false" name="password"/>
<property generated="never" lazy="false" name="teacherName"/>
<property generated="never" lazy="false" name="username"/>
<set inverse="true" name="schedules" lazy="false">
<key column="teacher_id"/>
<one-to-many class="edu.bwu.graduate.modul.Schedule"/>
</set>
<set inverse="true" name="couses" lazy="false">
<key column="teacher_id"/>
<one-to-many class="edu.bwu.graduate.modul.Couse"/>
</set>
</class>teacher和Schedule有一个一对多的关系,不过这个在项目01里面运行是正常的,在copy了项目02且增加了属性与关系后都不能运行了。
配置文件:
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/graduate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="edu/bwu/graduate/modul/Schedule.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Student.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Teacher.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Couse.hbm.xml"/>
<mapping resource="edu/bwu/graduate/modul/Attend.hbm.xml"/>
</session-factory另外我做的单元测试:Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
Student s = new Student();
Couse couse = new Couse();
Attend attend = new Attend();
Date date = new Date();
Teacher teacher = (Teacher)sess.load(Teacher.class, 1);
s.setClassNO(531);
s.setPassword("stuent");
s.setUsername("student");
s.setStudentName("王明");
sess.persist(s);
couse.setCouseName("数据库");
couse.setTeacher(teacher);
couse.getStudents().add(s);
couse.setTeacher(teacher);
s.getCouses().add(couse);
sess.save(couse);
tx.commit();
sess.close();
出的错:
org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:110)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
at edu.bwu.graduate.modul.ScheduleTest.newObject(ScheduleTest.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:107)
... 33 more
Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for isAttend in class edu.bwu.graduate.modul.Attend
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:306)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:299)
at org.hibernate.mapping.Property.getGetter(Property.java:294)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:300)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:141)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:78)
... 38 more
想问一下,多对多应该怎么用hibernate存储对象?顺序是怎么样的?再或者像我写的,一个表和一个表是多对多,同时另外一个是一对多,这种情况应该怎么写存储?顺序是怎么样的呢?
可能贴了不少代码,怕少贴了,高手不便于解答,麻烦各位了!请大家帮忙说一下,您尽管留言,因为我坚信,没有人比我更水了!
现在只能用30分了,实在不好意思,有了分追加给您!这个不是问题!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货