2010-11-22 3 views
6

JPA와 Google App Engine을 함께 사용하고 있습니다. 아주 간단한 @Entity가 Key와 String으로 구성되어 있다고 가정 해 보겠습니다. 이제이 엔티티 중 10000 개를 만들어 목록에 넣고 이제는 모두 저장하려고합니다.JPA로 GAE에 많은 항목 저장하기

내가

for(MyEntity entity : listOfAllEntities) { 
em.persist(entity); 
} 

EntityManager에 EM 및 루프가 목록 내 모든 기관의 통과하기를 ... 사용하려고하면 .. I는 IllegalArgumentException 얻을 것이다 :

java.lang.IllegalArgumentException : 단일 트랜잭션에서 여러 엔티티 그룹에서 작동 할 수 없습니다.

필자가 이해하는 한, persist() 호출마다 EntityManager를 닫았다가 다시 열어야합니다. 물론 이것은 매우 시간이 많이 걸립니다. 하루에 한 번씩 모든 항목을 다시로드하는 작업을 실행하려고합니다. GAE 정책에 따르면 작업의 시간 제한은 30 초입니다.

그래서 한 번에 500 개의 엔티티 만 저장하고 여러 번 작업을 실행하는 것이 더 복잡하다고 생각합니다.

내가하는 일을 성취 할 수있는 유일한 방법인가요, 아니면 여기에 뭔가 빠져 있습니까?

솔루션 : 모든 대답은 같은 방향을 가리 킵니다. 간단히 "더미 부모"개체를 만들어 일대 다 관계를 만들었습니다. 저는 제 경우에 부모님이 정말로 필요하지 않습니다. 그래서 현실 세계에서는 그렇게 말하지 않습니다. 그러나이 더미 엔티티를 각 하위 엔티티의 부모로 설정 한 후에는 트랜잭션에 대해 신경 쓰지 않고 이전과 마찬가지로 정확하게 저장할 수 있습니다. 모두에게 감사드립니다.

+0

와우, 그건 기괴하다. 좋은 질문과 대답. –

+0

[이 유사한 질문에 대한 답변보기] (http://stackoverflow.com/questions/2323777/google-app-engine-cant-operate-on-multiple-entity-groups-in-a-single-transacti). 당신이 가지고있는 것과 같은 이슈처럼 들립니다. –

+0

그래, 그게 내 질문 이었어. 상위 엔티티를 추가 한 다음 소유 된 일대 다 관계를 유지하여 동일한 엔티티 그룹에 속하도록 수정했습니다. –

답변

4

아마도 이것은 지나치게 단순화되었지만 X 엔티티를 상위 엔티티의 하위로 추가하면 동일한 엔티티 그룹에 속하게됩니다. 이렇게하면 모든 트랜잭션을 하나의 트랜잭션으로 유지할 수 있습니다. 기본적으로 부모 엔티티와 유지하려고하는 객체 인 자식 사이에 소유 된 일대 다 관계를 만듭니다.

+0

흥미 롭습니다. 기본적으로 모든 엔티티에 대해 "더미"부모를 만들고 지금 시도하고있는 것과 똑같이 저장할 수 있습니다. 고마워. 고마워. – pgruetter

+0

네, 맞습니다. 공통 부모를 가진 아이들은 같은 엔티티 그룹에 속할 것입니다. –

+0

트랜잭션이 필요하지 않은 경우 동일한 엔티티 그룹에 많은 엔티티를 두지 마십시오. 이렇게하면 앱이 매우 느려질 수 있습니다. –

1

이 오류는 트랜잭션을 사용하고 여러 엔티티 그룹에서 작동하려고한다는 오류입니다. 문서에서

: 트랜잭션의

모든 데이터 저장소 작업은 같은 엔티티 그룹의 단체에서 작동해야합니다. 여기에는 조상에 의한 엔티티 쿼리, 키로 엔티티 검색, 엔티티 업데이트 및 엔티티 삭제가 포함됩니다. 각 루트 엔티티는 별도의 엔티티 그룹에 속하므로 단일 트랜잭션은 둘 이상의 루트 엔티티를 작성하거나 조작 할 수 없습니다.

두 개 이상의 상위 (부모 없음) 엔티티를 트랜잭션에 만들 수는 있지만 각각이 다른 엔티티의 하위 인 경우 수행 할 수 있습니다. 엔티티를 만들려면 트랜잭션 외부에서 수행하십시오.

+0

이것은 좋은 지적입니다. 그것은 @ socken23이 실제로 트랜잭션이 필요한지 여부에 달려 있습니다. 그렇지 않다면 제안한 트랜잭션을 사용하지 않는 것이 좋습니다. –

+0

감사합니다. 지금은 의미가 있습니다. 그때 나는 거래 밖에서 그들을 구하려고 노력할 것이다. 처음에는 할 일이 있습니다. 아직 주제에 대해 많이 읽지 않았으므로 GAE가 트랜잭션을 자동으로 사용하는 위치를 확인하기 위해이를 수행해야합니다. – pgruetter

관련 문제