2017-02-12 57 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; 
    } 
} 
相關問題