关于一对多(学生和班级)的一个奇怪问题,很难理解
学生
<hibernate-mapping>
<class name="org.ldsj.pojo.Student" table="student">
<id name="id" column="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="roomid" column="roomid" class="org.ldsj.pojo.ClassRoom"></many-to-one>
</class>
</hibernate-mapping>
--------------------------------------
班级
<hibernate-mapping>
<class name="org.ldsj.pojo.ClassRoom" table="classroom">
<id name="id" column="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<set name="set" table="student" cascade="save-update" inverse="false">
<key column="roomid"></key>
<one-to-many class="org.ldsj.pojo.Student"/>
</set>
</class>
</hibernate-mapping>
--------------------------------------
实体类(学生)
public class Student implements Serializable{
private Integer id;
private String name;
private ClassRoom roomid;
....
班级
public class ClassRoom implements java.io.Serializable{
private Integer id;
private String name;
private Set<Student> set=new HashSet<Student>();
--------------------------------------
测试类:
public void testAA5(){
Student ss1=new Student();
ss1.setName("wang34");

Student ss2=new Student();
ss2.setName("wang46");

Set set=new HashSet();
set.add(ss1);
set.add(ss2);

HibernateUtil.beginTransaction();
Session session=HibernateUtil.getCurrentSession();
ClassRoom room=(ClassRoom)session.get(ClassRoom.class,new Integer(1));

room.setSet(set);
ss1.setRoomid(room);
ss2.setRoomid(room); session.getTransaction().commit();
session.close();
  }
这是我的测试类:测试出错了
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
...
Caused by: java.sql.BatchUpdateException: ORA-01407: 无法更新 ("SYSTEM"."STUDENT"."ROOMID") 为 NULL ...
发出一下sql语句:
Hibernate: insert into student (name, roomid, id) values (?, ?, ?)
Hibernate: insert into student (name, roomid, id) values (?, ?, ?)
Hibernate: update student set roomid=null where roomid=?
----------------------------------------------------------------------------
如果将配置文件里的inverse改为true或者将session.get(ClassRoom.class,new Integer(1));改为session.load(ClassRoom.class,new Integer(1));
程序就没有错了,请高手解释一下原因

解决方案 »

  1.   

    <generator class="increment"> </generator> 
    改成
    <generator class="native"> </generator> 2个关系文件都改成这样的试试。
    不行的话加我。我帮你看看。QQ312976625.挺有意思的。
      

  2.   

    我想问的是Hibernate: update student set roomid=null where roomid=? 
    为什么发出这样的语句,关键是roomid=null,为什么是null
      

  3.   

    <set name="set" table="student" cascade="save-update" inverse="false"> 
    改成
    <set name="set" table="student" cascade="save-update" inverse="true"> 
    試一下