2016-09-17 3 views
1

は、次のようなクラスを考えてみましょう:今すぐすべてのOneToManyオブジェクトをHibernateで個別に保存する必要があるのはなぜですか?

class Person { 
    @Column(name = "id") 
    Integer id; 

    @Column(name = "name") 
    String name; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner") 
    List <Car> cars; 
} 

class Car { 
    @Column(name = "name") 
    String name; 

    @Column(name = "plate") 
    String plate; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name="id", nullable=false) 
    Person owner; 
} 

、私たちは人のオブジェクトを保存するために来るとき:

Transaction tx = session.beginTransaction(); 
session.save(person); 
for (Car c : person.getCars()) { 
    session.save(c); 
} 
tx.commit(); 

はそれだけでJavaオブジェクトを休止し、それを保存でき手渡しすることはできませんすべて?

+1

はいそうです。カスケードについて読む – aviad

答えて

0

ありがとうございました。それがまさに私が必要としていたものです。 は、今後の参考のために、ここで

class Person { 
    @Column(name = "id") 
    Integer id; 

    @Column(name = "name") 
    String name; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner", orphanRemoval=true) 
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) 
    List <Car> cars; 
} 

class Car { 
    @Column(name = "name") 
    String name; 

    @Column(name = "plate") 
    String plate; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name="id", nullable=false) 
    Person owner; 
} 

唯一の本当の違いは、あなたがリンクされたオブジェクトへの更新が親を保存する前に行われていることを確認しなければならないということです...私が使用したコードです。

つまり、これは機能しません。

Transaction tx = session.beginTransaction(); 
session.save(person); 
for (Car c : person.getCars()) { 
    c.setName(c.getName() + " Update test"); 
} 
tx.commit(); 

しかし、この意志

Transaction tx = session.beginTransaction(); 
for (Car c : person.getCars()) { 
    c.setName(c.getName() + " Update test"); 
} 
session.save(person); 
tx.commit(); 
+0

まず、従業員にマップされる車の依存リストを保存してから、リストリファレンスを使用してPerson!を保存します。 – Pat

+0

これは、テーブルの外部キーを関連付けるために、他のテーブルに既にプライマリキーとして存在するはずです。このように動作します。 – Pat

関連する問題