2015-01-13 3 views
0

Players 컬렉션이있는 Team 엔터티를 고려하십시오. Team 매핑을 사용하면 계단식 병합 및 저장 업데이트를 Players으로 설정할 수 있습니다.최대 절전 모드 : 한 개체에서 다른 개체로 계단식 엔터티 이동

Team 엔티티가 데이터베이스에 4 Players이 있습니다.

내 서비스는 사용자가 Team을 지정할 수 있습니다, 그리고 Player 한 후 다음을 수행합니다 :

  1. 기존 Team의 클론 B를 작성을
  2. 는 A로부터 Player C를 제거하고 추가 Team 컬렉션에 B

위의 모든 작업은 데이터베이스 쿼리 만 수행하는 하나의 트랜잭션으로 수행됩니다. 업데이트를 수행하지 않습니다.

두 번째 트랜잭션은 엔티티를 데이터베이스에 저장하는 데 사용됩니다. 그러나, 나는 이것에 접근하는 방법을 확신하지 못한다.

  • 그러나 Team A. 병합

    1. 이 증가 Player C. Player C의 버전 번호를 병합 한 후 효과적으로 팀 B 절약 할 수 Team B를 병합하고,이 :

      내 기존의 논리는 다음을 포함 Hibernate 세션이 실패 함 Team 인스턴스에 이전 Player C의 버전 번호에 대한 참조가 여전히 있습니다.

    어떻게이 두 개체를 저장합니까? Player C를 별도로 저장해야하며 계단식을 사용하지 않아야합니까?

  • 답변

    0

    물건을 저장할 때 병합 작업을 수행해서는 안됩니다. 분리 된 엔티티를 다시 entityManager에 병합하는 데 사용됩니다. 객체가 JPA로 가질 수있는 다양한 상태의 매우 짧은 요점은 (당신이에 읽어해야 할 수도 있습니다) :

    • 과도 : 아직 데이터베이스에 저장 (및에 따라서 알 수없는되지 않은 새로운 객체 entitymanager.) id가 설정되어 있지 않습니다.
    • Managed : entitymanager가 추적하는 객체입니다. 관리 오브젝트는 트랜잭션 범위 내에서 작업하는 오브젝트이며 트랜잭션이 확약되면 관리 오브젝트에 대한 모든 변경 사항이 자동으로 저장됩니다.
    • 분리됨 : 트랜잭션이 커밋 된 후에도 여전히 도달 할 수있는 이전에 관리 된 개체. (트랜잭션 외부의 관리 대상 객체) ID가 설정되어 있습니다.

    Hibernate/JPA의 경우, 일시적인 오브젝트와 분리 된 오브젝트의 차이점은 id 필드에 대한 값의 유무 여부입니다.

    개체를 데이터베이스에 저장하기 위해 메서드는 개체의 상태에 따라 다릅니다.

    • Transient : EntityManager.persist.이렇게하면 개체가 저장되고 관리 대상 개체가됩니다.
    • 관리 대상 : 없음. 트랜잭션이 완료되면 관리 대상 객체가 업데이트됩니다.
    • 분리됨 : EntityManager.merge. entitymanager는 더 이상 객체를 인식하지 않으므로 객체를 다시 도입해야합니다. 그러나 persist-method는 전달하는 객체를 관리하기 때문에 merge-method는 관리하지 않습니다. 대신 개체의 관리되는 복사본을 반환합니다.

    그래서 여기에서 무엇을하려고하는지 봅시다.

    먼저 EntityManager에서 객체를로드하십시오. 트랜잭션 컨텍스트에서이 작업을 수행하면이 개체는 관리 시점에 있습니다. 그런 다음 객체를 복사하여 새로운 임시 객체를 생성합니다. 그런 다음 두 개체를 모두 변경합니다.

    다음으로 트랜잭션이 커밋됩니다. 그런 다음 관리 대상 개체가 업데이트되고 일시적인 개체는 일시적으로 유지됩니다. 그런 다음 관리 대상 개체가 트랜잭션에서 살아남아 분리됩니다. 그런 다음 임시 객체를 저장합니다. 여기서 머지 메서드가 아닌 persist-method를 사용해야합니다. 어떤 것이 든 분리 된 객체 (이미 업데이트해야 함)를 업데이트하려면 병합 메소드에 전달해야합니다.

    플레이어에서 팀으로 적절한 계단식 양식을 얻으려면 계단식 작업으로 지속성 및 병합을 추가해야합니다.

    또한 복제 된 객체를 만들 때 id를 복사하지 않도록주의하십시오. 이렇게하면 id가 복사되어 Hibernate가 구할 수있는 이전 ID와 동일하게됩니다.

    팀 A의 플레이어 C와 팀 B의 플레이어 C가 다른 버전 번호를 갖는 경우 동일한 개체가 될 수 없습니다. 아마도 물건을 분리 할 때 무언가가 발생하여 두 팀의 C 선수가 같은 대상이 아니게됩니다 (그러나 이것에 대해서는 확실하지 않습니다).

    관련 문제