关于一对多(学生和班级)的一个奇怪问题,很难理解
学生
<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));
程序就没有错了,请高手解释一下原因
学生
<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));
程序就没有错了,请高手解释一下原因
解决方案 »
- 没有用sping的项目用spring-security作权限合适吗?两者什么关系?
- struts 2拦截器
- 如何对几个不同的数据库同时做事务处理
- jstl 中文对比问题,请高手帮忙,谢谢
- 恳请推荐一下学习SSH框架的书籍,介绍一下学习的方法。
- hibernate in action中的一段话是什么意思?
- 谁有SpringMVC在Controller中省市联动的例子给我个
- 使用Struts实现Http文件下载服务
- JAVA 调用MYSQL 带返回值存储过程 Parameter index of 13 is out of range (1, 11)
- 奇怪的问题,帮忙啊
- struts2.0的一个问题
- 取struts中表单值的问题
改成
<generator class="native"> </generator> 2个关系文件都改成这样的试试。
不行的话加我。我帮你看看。QQ312976625.挺有意思的。
为什么发出这样的语句,关键是roomid=null,为什么是null
改成
<set name="set" table="student" cascade="save-update" inverse="true">
試一下