Hibernate事务重复问题

Am1*_*3zA 3 java session hibernate 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                
Run Code Online (Sandbox Code Playgroud)

我在第一个方法中得到了我的会话:

        Session sess = null;
        sess = HibernateUtil.getSession();
        Transaction tx = sess.beginTransaction();
Run Code Online (Sandbox Code Playgroud)

KLE*_*KLE 6

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

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

通常,出于效率原因,Hibernate可能会在将数据发送到数据库时重新排序您的操作.

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

sess.flush();
// sess.clear(); // if needed or convenient for you
branchBuildingDao.save(bbe, sess);
Run Code Online (Sandbox Code Playgroud)

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

在我们的项目中,我们有一个方法可以有效地删除...实体的集合(以及使用方便的参数语法声明的数组的另一个集合)(它适用于所有实体,不必为每个实体完成),删除他们同时离开会议,并在之前照顾潮红:

  1. 循环所有实体,将其删除(使用sess.delete(e))并将其添加到"已删除"列表中.
  2. 每50个实体(对应于我们为了效率原因而配置的批量大小)(以及最后):
    • 刷新Session以强制Hibernate立即将更改发送到数据库,
    • 循环'删除'列表,清除会话中的每个实体(使用sess.evict(e)).
    • 清空'已删除'列表.

别担心,flush只会将SQL发送到数据库.它仍然需要提交或回滚.