我有1个双向1-N关系,1个user对应N个artical我在user.hbm.xml中配置是这样的
<set name="artical" inverse="true" cascade="all">
<key column="id_user"></key>
<one-to-many class="Artical"/>
</set>
然后main方法中
//各种set
Transaction t = session.beginTransaction();
session.save(user);
t.commit();
我以为应该不会有错,保存user之前会先自动保存artical,因为cascade。
实际上控制台
Hibernate: insert into User (name, password, email, isAdmin) values (?, ?, ?, ?)
Hibernate: update Artical set title=?, id_user=?, time=?, content=?, isPublic=? where id_artical=?
Exception in thread "main" org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
............................
我的问题:我设置了cascade=all, inverse=trueHibernate在插入user前应该会先做select语句,查看artical有没有存在,不存在的话应该还要insert artical而且inverse=true,应该是不会触发update语句的。不知道为什么Hibernate既没有insert artical又做了update?
另外....数据库是空的,表都是新建的,不会有任何持久化对象在里面。
------解决方案--------------------
我整理的课件 自己对比吧
一对多 一 <class name="bean.Dept" table="dept" catalog="etoak">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="32" />
</property>
<set name="emps" inverse="false" lazy="false" cascade="all">
<key>
<column name="did"></column>
</key>
<one-to-many class="bean.Emp" />
</set>
</class>
//inverse="false" 默认为false 表示对方维护,true表示自己维护
//但是在多表的里要加上 Dept d =new Dept();
//lazy="false" 一表加上后查询也把子表的东西查出
d.setName("市场部");
Emp e1=new Emp(); e1.setName("11111");
Emp e2=new Emp(); e2.setName("222222");
d.getEmps().add(e1); d.getEmps().add(e2);
//当 inverse="true"时 e1.setDept(d); e2.setDept(d);
IDao dao =new IDaopl(); dao.addObject(d);
drop table if exists dept;
drop table if exists emp;
create table dept(
id int primary key auto_increment,
name varchar(32)
);
create table emp(
id int primary key auto_increment,
name varchar(32),
did int
);
一对多 多 <class name="bean.Emp" table="emp" catalog="etoak">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="32" />
</property>
<many-to-one name="dept"
class ="bean.Dept"
cascade="save-update">
<column name ="did">
</column>
</many-to-one>
</class>
------------------ 一对多类中的写法-------------------------------
一 public class Country implements java.io.Serializable {
private Set<Capital> capital =new HashSet<Capital>();