2017-02-12 7 views
1

save (또는 saveAndFlush) 코드가 호출되면 즉시 엔티티를 데이터베이스에 유지 (삽입)해야합니다.Activiti 서비스에서 즉시 엔티티를 데이터베이스에 저장/커밋하는 방법

비록 엔티티가 컨텍스트에서 작성되었지만 즉시 데이터베이스에 유지되지 않습니다.

우리는 스프링 부트를 사용하고 있습니다. 엔티티가 만들어집니다 있지만 서비스 클래스

@Service 
public class TestService { 

@Autowired 
    private MessageRepository messageRepository; 

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

에서

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

즉시 데이터베이스에 커밋/유지되지 않습니다.

우리는 Activiti 작업에서만이 문제를 직면하고 있습니다.

모든 의견을 환영합니다.

답변

0

이 상황을 극복하는 한 가지 방법은 REQUIRES_NEW 트랜잭션 속성을 이용하는 것입니다. 상황에

새 저장소를 만들어야 할 것이다 다음 messageRepositoryCutom.saveAndFlush 방법은 엔티티 처리를 완료 한 후 이제

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

      // other processing 

      return entity; 
     } 
} 

: 다음

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); 
    } 
} 

해당 저장소를 사용하는 것이 당신의 서비스를 커밋 된 별도의 트랜잭션에서 생성 될 때 물리적으로 데이터베이스에 유지됩니다.

+0

감사합니다. 빠른 설명. 어떻게 세션을 정의 할 수 있습니다. session.persist (ent); – Shawn

+0

우리는 SessionFactory 대신에 EntityManager를 사용하게되었습니다. 이 일에 대한 단점. EntityManger는 더 표준적인 것처럼 보입니다. @Component MessageRepositoryCustomImpl public class 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

좋은 선택입니다. EntityManager는 항상 JPA 표준이므로 선호되는 방식입니다. 솔루션이 실제로 작동 했습니까? –

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; 
    } 
}