gpt4 book ai didi

java - Hibernate事务重复问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:58:48 25 4
gpt4 key购买 nike

我想更新数据库中的一些表,并希望所有这些工作在 1 个事务中完成,首先,我删除了 branchbuildin(Table) 中的一些条目并在此操作之后插入新条目当我插入和输入相同的建筑名称和 branch_fk 时出现问题(因为我对此表有此约束(uniqueConstraints={@UniqueConstraint(columnNames={"buildingname","branch_fk"})}))但是当我不不使用 hibernate session 并使用正常的 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 :

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

最佳答案

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

session 跟踪它管理的每个实体。即使你要求在数据库中删除它,相应的对象仍然存储在Session中,直到Session终止。

In general, it is possible that Hibernate reorders your operations when sending them to the database, for efficiency reasons.

您可以做的是刷新(即发送到数据库)您的事务,因为保存(如果需要,您也可以清除 - 即清空 session 存储的实体 - 刷新后它):

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

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

在我们的项目中,我们有一个方法可以有效地删除一个集合(另一个用于数组,使用方便的 ... 参数语法声明)实体(它适用于所有实体,它不必为每个实体都完成),同时将它们从 session 中删除,并在之前处理刷新:

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

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

关于java - Hibernate事务重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1216303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com