2012-05-08 8 views
7
@Entity 
public class Troop { 
    @OneToMany(mappedBy="troop") 
    public Set<Soldier> getSoldiers() { 
    ... 
} 

@Entity 
public class Soldier { 
    @ManyToOne 
    @JoinColumn(name="troop_fk") 
    public Troop getTroop() { 
    ... 
}  

私はこの上の文書に苦しんでいます:Hibernateでの関係所有者の意味は何ですか?

Troop has a bidirectional one to many relationship with Soldier through the troop property. You don't have to (must not) define any physical mapping in the mappedBy side. 

したがって、たとえば次のコード:

Troup t = new Troup(); 
t.getSoldiers().add(soldier); 

を私はちょうどsession.saveOrUpdate(t)を呼び出した場合、私はちょうど呼び出された場合の違いは何だろう session.saveOrUpdate(s)? MappedByはtroupを所有者として定義しますが、具体的にはどういう意味ですか?私は兵士のオブジェクトを保存すると、必ずtroop_fk列が正しく保存されることを期待していますか?そして、私がtroupオブジェクトを保存するだけであれば、兵士の外部キーは必ずカスケード時に正しく更新されますか?私は本当に違いを見ることができません。

答えて

4

所有者は、フラッシュ時にデータベースの外部キーを設定するエンティティです。

コード:

Troup t = new Troup(); 
t.getSoldiers().add(soldier); 
session.SaveOrUpdate(t); 
session.Flush(); 

カスケードなし:

throws references transient instances 

カスケードと所有者と=カスケードと所有者と軍隊

INSERT INTO troops (id, ...) VALUES (1, ...) 
INSERT INTO soldiers (..., troop_fk) VALUES (..., NULL) 
UPDATE soldiers SET troop_fk=1 <- troop sets its key 

=兵士

INSERT INTO troops (id, ...) VALUES (1, ...) 
INSERT INTO soldiers (..., troop_fk) VALUES (..., 1) <- soldier saves the reference 
+0

詳細については、セクション2.2.5.3.1.1を参照してください。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-associationを参照してください。上記の例では、あるエンティティから別のエンティティへの所有権を切り替える方法についての情報があります。 –

+0

カスケードと所有者=部隊、INSERT INTO兵士(...、troop_fk)VALUES(...、NULL)。兵士のテーブルtoop_fkがnullableでない場合、クエリの実行中にthowエラーが冬眠します。開発者はそれを処理しなければなりませんか? –

+0

カラムがヌル可能でない場合は、単純に "カスケーディングとオーナー= – Firo

関連する問題