2011-03-28 4 views
0

다중 모듈 애플리케이션에서 두 개의 다른 모듈로부터 두 개의 엔티티 클래스가 있습니다. 하나의 엔티티는 다른 엔티티에 단방향 일대일 관계가 있습니다.모듈 애플리케이션에서 JPA/Hibernate 일대일 캐스케이드 제거

주요 기업 "노래는"모듈 노래 코어에서이며는 다음과 같이 정의되어 :

@Entity 
public class Song { 
    @Id(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String name; 
} 

그리고 "SongLyrics"라는 다음 개체 모듈에서이다 "노래 가사"하는 같은 것을 정의 :

@Entity 
public class SongLyrics { 
    @Id(strategy = GenerationType.IDENTITY) 
    private int id; 
    @OneToOne 
    private Song song; 
    @Column(nullable = false, length=1024) 
    private String lyrics; 
} 

SongLyrics 엔티티 또는 최종 응용 프로그램에서 사용할 수 있거나 사용할 수없는 옵션 "노래 가사"모듈에서이기 때문에, 함께있는 관계는 "노래"실체는 단방향입니다.

이제 "노래"엔티티가 삭제 될 때마다 "SongLyrics"엔티티를 제거하고 싶습니다. 그러나 현재 "SongLyrics"엔티티는 "고아"로 남아 있으며 "Song"엔티티 만 삭제됩니다.

통찰력을주십시오. 감사.

답변

3

SongLyrics은 일대일 관계로 하나의 ID를 가질 수 없습니다. 일대일이란 동일한 기본 키를 공유한다는 것을 의미합니다. 데이터베이스에서 일반적인 외래 키를 사용하여 SongLyrics에서 Song을 가리킬 때 이는 다 대일 관계입니다.

Song에서 SongLyrics까지는 관계가 없으므로 최대 절전 모드에서 계단식 연결이 작동하지 않는 것이 문제입니다.

내 마음에 오는 옵션입니다

  • 가 만든 많은 - 투 - 어떤 유형을 분리하고 여전히 폭포에 수 (및 이동) 할 수있는 SongLyricsSong에서 관계.
  • 응용 프로그램에서 일종의 이벤트를 사용하여 무언가가 삭제 될 때 모듈에 알려서 정리할 수 있도록합니다 (거부 할 수도 있음).
  • 데이터베이스 트리거를 사용하여 SongLyrics을 제거하십시오.
+0

작은 수정 :'@ OneToOne'은 '와 같은 foregin 키 기반 일대일 관계를 만듭니다. – axtavt

+0

귀하의 제안에 대해 @Stefan 및 @axtavt에게 감사드립니다. 노래에 FK가 기본 키이기도 ą SongLyrics를 업데이트하겠습니다. @Stefan이 강조 표시된대로 Song에서 SongLyrics와는 아무런 관련이 없습니다. 이는 주로 모듈에 걸쳐 있기 때문입니다. 이것이 바로 hibernate (또는 JPA 제공자)가 "계단식"효과를 전달할 수 없었던 이유입니다. 두 번째 및 세 번째 제안에 대해 Stefan에게 감사드립니다. 이 문제를 처리하기 위해 Spring AOP를 사용하는 것에 대해 숙고하고 있었지만 괜찮은 데이터베이스 트리거를 생성 할 수있는 이식성있는 방법이 있다면 말이다. –