2017-02-12 83 views
1

当调用save(或saveAndFlush)代码时,我需要立即坚持(插入)实体到数据库。如何在Activiti Service中立即将实体持久化/提交实体到数据库任务

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

我们使用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任务中遇到这个问题。

任何反馈将不胜感激。

回答

0

克服这种情况的一种方法是利用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方法处理完实体后将在物理数据库中持久化,因为它是在已提交的单独事务中创建的。

+0

谢谢。快速澄清。你如何定义会话。 session.persist(ENT); – Shawn

+0

我们最终使用了EntityManager而不是SessionFactory。这样做的缺点。 EntityManger看起来更标准。 '@Component public class MessageRepositoryCustomImpl implements MessageRepositoryCustom { \t \t @PersistenceContext EntityManager entityManager; \t @Override \t @Transactional(传播= Propagation.REQUIRES_NEW) \t公共MessageEntity saveImmediate(MessageEntity实体){ \t \t entityManager.persist(实体); \t \t return entity; \t} }' – Shawn

+0

不错的选择。由于它是JPA标准,EntityManager始终是首选方式。解决方案是否真的适合你? –

1

这工作。

@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; 
    } 
} 
相关问题