0

コード

    for (int i=0; i<10; i++) {
        SomeClass anObj = new SomeClass();
        anObj.setField(i);
        anObj.setAnotherField("XYZ"+i);
        session.save(anObj);
    }
    session.getTransaction().commit();

エラーなしで実行されており、10行をテーブルに追加しています。これは私が望むものです。fieldSomeClassの主キーです。

宣言を外側に移動すると:

    SomeClass anObj = new SomeClass();
    for (int i=0; i<10; i++) {
        anObj.setField(i);
        anObj.setAnotherField("XYZ"+i);
        session.save(anObj);
    }
    session.getTransaction().commit();

「SomeClass のインスタンスの識別子が変更されました」というエラーが表示されます。

このことから私が「読んだ」のは、Hibernate がオブジェクトをデータベースに保存した後もオブジェクトのキー フィールドを監視していることです。

オブジェクトを保存したら、コード内のオブジェクトをそのままにしておく必要があると思いますが、これは意味がありません。

その背後に何があるのか​​ 気になります。

save()の属性または別の保存モードでこれを回避する方法はありますか? ループの繰り返しごとにanObjを再宣言したくありません。

4

1 に答える 1

0

を呼び出した後、何が起こっているかとsession.save(anObj)いうと、エンティティ オブジェクトは永続的になりました。つまり、その状態に対するその後の変更は、Hibernate によって検出され、データベースに同期されます (途中で)。

おそらく、新しいデータベース行ごとにデタッチ、更新、マージすることで、新しいオブジェクトを再作成することなく複数の行を保存できますが、これはそもそもORM(オブジェクトリレーショナルマッピング)を使用する目的に反すると思います。

休止状態は、Java プログラマーがデータベース行に格納されたドメイン オブジェクトを 1 つの Java オブジェクトとして (およびその逆に) マップできるように設計されていると思います。

于 2013-07-12T00:13:02.097 に答える