当前位置: 代码迷 >> Java Web开发 >> Hibernate 新手有关问题
  详细解决方案

Hibernate 新手有关问题

热度:6332   发布时间:2016-04-10 22:31:35.0
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表示自己维护
    //但是在多表的里要加上 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>();
  相关解决方案