3

HibernateEntityManager3.4.0または3.6.10

MyEntity {
    @Id   // NOT @GeneratedValue
    long cislo;

    @OneToMany( ... )
    List<MyItem> items = new ArrayList();


    public MyEntity( long cislo ) { this.cislo = cislo; }
    ...
}

そして、DAOでは:

MyEntity ent = new MyEntity( id );
ent.addItem( new Item( ... ) );
ent.addItem( new Item( ... ) );
ent = em.merge( ent );

1)エンティティが切り離されていると文句を言うのではmerge()なく、なぜ使用する必要があるのですか?persist()IDを手動で設定したためですか?

2)このマージがコレクションが設定されていないプロキシを返すのはなぜですか?

3)最も重要:完全に初期化されたエンティティをから取得するにはどうすればよいmerge()ですか?メンバーコレクションの
設定以外。 元のオブジェクトを使用することもできますが、それが可能かどうか知りたいです。エンティティを照会することもできますが、それはリソースの浪費のようです。EAGER

4

1 に答える 1

0

1.) なぜここで「Session.merge()」を使用しているのですか? Merge は通常、デタッチされたエンティティ インスタンスを Hibernate/JPA セッションに再アタッチするために使用されます。これは通常、エンティティ インスタンスをセッション外 (たとえば、ビュー レイヤー) で再利用し、これらのインスタンスへの変更をセッションを使用してデータベース。

2.) Hibernate のドキュメントには、「指定されたインスタンスが保存されていない場合は、そのコピーを保存し、新しい永続インスタンスとして返す」と記載されています。あなたの場合、真新しいインスタンスを「マージ」しようとしているので、Hibernate は最初にそれをデータベースに保存し、次にそれを新しいエンティティ インスタンスとして再フェッチします。プロキシが返される理由は、Hibernate がデフォルトでコレクションを遅延ロードするためです。コレクションの getter メソッドが実際のコレクションを返すようにするため。Hibernate はプロキシを作成します。

3.) ここで Session.save() を使用しない理由が知りたいです。

于 2012-08-28T17:42:57.603 に答える