【问题标题】:How to persist/commit entity to database immediately in Activiti Service Task如何在 Activiti 服务任务中立即将实体持久化/提交到数据库
【发布时间】:2017-06-30 17:11:55
【问题描述】:

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

但是,尽管实体是在上下文中创建的,但它不会立即保存在数据库中。

我们正在使用 Spring Boot。

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

在服务类中

@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


    【解决方案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 方法完成处理后,实体将物理地保存在数据库中,因为它是在已提交的单独事务中创建的。

    【讨论】:

    • 谢谢。快速澄清。你如何定义会话。 session.persist(ent);
    • 我们最终使用了 EntityManager 而不是 SessionFactory。这样做的任何缺点。 EntityManger 看起来更标准。 @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; } }
    • 不错的选择。 EntityManager 始终是首选方式,因为它是 JPA 标准。该解决方案真的对您有用吗?
    • 是的。谢谢。
    • 太棒了。很高兴我能帮忙
    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      相关资源
      最近更新 更多