SpringBoot使用Hibernate自我关联手工事务处理

SpringBoot使用Hibernate自我关联手工事务处理

手工事务处理

  1. 引入事务

        @PersistenceContext
        private EntityManager entityManager;
    
        /**
         * getCurrentSession
         *
         * @return org.hibernate.Session
         */
        protected Session getCurrentSession() {
            return entityManager.unwrap(Session.class);
        }
  2. 开启事物管理
       /**
         * 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();
        }