문제

EntityManager를 통해 획득 한 특정 JPA Entity Bean을 분리하는 가장 쉬운 방법은 무엇일까요?또는 쿼리가 분리 된 객체를 처음에 반환하여 본질적으로 '읽기 전용'으로 작동하도록 할 수 있습니까?

이 작업을 원하는 이유는 Bean 내의 데이터를 수정하고 싶기 때문입니다. 응용 프로그램에서만 데이터를 수정하고 데이터베이스에 저장하지 않기 때문입니다.내 프로그램에서 결국 EntityManager에서 flush ()를 호출해야하는데, 이는 연결된 엔티티에서 기본 데이터베이스까지 모든 변경 사항을 유지하지만 특정 객체를 제외하고 싶습니다.

도움이 되었습니까?

해결책

안타깝게도 현재 JPA 구현 인 AFAIR에서는 엔티티 관리자에서 하나의 개체를 연결 해제 할 수 없습니다.

EntityManager.clear ()는 JPA 개체의 모든 연결을 해제하므로 연결을 유지하려는 다른 개체가있는 경우 모든 경우에 적절한 솔루션이 아닐 수 있습니다.

따라서 가장 좋은 방법은 개체를 복제하고 개체를 변경하는 코드에 복제본을 전달하는 것입니다.기본 및 변경 불가능한 개체 필드는 기본 복제 메커니즘에 의해 적절한 방식으로 처리되므로 많은 연결 코드를 작성할 필요가 없습니다.

다른 팁

(답하기에는 너무 늦을 수 있지만 다른 사람에게는 유용 할 수 있음)

지금 JPA로 첫 번째 시스템을 개발하고 있습니다.안타깝게도이 시스템이 거의 완성되었을 때이 문제에 직면했습니다.

간단하게 입력하세요.Hibernate를 사용하거나 JPA 2.0을 기다리십시오.

Hibernate에서는 'session.evict (object)'를 사용하여 세션에서 하나의 객체를 제거 할 수 있습니다. JPA 2.0, 현재 초안 에서지속성 컨텍스트에서 하나의 개체를 분리하는 'EntityManager.detach (object)'메서드입니다.

어떤 JPA 구현을 사용하든간에 이제는 JPA 2.0 및 JEE6의 일부에있는 entityManager.detach(object)를 사용하십시오.

EntityManager에서 개체를 분리해야하고 기본 ORM 레이어로 Hibernate를 사용하는 경우 Hibernate Session 개체를 사용하고 Session.evict (Object) 메소드입니다. 라코 디스

물론 다른 ORM 제공 업체로 전환하면이 문제가 발생하지만 딥 카피를 만드는 것이 바람직하다고 생각합니다.

내가 아는 한,이를 수행하는 유일한 직접적인 방법은 다음과 같습니다.

  1. txn 커밋-아마도 합리적인 옵션이 아닐 것입니다.
  2. 지속성 컨텍스트 지우기-EntityManager.clear ()-잔인하지만 지울 수 있습니다.
  3. 객체 복사-대부분의 경우 JPA 객체는 직렬화 가능하므로 매우 간단해야합니다 (특히 효율적이지 않은 경우).

EclipseLink를 사용하는 경우 옵션도 있습니다.

쿼리 힌트, eclipselink.maintain-cache"="false를 사용하십시오. 반환 된 모든 개체가 분리됩니다.

EclipseLink JpaEntityManager copy() API를 사용하여 개체를 원하는 깊이로 복사하세요.

빈에 속성이 너무 많지 않은 경우 새 인스턴스를 만들고 지속 된 빈에서 모든 속성을 수동으로 설정할 수 있습니다.

이것은 복사 생성자로 구현 될 수 있습니다. 예를 들면 다음과 같습니다. 라코 디스

다음 : 라코 디스

이것은 빠르고 더럽지 만 객체를 직렬화 및 역 직렬화 할 수도 있습니다.

SEAM과 JPA 1.0을 사용하고 있고 내 시스템에는 모든 필드 변경 사항을 기록해야하는 기능이 있으므로 기록해야하는 엔터티의 동일한 필드 인 경우 값 개체 또는 데이터 전송 개체를 만들었습니다.새로운 pojo의 생성자는 다음과 같습니다 : 라코 디스

JPA 1.0 (EclipseLink를 사용하여 테스트 됨)에서는 트랜잭션 외부에서 엔티티를 검색 할 수 있습니다.예를 들어 컨테이너 관리 트랜잭션으로 다음을 수행 할 수 있습니다. 라코 디스

다음과 같이 영구 엔터티 개체를 확장하는 DTO 개체를 만든 유사한 경우를 처리하십시오. 라코 디스

마지막으로 스칼라 쿼리는 원하는 비 관리 속성을 검색합니다. 라코 디스

실제로 원격 경계를 넘어서 엔티티를 전달하고 싶어서 여기에 온 경우 하이버 나치를 속이기 위해 코드를 입력하면됩니다. 라코 디스

Cloneable은 실제로 PersistantBag를 복사하기 때문에 작동하지 않습니다.

직렬화 가능하고 바이트 배열 스트림과 파이프 스트림을 사용하는 것은 잊어 버리십시오.교착 상태를 피하기 위해 스레드를 생성하면 전체 개념이 죽습니다.

이것을 호출하여 EntityManager에서 단일 엔티티를 제거하는 방법이 있다고 생각합니다 라코 디스

이렇게하면 캐시에서 특정 항목이 제거됩니다.

엔티티의 기본 키가 변경되지 않은 경우 EntityManager.refresh (Object o) 메서드를 사용할 수도 있다고 생각합니다.이 방법은 엔티티의 원래 상태를 복원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top