我想在数据库中更新我的一些表,并希望所有这些工作在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();
答案 0 :(得分:6)
你是对的,一切都发生在同一个事务中,同一个Hibernate Session。
会话跟踪它管理的每个实体。即使您要求在数据库中删除它,相应的对象仍会在会话中记忆,直到会话终止。
一般来说,有可能 Hibernate重新安排您的操作 将它们发送到数据库时,为 效率原因。
你可以做的是刷新(即发送到数据库)你的交易,因为保存(如果需要,你也可以清除 - 即清空会话记忆的实体 - 它在刷新后):
sess.flush();
// sess.clear(); // if needed or convenient for you
branchBuildingDao.save(bbe, sess);
另请注意,虽然会话记住了您的实体,但修改它们会在关闭会话时触发自动更新。
在我们的项目中,我们有一个方法可以有效地删除实体的集合(以及使用方便的...
参数语法声明的数组的另一个集合)(它适用于所有实体,它不需要为每个实体做完),同时将它们从会话中删除,并在之前处理冲洗:
sess.delete(e)
)并将其添加到“已删除”列表中。sess.evict(e)
)。别担心,flush只会将SQL发送到数据库。它仍然需要提交或回滚。