SpringBoot使用Hibernate自我关联手工事务处理
手工事务处理
-
引入事务
@PersistenceContext private EntityManager entityManager; /** * getCurrentSession * * @return org.hibernate.Session */ protected Session getCurrentSession() { return entityManager.unwrap(Session.class); }
- 开启事物管理
/** * reloadEntityCascade * @param queryResultItem queryResultItem */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void reloadEntityCascade(QueryResultItem queryResultItem) throws Exception { //处理级联关系 List<QueryResultItem> queryResultItems = new ArrayList<>(); if (!CollectionUtils.isEmpty(queryResultItem.getChildren())) { for (QueryResultItem queryResultItem1 : queryResultItem.getChildren()) { reloadEntityCascade(queryResultItem1); QueryResultItem queryResultItem2 = new QueryResultItem(); queryResultItem2.setUuid(queryResultItem1.getUuid()); queryResultItems.add(queryResultItem2); } } //更新到数据库 Transaction transaction = getCurrentSession().getTransaction().isActive() ? getCurrentSession().getTransaction() : getCurrentSession().beginTransaction(); EntityUtil.reloadEntityProperties(queryResultItem); if (StringUtils.isEmpty(queryResultItem.getUuid())) { queryResultItemService.getQueryResultItemDao().persist(queryResultItem); } else { QueryResultItem oldItem = queryResultItemService.find(queryResultItem.getUuid()); oldItem.setChildren(queryResultItems); EntityUtil.reloadEntityProperties(oldItem); queryResultItemService.getQueryResultItemDao().merge(oldItem); } transaction.commit(); transaction.begin(); }