3

次のようなクラス A があります。

class A {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     @Column(name = "DBId")
     private Long DBId = null;

     @OneToMany(cascade = CascadeType.ALL)
     @LazyCollection(LazyCollectionOption.FALSE)
     List<B> list;
}

そしてクラスBのような

class B {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     @Column(name = "DBId")
     private Long DBId = null;
}

クラス A の新しいインスタンスを永続化したい場合、2 つのケースが考えられます。1- A 内の B のすべてのインスタンスが新しい場合、単純な session.save(A) で問題ありません。2- A の B のインスタンスの一部またはすべてが古い。Bが重複しないようにAを保存するにはどうすればよいですか。saveOrUpdate は問題を解決しますか? または、A を見るだけで保存または更新の選択を決定するだけで、たとえば、A が新しい場合は Bs の保存も呼び出され、A が古い場合は Bs の更新も呼び出されますか?

さらに、コードに単純な session.save(A) しかなく、冗長な B が生成されないことがわかりました。私が間違っている?これは可能ですか?

よろしく

更新:古い B の場合、古い B のインスタンスがセッションにアタッチされ、DBId が正しく設定されます。

4

1 に答える 1

2

エンティティはセッションよりも長く存続しますか? そうでない場合は、update()またはを使用する必要はありませんsaveOrUpdate()。を呼び出すとsession.save()、Hibernateはエンティティの状態をチェックすることで、insertまたはかどうかを認識します。update状態の詳細については、http: //docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#objectstate-overviewを参照してください。

同じことがカスケードにも当てはまります。操作がコレクションにカスケードされると、Hibernate はコレクション内のエンティティの状態をチェックし、既に状態にある場合は挿入を試みませんPERSISTENT

于 2013-06-04T22:36:43.953 に答える