방법 이전에 기록되지 DB에 JPA 변경 완료

greedsin :

나는이 @Stateless하나의 방법으로 일부 데이터베이스 작업을 수행하는 - 콩을

public void doOperation(){
    User u1 = createNewUser()
    User u2 = createNewUser()
    User updated = mergeUser(u1,u2) // just as an example
    // should write to database now! 
    otherBlockingOperation()
}

그러나 변화는 차단 작업이 완료 될 때까지 데이터베이스에 표시하고 프론트 엔드에 따라서 표시되지 않습니다.

나는 트랜잭션이 될 때까지 최선을 다하고 있지 않기 때문에 이것이 생각 otherBlockingOperation()완료됩니다. 나는 다음 포장 otherBlockingOperation()을 다시 작동하지 않는 스레드에서.

그러나 나는 진짜 문제는 생각 merge하는 방법이 완료 된 후에 만 개체를 업데이트 할 것이다. 어떻게 즉시 객체의 값을 변경할 수 있습니까?

편집하다:

@PersistanceContext
private EntityManager em;
mergeUser(T entity){
    em.merge(entity);
    em.flush();
}
Cascader :

실제 비즈니스 요구 사항에 따라 가능한 솔루션은 이동하는 것입니다 otherBlockingOperation()새로운 메서드에 @Stateless콩과 같은 방법을 표시합니다 @Asynchronous @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW). 이것은 효과적으로 새로운 스레드와 새로운 거래 방법을 실행합니다. 당신은 간단하게 할 @Inject새로운 콩 및 통화 otherBlockingOperation()방법.

새로운 트랜잭션 (또는 수도 그렇지 않을 수도 ) (원래 트랜잭션이 성공할 수있는 동안, 즉 새로운 트랜잭션이 실패 할 수 있습니다) 비즈니스 요구에 따라 유효한 옵션. 그러나 업데이트는에 빨리 (그러나 여전히 원래 트랜잭션이 커밋 된 후) 의존하지 않고 DB에 최선을 다하고 될 것이다 otherBlockingOperation()공정 (또는 성공적으로 커밋).

추천

출처http://43.154.161.224:23101/article/api/json?id=234037&siteId=1