3

그래서 ... 나는 동일이있는 현재 실행중인 세 개의 채용 정보를 가지고 말할 수 있습니다 :잡스는 EntityManagers를 공유합니까 - Play! 프레임 워크

CrawlJob job1 = new CrawlJob(); 
CrawlJob job2 = new CrawlJob(); 
CurrentJob job3 = new CurrentJob(); 
job1.now() 
job2.now() 
job3.now() 

나는 작업 1에서 다음과 같은 경우 :

JPA.em().flush(); 
JPA.em().clear(); 

의지도 모두 분리 job2와 job3이 현재 처리중인 엔티티? 데이터베이스에서 찾은 job2/job3의 모델 개체/개체를 지나가고 있다면 job2/job3이 세션에서 분리되었을 것이기 때문에 중단해야합니까? "

User user2 = User.findById(id); 

가에"널 (null) "같거나 같아야 USER2됩니다

long id = 123 
User user1 = new User(id); 
user1.save(); 

을 그리고 작업 2 또는 job3에서 내가 할 :

마찬가지로, 나는 작업 1에서 다음을 수행 말할 수 user1 "? 즉, user1이 아직 데이터베이스로 플러시/커밋되지 않은 경우에도 job2 또는 job3이 Id로이를 찾을 수 있습니까?

나는이 질문들이 모두 무엇을 얻고 있는지에 관해서는 Jobs가 EntityManagers를 공유하고 따라서 .em(). flush(), .em()를 공유하는지 여부와 관계가 있다고 생각한다. clear() 또는 .em(). getTransaction(). commit() 또는 Model.save()가 동시에 모든 작업에 영향을 줍니까?

답변

3

작업이 자체 jpa 트랜잭션을 시작하고 트랜잭션이 완료 될 때까지 엔티티가 실제로 지속되지 않습니다.

그래서 job2는 엔터티를로드 할 때 작업 1이 완료되지 않는 한 job1에 의한 변경 사항을 볼 수 없습니다. 당신은 아직도 당신이 작업 1에서 트랜잭션을 커밋과 같은 뭔가 새로운 일을 시작할 수 있습니다 실행 jobs1 동안 데이터를 커밋하고 싶었

:

JPA.em().getTransaction().commit(); 
    JPA.em().getTransaction().begin(); 
    JPA.em().flush(); 
    JPA.em().clear(); 
+0

말할 수 있습니다 작업 1과 작업 2 (같은 작업의 2 인스턴스화) processQueue()라는 'doJob()'에서 같은 메소드를 호출한다. 그래서 'processQueue() {}'내에서 'JPA.em(). getTransaction'을 수행하면 job1 또는 job2가 processQueue를 호출했는지 여부에 따라 다른 트랜잭션이 반환된다고 말하는 것입니까? 마찬가지로 작업 1에서 'JPA.em(). clear'를 수행하면 현재 job2에 첨부 될 수있는 엔티티에는 아무런 영향을 미치지 않는다는 말처럼 들립니다. – HelpMeStackOverflowMyOnlyHope

+0

도 제공하는 예제에서 JPA.em(). getTransaction(). commit() 다음에 JPA.em()을 flush()하는 이유는 무엇입니까? commit()은 이미 데이터베이스에서 모든 것을 플러시/동기화 할 수 없습니까? – HelpMeStackOverflowMyOnlyHope

+0

답변을 주셔서 감사합니다. immediaetly 저장해야하는 엔티티가 많이 있습니다. 그래서이 코드를 무효 이름 "saveEntities"에 넣고 imeediate 업데이트가 필요한 곳에서 호출합니다. – dreampowder

관련 문제