2011-10-27 11 views
1

1to0.1(ゼロまたは1)の関係を設定しようとしていますが、問題が発生しています。Hibernate JPA注釈1〜0..1の関係

私の前提は、@ OneToOneではなく@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; 
} 

上記のコードのようなJavaクラスとして

ITEM { 
    ID 
    RELATED_ITEM_ID 
} 

INVOICE { 
    ID 
} 
CATALOGUE { 
    ID 
} 

Reprsentedを達成したい基本的なテーブル構造であるスタンドアロン

「子供」をロードする必要はありませんhibernateに登録されている請求書またはカタログのみが必要なテーブルを作成し、完全に動作します。しかし、できるだけ早く私が持っているように請求書と登録されたカタログの両方が、Hibernateは

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

答えて

0

私は一種の、これは私が欲しいどのように動作させるために浮気終わりました。私は理想的にはそのような階層を欲しがっていませんが、私はこれを稼働させる必要があり、これは休止状態を回避するという妥協であると私は感じています。私はおそらく私の例として、アドレスを使用していたはずの次

@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

のようなJavaクラスとして

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

Reprsented、アドレス記憶は複雑です。外国人を住所に預けておくことは、あなたを道路に襲わせる共通の罠です。元の投稿を更新しました。 – kabal