2016-08-08 1 views
0

엔티티가 다른 엔티티와 일대 다 관계를 가지고 있고 다른 엔티티가 다른 엔티티와 일대일 관계를 가지고있는 편리한 관계를 설정했습니다 . 따라서 LISTING에는 LISTING_LINE_ITEMS이 (가) 많이 있으며 LISTING_LINE_ITEMS에는 SERVICE_PERIOD이 (가) 있지만 SERVICE_PERIOD에는 LISTING_LINE_ITEMS이 (가) 많이 있습니다.JPA Inverse Join with OneToMany 주어진 식별자를 가진 둘 이상의 행

LISTING

@OneToMany 
@JoinTable (name = "LISTING_LINE_ITEM", joinColumns = @JoinColumn (name = "listing_id"), inverseJoinColumns = @JoinColumn (name = "service_period_id")) 
Set<ServicePeriod>      servicePeriods; 

LISTING_LINE_ITEM

@ManyToOne (fetch = FetchType.EAGER) 
@JoinColumn (name = "listing_id", nullable = false) 
Listing     listing; 

@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) 
@JoinColumn (name = "service_period_id") 
ServicePeriod    servicePeriod; 

SERVICE_PERIOD

@ManyToOne 
@JoinTable (name = "LISTING_LINE_ITEM", joinColumns = @JoinColumn (name = "service_period_id"), inverseJoinColumns = @JoinColumn (name = "listing_id")) 
Listing    listing; 

분명한 목표는 할 수있을 것입니다 다음과 같이 내가 JPA의 @JoinTable을 사용하여이 관계를 설명하기 위해 시도에 대한 ServicePeriod의 목록을 쉽게 얻을 수 있습니다.또는 에 대한 단일 Listing 현재 방식이는 내가 예외를 받고 있어요 설정 :

org.hibernate.HibernateException: More than one row with the given identifier was found: 361951, for class: com.gonfind.entity.ServicePeriod 

나는 목록이 같은 ServicePeriod를 참조 ListingLineItems을 가지고 있기 때문에 이것은 믿습니다. 나는 내가 한 일을 성취 할 수있는 방법이 있다고 확신하지만 그것이 무엇인지는 모른다.

+1

많은 광고 항목에는 동일한 서비스 기간을 사용할 수 있지만 광고 항목을 통한 목록에서 서비스 기간으로의 간접 관계는 다 대다가 아닌 일대 다로 모델링하려고합니다. 여기에 추가 제약 조건이 있다고 추리하는 것이 맞습니까? 여러 광고 항목은 모두 동일한 서비스 기간과 연결될 수 있습니다 * 모든 항목이 동일한 목록과 연결되어 있으면 *? –

+0

@JohnBollinger 예, 맞습니다. – lmerry213

+0

모든 광고 항목에 서비스 기간이 있습니까, 아니면 (null) 서비스 기간이없는 광고 항목이있을 수 있습니까? –

답변

1

거기에 몇 가지 문제가있는 것으로 보입니다. 기술/JPA 측면에서 :

  • 당신은 조인 테이블로와 엔티티 테이블로 LISTING_LINE_ITEM 모두를 사용할 수 없습니다. 여기에는 몇 가지 이유가 있지만 주된 이유는 JPA를 혼동 할 것입니다. JPA는 두 가지 목적을 위해 서로 다른 호환되지 않는 방식으로 테이블을 사용하려고 시도합니다.

  • JPA에서 양방향 관계는 정확히 한쪽이 소유합니다. 상대방은 소유 관계를 참조하기 위해 관계 주석의 mappedBy 속성을 사용합니다.

그러나 데이터 디자인 문제도 있습니다. 광고 항목 서비스 기간이 별도로 같은 목록과 연결된 그 중 하나에 제한 될 귀하의 제약 구성 중 하나

  • 키가 아닌 필드 간의 함수 적 종속성, 목록 ID가 광고 항목을 키의 일부가 아닌 경우 , 그렇지 않으면

  • 키의 하위 집합에 대한 함수 종속성.

첫 번째 경우 데이터가 세 번째 정규 형식이 아닙니다. 두 번째 경우에는 두 번째 정규 형식으로도 실패합니다. JPA로 이것을 모델링 할 때 문제가되는 부분 중 하나는 낮은 수준의 정규화 때문입니다.

데이터를 올바르게 표준화하면 여러 수준에서 작업을 훨씬 쉽게 처리 할 수 ​​있습니다. 그렇게하려면 업체 정보와 광고 항목 간의 직접 연결을 제거하고 대신 서비스 기간을 통해 연결해야합니다.많은 한 - ->ServicePeriod < - 한 많은에 -

Listing <을 물론>LineItem

, 응용 프로그램의 구조에 영향을 미칠 것이지만, 그건 : 그런 것 장기간의 개발 및 유지 관리 작업에 성공할 가능성이 높으며, 응용 프로그램이 데이터의 자연스러운 구조와 일직선이되도록하기 위해 유용성조차 얻을 수 있습니다. 원하는 경우 Listing 엔터티에 메서드를 넣어 ListingLineItem을 어느 정도 관리 할 수 ​​있도록 허용하고 Listing에 직접 속하게하고 인 경우으로 관리 할 수 ​​있습니다.

데이터 구성은 다음과 같이 보일 것이다 :

목록을

@OneToMany(mappedBy = "listing", 
     fetch = FetchType.EAGER, 
     cascade = CascadeType.PERSIST) 
Set<ServicePeriod> servicePeriods; 

SERVICE_PERIOD

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "listing_id") 
Listing listing; 

@OneToMany(mappedBy = "servicePeriod", 
     fetch = FetchType.EAGER, 
     cascade = CascadeType.PERSIST) 
Set<ListingLineItem> lineItems; 

LISTING_LINE_ITEM

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "service_period_id") 
ServicePeriod servicePeriod; 

데이터를 어느 정도 재구성 할 수 없다면입니다. 그러면 JPA에 완전히 설명 할 수없는 제리 리깅 (jerry-rigging) 문제가 있습니다. Listing < ->ServicePeriod에 대한 별도의 조인 테이블, 항목에 대한 엔티티 테이블의 해당 테이블에 대한 비 JPA FK 제약 조건, 물론 다양한 양방향 관계에 대한 적절한 형식을 상상하고 있습니다.

+0

감사합니다. 대단히 도움이되었습니다. 이 스키마는 설계하지 않았고 데이터 디자인과 일반 형식에 정통하지는 않지만이 애플리케이션은 아직 생산되지 않았으며 스키마 리팩토링은 아마도 올바른 결정이라고 생각합니다. 나는 약간의 독서를 할 것이고 아마도 마지막 해결책을 게시 할 것입니다. – lmerry213