如何在Activiti服务任务中立即将实体持久化/提交到数据库

问题描述 投票:2回答:2

当调用save(或saveAndFlush)代码时,我需要立即将实体持久化(插入)到数据库。

然而虽然实体在上下文中创建它不是在数据库中立即坚持。

我们使用Spring启动。

public interface MessageRepository extends JpaRepository<MessageEntity, Long> {
}

在Service类中

@Service
public class TestService {

@Autowired
    private MessageRepository messageRepository;

@Transactional
        public MessageEntity saveMessage(MessageEntity entity) throws Exception {
            entity = messageRepository.saveAndFlush(entity);
            return entity;
        }
}

虽然创建了实体,但它不会立即持久化/提交到数据库。

我们仅在Activiti任务中面临此问题。

任何反馈将不胜感激。

java spring-boot spring-data-jpa spring-transactions activiti
2个回答
2
投票

这很有效。

@Component
public class MessageRepositoryCustomImpl implements MessageRepositoryCustom {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public MessageEntity saveImmediate(MessageEntity entity) {
        entityManager.persist(entity);
        return entity;
    }
}

1
投票

克服这种情况的一种方法是利用REQUIRES_NEW事务属性。

在您的情况下,您将不得不创建一个新的存储库:

public interface MessageRepositoryCustom{
   void saveAndFLush(MessageEntity ent);
}


public MessageRepositoryCustomImpl implements MessageRepositoryCustom{

   @Autowired
   private SessionFactory sessionFactory;

   @Transactional(propagation = Propagation.REQUIRES_NEW)
   void saveAndFLush(MessageEntity ent){
       Session session = sessionFactory.getCurrentSession();

       session.persist(ent);
   }
}

然后在您的服务中,您将使用该存储库:

@Transactional
        public MessageEntity saveMessage(MessageEntity entity) throws Exception {
            entity = messageRepositoryCutom.saveAndFlush(entity);

            // other processing

            return entity;
        }
}

现在,在messageRepositoryCutom.saveAndFlush方法完成处理之后,实体将物理地保存在数据库中,因为它是在已提交的单独事务中创建的。

© www.soinside.com 2019 - 2024. All rights reserved.