2011-11-16 2 views
2

데이터베이스에서 엔티티를 저장/업데이트하고 jpa 공급자로 최대 절전 모드로 EntityManager를 사용합니다. 내 거래는 컨테이너에 의해 처리됩니다.jpa 동시성 CMT 예외 처리

문제점 : 데이터베이스에 이미 저장된 엔티티를 추가해야하므로 예외가 발생합니다. 이 경우 삽입을 반복해야하지만 다른 값을 사용해야합니다. 그러나 예외가 발생하는 한 세션이 나 빠졌고 새 세션을 만들고 트랜잭션을 롤백해야합니다. CMT를 사용하는 경우 어떻게해야합니까? 아니면 다른 방법이 있다면?

감사합니다.

답변

1

지속성 방법으로 TransactionAttribute(REQUIRES_NEW)을 사용할 수 있습니다. 메소드를 호출하는 Bean이 예외를 잡으면, 일부 변경을 수행하고 메소드를 다시 호출 할 수 있습니다.
이것은 호출하는 bean이 아닌 persistence-method 트랜잭션을 롤백합니다.

그러나 사용 사례에서 EntityManager#persistence(-)을 수행 할 필요가 없다면 EntityManager#merge(-) 운영에 관심이있을 수 있습니다. 은 이미 존재하지 않으면 엔티티를 유지하거나 이미 존재하는 경우 업데이트을 업데이트합니다 (존재 여부는 PK를 기준으로 확인됩니다).

HTH.

0

이미 유지 된 엔티티를 확인하려면 EntityManager # find (Class, PK)를 사용하는 것이 좋습니다. null 결과는 해당 엔티티가 없음을 나타냅니다 (----> persist (.)). 그렇지 않으면 병합 (.) 메소드로 업데이트됩니다.

+0

예, 알고 있습니다. 이 사이트에서 하나의 질문으로 묘사 된 시스템을 만들고 싶었습니다. (지금 링크를 찾을 수 없습니다.) 데이터베이스는 고유 한 제약 조건을 사용하여 추가 된 값이 고유하다는 것을 보장합니다. 여기서 동시 요청을 처리해야한다는 것을 강조해야하며 삽입 메소드를 동기화하지 않도록 노력했습니다. 적절한 예외 처리를 사용하여 매번 고유 한 값을 추가 할 수 있습니다. 이것이 제가 처음에 원했던 것입니다. – Alberto