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)
你是对的,一切都发生在同一个事务中,同一个Hibernate Session.
会话跟踪它管理的每个实体.即使您要求在数据库中删除它,相应的对象仍会在会话中记忆,直到会话终止.
通常,出于效率原因,Hibernate可能会在将数据发送到数据库时重新排序您的操作.
您可以做的是刷新(即发送到数据库)您的交易,因为保存(如果需要,您也可以清除 - 即清空会话记忆的实体 - 它在刷新后):
sess.flush();
// sess.clear(); // if needed or convenient for you
branchBuildingDao.save(bbe, sess);
Run Code Online (Sandbox Code Playgroud)
另请注意,虽然会话记住了您的实体,但修改它们会在关闭会话时触发自动更新.
在我们的项目中,我们有一个方法可以有效地删除...实体的集合(以及使用方便的参数语法声明的数组的另一个集合)(它适用于所有实体,不必为每个实体完成),删除他们同时离开会议,并在之前照顾潮红:
sess.delete(e))并将其添加到"已删除"列表中.sess.evict(e)).别担心,flush只会将SQL发送到数据库.它仍然需要提交或回滚.
| 归档时间: |
|
| 查看次数: |
5811 次 |
| 最近记录: |