2011-10-27 5 views
1

1to0.1.1 (0 또는 1) 관계를 설정하려고하는데 문제가 발생합니다.Hibernate JPA 주석 1 - 0..1 관계

내 가정은 @OneToMne이 아닌 @OneToMany를 사용하는 것입니다.

기본적으로 내 "하위"테이블에 "부모"(나는 매우 느슨하게 사용합니다)에 대한 외래 키를 보유하고 싶습니다. 나는 독립 "어린이"를로드 할 필요가 없습니다

나는 경우에, 나는 다음과 같은

class Item { 
... 
} 

class Invoice { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<Item> items; 
} 

class Catalogue { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<Item> items; 
} 

위의 코드처럼

ITEM { 
    ID 
    RELATED_ITEM_ID 
} 

INVOICE { 
    ID 
} 
CATALOGUE { 
    ID 
} 

Reprsented Java와 같은 클래스를 달성 할 기본 테이블 구조 hibernate에 등록 된 Invoice 또는 Catalog만이 원하는대로 테이블을 생성하고 완벽하게 작동합니다. 그러나, 곧 내가 가지고있는 송장 등록 카탈로그 모두, 최대 절전 모드는

org.hibernate.MappingException: Duplicate property mapping of _itemsBackref found in package.name.Item 

답변

0

나는 종류의 내가 방법을 작동하도록하는 부정 행위 끝났다. 나는 그런 식으로 hierachy를 원한다고 이상적으로 생각하지는 않는다. 그러나 나는 이것이 작동하도록해야한다. 그리고 나는 이것이 최대 절전 모드에서 일하는 타협이라고 느낀다. 아마 내 예를 들어 주소를 사용하고 야해 다음

@Entity 
@Table(name="RECIPIENTS") 
abstract class Item { 
    ... 
} 

@Entity 
    public class InvoiceItem extends Item { 
} 

@Entity 
    public class CatalogueItem extends Item { 
} 


class Invoice { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<InvoiceItem> items; 
} 

class Catalogue { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<CatalogueItem> items; 
} 
0

나는 그것이 최대 절전 모드 (적어도 한 Customer로하고 Recepient 돈 '이 스키마를 매핑 할 수 생각하지 않습니다 나에게 오류가 발생합니다 동일한 엔티티를 확장).

대신 다음과 같은 스키마를 사용하는 것이 훨씬 쉬울 것

는 :

ADDRESSES { 
    ID 
} 

CUSTOMER { 
    ID 
    ADDRESS_ID 
} 
RECIPIENT { 
    ID 
    ADDRESS_ID 
} 

class Customer { 
    @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="ADDRESS_ID") 
    Address address; 
} 

class Recipient { 
    @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="ADDRESS_ID") 
    Address address; 
} 
+0

같은

ITEM { ID RELATED_ITEM_ID DTYPE } INVOICE { ID } CATALOGUE { ID } 

Reprsented Java와 같은 클래스는, 주소 저장이 복잡하다. 해외에 주소를 저장하는 것은 일반적인 길입니다. 원래 게시물을 업데이트했습니다. – kabal