2011-09-22 2 views
15

JPA 2.0, 최대 절전 모드 및 "orphanRemoval"에 관한 질문이 있습니다.JPA 2.0/Hibernate와 "orphanRemoval": 엔티티 만 바꾸면 이전 엔티티가 제거되지 않습니다

먼저 내 설정 :

  • 봄 3.0.5.RELEASE
  • SprnigData JPA 1.0.1.RELEASE
  • 최대 절전 모드 3.5.2-최종
  • DBMS : PostgreSQL의 9.0

"User"와 "AvatarImage"라는 두 개의 간단한 엔티티 클래스가 있으며 "User"에는 "AvatarImage"가 있으며 "User"와 "AvatarImage"에는 relat가 있습니다. 이온. 클래스 "사용자"에서

이 호텔은 다음과 같습니다은 "avatarImage"속성이 null로 설정됩니다 경우

// class "User" 
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true) 
private AvatarImage avatarImage; 

그래서 의미, "사용자"와 "AvatarImage"사이의 참조입니다 "orphanRemoval"메카니즘은 데이터베이스에서 "avatarImage"를 지울 것입니다 (제가 틀렸다면 저를 교정하십시오). 다음 따라서 "사용자"를 저장, null로 먼저 "avatarImage"속성을 설정

user.setAvatarImage(null); // First set it to null 
userRepository.save(user); // Now "orphanRemoval" will delete the old one 

user.setAvatarImage(theNewAvatarImage); 
userRepository.save(user); 

및 :

그래서 특정 사용자에 대한 "avatarImage"을 업데이트 할 때, 나는 현재이를 작성해야 새 AvatarImage를 "NewAvatarImage"로 설정하고 사용자를 다시 저장하십시오.

"orphanRemoval"은 이전 "avatarImage"를 "null"로 설정하고 사용자를 저장하면 삭제됩니다.

하지만,이 코드도 일을해야한다고 생각했을 것이다 :

그래서 나는 "avatarImage"를 설정하지 않으면됩니다
user.setAvatarImage(theNewAvatarImage); 
userRepository.save(user); 

에 "널"하지만 바로 이전 "avatarImage 교체", "theNewAvatarImage"로 설정. 하지만이 방법은 작동하지 않습니다. 이전 AvatarImage는 트랜잭션 커밋시 데이터베이스에서 제거되지 않습니다.

아는 사람, 왜 두 번째 코드가 (이전에 "null"로 설정하지 않고 AvatarImage를 대체하는 것) 작동하지 않습니다?

정말 감사드립니다.

고마워요.

답변

12

이것은 Hibernate JIRA 티켓 HHH-5559HHH-6484과 관련이 있습니다. 전반적으로, Hibernate는 현재 관계에서 새로운 값을 제공하기 전에 null 참조를 설정하고 영속 컨텍스트를 플러시 할 것을 요구한다 (HHH-6484의 테스트 케이스 참조). Hibernate가 orphanRemoval에 대해 깨진 구현 (IMHO)을 제공하면서 SQL DELETE 문을 발행하는 경우에만 그렇다.

즉, 버그가 수정 될 때까지 기다리거나 참조를 무효로하고 지속성 컨텍스트를 플러시하는 코드를 작성하거나 orphanRemoval을 지원하는 JPA 프로 바이더를 사용하는 것이 좋습니다 (EclipseLink 2.3.0의 경우) .

1

@OneToMany 관계에서 이것은 최대 절전 모드 JIRA 티켓 HHH-6709과 관련됩니다. 이것들에 투표를하여주의를 기울이십시오.