2015-01-18 2 views
1

나는 두 엔티티 클래스가 있습니다최대 절전 모드 : 일대일 관계에서 아이를 유지하면서 부모/소유자를 삭제

: 그들은 다음과 같은 주석이 코드를 사용하여 일대일 관계 UserConfirmation 및 사용자 있습니다 학부모/소유자 엔티티 (UserConfirmation) :

@OneToOne(mappedBy = "userConfirmation", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private User user; 

아동 엔티티 (사용자) :

@OneToOne 
@JoinColumn(name = "user_confirm_id") 
@JsonBackReference 
private UserConfirmation userConfirmation; 
,536,

현재 Cascade.ALL으로 UserConfirmation을 삭제하면 관련 사용자도 삭제됩니다. 원하지 않습니다. UserConfirmation을 삭제 한 후 사용자를 유지하고 싶습니다.

  1. 이 UserConfirmation 삭제하기 전에 null로 사용자 설정 :

    나는 다음 시도했다 userConfirmation.setUser(null); 그러나 이것은

  2. 캐스케이드에 Cascade.REMOVE 거의 모든 시도는 NullPointerException을 제공, 그러나 아무도 작동하지 않습니다.

당신의 도움은 언제나처럼 감사합니다 :)

답변

3

당신은 부모를 삭제할 수 없습니다 모두 제거하지 않고 하위 쪽 상위 외부 키 연관

예에서 UserConfirmation은 부모이고 User은 자식이라고 말하지만 올바르지 않습니다.

부모 쪽은 다른 쪽 존재와 독립적 인 쪽입니다. 귀하의 경우 User부모이어야하고 UserConfirmation어린이이어야합니다.

그래서, User가 있습니다

@OneToOne 
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL) 
private UserConfirmation userConfirmation; 

그것은 부모 아이들에게 폭포 entity state transitions입니다.

그리고 UserConfirmation는 자식, 아직 소유자 측의 다음 User 그대로를 유지하면서

@OneToOne 
@JoinColumn(name = "user_id") 
@JsonBackReference 
private User user; 

지금 당신이 UserConfirmation을 삭제할 수 있습니다.

+0

감사합니다,이 작품은 나를 위해! – TonyGW

0

당신은 잘못된 측면에 폭포를 사용했다. OneToOne.cascadejavadoc 가입일

:

(선택) 연관의 대상 에 종속되어야하는 동작.

JPA에서는 SQL과는 반대쪽에 계단식 작업을 정의합니다.

코드는 실제로 같아야합니다

학부모/소유자 엔티티 (UserConfirmation) :

@OneToOne(mappedBy = "userConfirmation") 
@JsonManagedReference 
private User user; 

아동 엔티티 (사용자) :

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "user_confirm_id") 
@JsonBackReference 
private UserConfirmation userConfirmation; 
+0

어떻게 연결 대상을 정의합니까? 그것은 양방향입니다 – TonyGW

+0

대상은 주석을 넣는 위치에 따라 다릅니다. 'userConfirmation' 필드에'User' 클래스를 넣으면'UserConfirmation'을 가리 킵니다. 따라서 'UserConfirmation'의 인스턴스는 연결의 대상으로 간주됩니다. – NiematojakTomasz