Hibernate事务重复问题

时间:2009-08-01 10:13:51

标签: java hibernate session transactions

我想在数据库中更新我的一些表,并希望所有这些工作在1个事务中完成, 首先,我删除了branchbuildin(表)中的一些条目,并在此操作后插入新条目 当我使用相同的buildingname和branch_fk插入和输入时出现问题(因为我在此表上有这个约束(uniqueConstraints = {@ UniqueConstraint(columnNames = {“buildingname”,“branch_fk”})}))但是当我不知道时使用hibernate会话并使用普通的JDBC事务我没有这些问题。

List<Integer> allBranchBuilding = branchBuildingDao.getAllBranchBuildingID(pkId, sess);
            for (Integer integer : allBranchBuilding) {
                branchBuildingDao.delete(integer, sess); // delete kardane tamame BranchBuilding ha va tel haie aanha
            }

            Address myAdr = new Address();
            setAddress(myAdr, centralFlag, city, latit, longit, mainstreet, remainAdr, state);
            BranchBuildingEntity bbe = new BranchBuildingEntity();
            setBranchBuildingEntity(bbe, be, myAdr, city, centralFlag, latit, longit, mainstreet, buildingName, remainAdr, state, des);
            branchBuildingDao.save(bbe, sess);//Exception Occurred                

我在方法的第一个开始我的会话:

        Session sess = null;
        sess = HibernateUtil.getSession();
        Transaction tx = sess.beginTransaction();

1 个答案:

答案 0 :(得分:6)

你是对的,一切都发生在同一个事务中,同一个Hibernate Session。

会话跟踪它管理的每个实体。即使您要求在数据库中删除它,相应的对象仍会在会话中记忆,直到会话终止。

  

一般来说,有可能   Hibernate重新安排您的操作   将它们发送到数据库时,为   效率原因。

你可以做的是刷新(即发送到数据库)你的交易,因为保存(如果需要,你也可以清除 - 即清空会话记忆的实体 - 它在刷新后):

sess.flush();
// sess.clear(); // if needed or convenient for you
branchBuildingDao.save(bbe, sess);

另请注意,虽然会话记住了您的实体,但修改它们会在关闭会话时触发自动更新。

在我们的项目中,我们有一个方法可以有效地删除实体的集合(以及使用方便的...参数语法声明的数组的另一个集合)(它适用于所有实体,它不需要为每个实体做完),同时将它们从会话中删除,并在之前处理冲洗:

  1. 循环播放所有实体,将其删除(使用sess.delete(e))并将其添加到“已删除”列表中。
  2. 每50个实体(对应于我们为了效率原因而配置的批量大小)(以及最后):
    • 刷新Session以强制Hibernate立即将更改发送到数据库,
    • 循环'已删除'列表,清除会话中的每个实体(使用sess.evict(e))。
    • 清空'已删除'列表。
  3. 别担心,flush只会将SQL发送到数据库。它仍然需要提交或回滚。