8
@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

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

これに関するドキュメントに苦労しています:

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

1 に答える 1

5

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

コード:

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
于 2012-05-14T13:35:03.510 に答える