2014-12-21 2 views
0

나는 이탈리아어이고 나는 나의 영어에 대해 사과한다.최대 절전 모드 : 나는 아이들을 삭제하고 싶지 않다

내 Db에서 상위 및 하위 테이블을 두 개의 POJO 클래스가 있습니다.

학부모 Persona.java

@Id @GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "nome", length = 30, nullable = false) 
private String nome; 

@Column(name = "cognome", length = 30, nullable = false) 
private String cognome; 

@Column(name = "eta") 
private int eta; 

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH}, mappedBy = "persona", orphanRemoval = false) 
@Column(nullable = true) 
private List<Telefono> numeriDiTelefono; 

// Others getters and setters 

어린이. Telefono.java

@Id 
@Column(name = "numero_telefono") 
private String numeroDiTelefono; 

@Column(name = "tipo") 
private String tipo; 


@ManyToOne(cascade = {CascadeType.REMOVE, CascadeType.PERSIST }) 
@JoinColumn(name = "persona_id", nullable = true) 
private Persona persona; 

// Others getters and setters 

나는 데이터베이스에 이러한 클래스를 매핑에 대한 주석을 사용했다.

데이터베이스에서 페르소나를 삭제하려고 할 때 해당 페르소나와 연결된 Telefono를 최대 절전 모드로 만들면 원치 않을 것입니다. 나는 자식 참조가 Telefono 테이블의 persona_id 필드에 null 값을 가지고 있는데 그 결과를 얻는 방법을 알고 싶습니다. 어떤 특수 효과를 사용해야합니까? 모두에게 감사드립니다.

+2

@ManyToOne의 매핑에서 CascadeType.REMOVE를 제거하면 자식을 삭제하지 않습니다. 너 그거 해봤 니? –

+0

답변 주셔서 감사합니다 ... 예,이 경우 시도하지만이 경우에는 아무 것도 삭제되지 않습니다. – skytron87

답변

3

JPA는 마법이 아닙니다.

@Andy Dufresne이 제안 했으므로 CascadeType.REMOVE 주석을 제거하십시오. 그런 다음 TelefonoPersonanull으로 설정하고 Persona을 영속 컨텍스트에서 제거하기 전에 PersonaTelefono 컬렉션을 지워야합니다. 따라서 모든 연결을 제거해야합니다.

@PreRemove 주석과 결합 할 수도 있습니다.

+0

Persona를 null로 설정하고 데이터베이스에서 레코드를 제거하기 전에 CascaType을 제거하십시오. 레코드가 업데이트되었지만 삭제되지 않았습니다. ... – skytron87

+0

어떤 레코드? 이 방법으로 Telefono를 업데이트하고 Persona를 제거해야합니다. 양쪽에서 협회를 제거해야합니다. –

+0

해결되었습니다. 나는 협회의 자식 측면을 null로 설정하고 dabatase에서 엔티티를 제거합니다. 괜찮습니다. 모두에게 감사 드려요. – skytron87