2011-09-16 18 views
1

JPAマッピングの質問があります。ジョイント可能なJPAマッピング1対多の問題

私たちは、2つのエンティティ(SaleとPig)の間に1対多数の関係を持っています。このメッセージの終わりには、クラスがilustrateするためのクラスが続きます。

'Sale'は、システム内の多くの他のものと同様に、 'Pig'のイベントです( 'Inspection'は別の例です)。 しかし、「売り」は「豚」と一対一の関係を持つ唯一のイベントで、他のイベントは一対一の関係にあります。

したがって、「Pig」のすべてのイベントをマップするには、「PigEvent」エンティティを使用します。 ユーザーが 'Pig'をシステムに挿入すると同時に、 'PigEvent'オブジェクトを保存(挿入)します。

このエンティティ( 'PigEvent')は、Sale.getPigs()マッピングの '結合可能'のように使用します。 - 新しい 'Sale'が挿入されると、Hibernateは 'Sale'内のすべての 'Pig'に対して新しい 'PigEvent'を挿入しようとします (PigEventはすでに複製されています )が存在する - 新しい「販売」が削除されたとき、私たちはこれがあることを理解し

(これをやって、我々は他のイベント関係のデータを失う)「販売」 内のすべての「豚」の削除「PigEvent」を休止この種のマッピング(ジョイント可能な1対多)の通常の動作 JPA/HibernateがSales.getPigs()(SELECTのもの)、 を読み込むだけで、 'Sale'のINSERT、UPDATE、DELETE操作では、そのマッピング(Sale。ブタ())。

Hibernate 3.6.2を使用します。

ありがとうございます。

@Entity 
public class Pig extends Persistente implements Serializable {} 

@Entity 
public class PigEvent extends Persistente { 
@OneToOne 
@JoinColumn(name="idpig") 
private Pig pig; 

@OneToOne 
@JoinColumn(name="idapproval") 
private Inspection approval 

@OneToOne 
@JoinColumn(name="idsale") 
private Sale sale; 
} 


@Entity 
public class Inspection extends Persistente{ 
     @OneToOne 
     @JoinColumn(name="idSuino") 
     private Pig pig; 
} 


@Entity 
public class Sale extends Persistente{ 
@MOneToMany 
@JoinTable(name="e33PigEvent",[email protected](columnNames="idpig"), 
     joinColumns={@JoinColumn(name="idsale",insertable=false,updatable=false)}, 
     inverseJoinColumns={@JoinColumn(name="idpig",insertable=false,updatable=false)}) 
public Set<Pig> getPigs() {} 
} 

Table Structure: 
CREATE TABLE `e33Pig` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) 


CREATE TABLE `e33PigEvent` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `idPig` int(11) NOT NULL, 
    `idInspection` int(11) DEFAULT NULL, 
    `idSale` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `idPig` (`idPig`), 
    CONSTRAINT `fk_e33eventossuino_e33aprovacao1` FOREIGN KEY (`idInspection`) REFERENCES `e33Inspection` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `fk_e33eventossuino_e33suino1` FOREIGN KEY (`idPig`) REFERENCES `e33Pig` (`id`), 
    CONSTRAINT `fk_e33eventossuino_e33venda1` FOREIGN KEY (`idSale`) REFERENCES `e33Sale` (`id`) ON DELETE SET NULL ON UPDATE CASCADE 
); 

CREATE TABLE `e33Sale` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE e33Inspection (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `idsuino` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_e33Inspection_e33suino1` FOREIGN KEY (`idPig`) REFERENCES `e33Pig` (`id`) 
) ; 
+0

したがって、PigEventエンティティをマッピングし、ManyToMany関連付けをマッピングするためのe33PigEventテーブルはありますか? OneToMany関連について、なぜManyToManyを使ってマッピングしているのですか? –

+0

こんにちはJB、コード例で間違っていた... @OneToManyです。ありがとう – Rodrigo

+0

あなたは最初の質問に答えませんでした。これらのエンティティはすべてどのテーブルにマップされていますか? –

答えて

0

あなたは、エンティティ(PigEvent)との関連(OneToMany協会)をマッピングするために同じテーブル(e33PigEvent)を使用することはできません。テーブルがエンティティにマッピングされている場合、あなたはもう販売と豚の間にOneToManyの関連を持っていない:あなたはまた、e33PigEventの外部キーによってマップSalePigEvent間OneToMany、およびPigEventPigOneToOneを持っていますe33PigEventの外部キーによってマップされています。

JoinTableを使用してOneToManyをマッピングすると、コレクションからPigを追加または削除するたびに、Hibernateはこのテーブル自体の挿入と削除を処理します。結合テーブルに追加の列があるので、PigEventインスタンスを自分で作成し、これらのインスタンスを販売イベントのコレクションに追加する必要があります。

+0

JB Nizet、 アンサーに感謝します。 SaleとPigEventに関する問題は、PigEventをロードする余分なジョインに起因するオーバーヘッドである他のイベントです。だから、私たちはあなたが提案したことをするか、Sales.pigs @Transientを残すことができますか? – Rodrigo

+0

はい。それは@Transientでなければならず、すべてのブタのイベントを反復処理し、各ブタを返されたセットに追加することによって、動的に構築されたブタのセットを返すべきです。しかしこれは普通のJavaコードです.Hibernateには何も関係ありません。 –

関連する問題