日期:2014-05-17  浏览次数:20757 次

Hibernate 新手问题
我有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表示自己维护
    //但是在多表的里要加上 Dep