我要向一对父子表执行插入(事务)操作,其中父表的主键是用hibernate自动生成的。生成后执行查询获取新生成的主键,再用这个主键对子表进行插入。代码大概是下面的样子:父表的hbm.xml
<id name="Id" type="java.lang.Integer">
   <column name="ID" />
   <generator class="increment"></generator>
</id>执行过程如下
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.getTransaction();
tr.begin();
初始化父表Dto
父表Dao.save();
查询父表新生成的主键 ☆
初始化子表Dto;
子表Dao.save();
tr.commit()问题是☆执行查询的时候,hibernate会自动flush,造成父表记录被提交,事务性被破坏。
另外,如果我用 session.setFlushMode(FlushMode.COMMIT); 设置成提交时才flush的模式,查询父表新主键时取到的是旧的值,导致后面插入子表时主键重复。第一次用hibernate开发,头大中。
有什么办法解决吗?谢谢

解决方案 »

  1.   

    在Hibernate执行父子表插入不用那么麻烦
    你若在配置文件中设置过这两个表的关系后(以一对多关系说明one-to-many)如:
    主表类Classes(班级),字表类Student(学生)
    类Classes中有属性private Set<Student> students;
    现有stu1,stu2,stu3三个学生信息,class1一个班级
    可以把stu1,stu2,stu3都放入class1的Set集合中
    在<set >配置标签中加入级联cascade= "all" 注意不能再用inverse="true"
    直接save(class1)就可以把他的子项3个学生信息都插入了
      

  2.   

    如果楼主有service层的话,可以把事物控制放在service层,通过service层调用方法解决,即:你有个执行保存父类的service方法,和查询父类的service方法,以及子类保存的service方法,你在子类保存的service方法中执行你上面写的功能,就可以解决!
    不知道我这样说。楼主明白么?