2012-06-10 2 views
0

나는 데이터베이스를 사용하여 데이터를 유지하기 위해 jpa를 사용하는 자바 SE 프로젝트에서 작업 중이다.jpa : 자바 SE 개발에서 jpa를 사용하는 방법

지금 당장 나는 각 데이터베이스 작업에 대해 새로운 엔티티 관리자를 얻고 함수 호출이 끝나면 닫습니다. like

그러나 관리자에게는 다 - 대다 관계가 매우 어렵습니다. 예 :
B 엔티티와 다 대다 관계를 가진 엔티티가 있습니다. 이고 CascadeType.MERGE가 있습니다.

일단 내가 A를 만들면 B를 만들고 여러 스레드를 실행하여 A와 B 모두에 대한 정보를 생성합니다. 그러나 B는 A의 오래된 데이터를 유지합니다. B를 병합하면 A의 데이터가 제거됩니다.

예를 들면. A는 음악이고, B는 음악 앨범이므로 하나의 B에는 A 목록이 있습니다. 다른 스레드는 음악 메타 데이터를 읽고 음악 태그 정보를 얻고 업데이트 A, B가 FS에 새로운 A가 발견되면 업데이트됩니다.
엔티티 관리자가 종료되었으므로 B의 A 목록에있는 엔티티가 오래된 것입니다. 즉, A 자체를 업데이트 할 때 B가 업데이트 된 것을 알지 못합니다. B를 병합하면 jpa가 B의 A 목록에있는 엔티티를 사용하여 A를 병합하는 데 도움이됩니다.

이 문제를 해결하려면 하나의 엔티티 관리자를 사용하고 모든 데이터베이스 작업을 하나의 단일 스레드에 넣기로 결정합니다. 그러면 새로운 문제가 나온다.

트랜잭션이 활성화되고 트랜잭션이

transaction.begin(); 
.... 
transaction.end(); 

그러나 실행 많은 스레드가 사이의 개체에 대한 열 예정이다, 그 스레드가 너무 개체를 변경할 수 있습니다.

내 질문 : 자바 SE 개발에 jpa를 사용하는 방법? 감사합니다

+1

이것이 특정 JPA 문제가 아니라고 말하고 싶습니다. 단지 멀티 스레딩 문제입니다. 당신이 필요로하는 곳에서 올바르게 동기화해야합니다 ... – home

+0

이 문제를 해결할 수 없습니다 ... 트랜잭션이 켜지면 다른 스레드를 차단할 수 없습니다 ... – Xiwen

+0

하지만 특정 정보를 동기화하려면해야합니다. 응용 프로그램을 완전히 이해하지 못했지만 하나의 EntityManager 인스턴스로 작업해야 할 수도 있습니다. java.util.concurrent.ReentrantReadWriteLock' 귀하의 데이터 액세스 레이어를 제어 할 수 있습니다 ... – home

답변

0

관계가 동기화되지 않으면 JPA를 비난 할 수 없습니다. 관계를 정상적으로 유지하는 것은 신청서의 책임입니다.

JPA에서 Java와 마찬가지로 일반적으로 관계를 유지 관리하는 것은 응용 프로그램 또는 개체 모델의 책임입니다.

Source

는 @home가 제대로 동기화 할 필요가 말했듯이.

말하자면 EntityManager는 스레드로부터 안전하지 않으므로 어떤 방식 으로든이 문제를 해결해야합니다. 응용 프로그램을 동기화하고 스레드 당 하나의 EntityManager를 사용하고 @PersistenceContext를 사용하십시오.

편집 : Here은 EntityManager에 대한 액세스를 동기화하는 것에 대해 묻는 질문입니다. 나는 그것이 당신에게 유용 할 수 있다고 생각합니다.

관련 문제