代码之家  ›  专栏  ›  技术社区  ›  Am1rr3zA

Hibernate事务复制问题

  •  3
  • Am1rr3zA  · 技术社区  · 16 年前

    我想更新数据库中的一些表,并希望所有这些工作在一个事务中完成, 当我使用相同的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 回复  |  直到 16 年前
        1
  •  7
  •   KLE rslite    16 年前

    你说得对,所有事情都发生在同一个事务和同一个Hibernate会话中。

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

    一般来说,有可能 将它们发送到数据库时,例如 效率原因。

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

    还要注意的是,当会话记忆实体时,修改实体将在关闭会话时触发自动更新。

    在我们的项目中,我们有一个方法可以高效地删除一个集合(另一个用于数组,使用 ...

    1. 在所有实体上循环,删除它(使用 sess.delete(e) )并将其添加到“deleteds”列表中。
      • 刷新会话以强制Hibernate立即将更改发送到数据库,
      • sess.evict(e) ).
      • 清空“deleteds”列表。