1

search.jspデータベースからレコードを検索して取得するページがあります。このレコードを複製して変更を加え、両方のレコードを保存する必要があります。

元:

 method1(){
  Response response=new Response();
  //To perform DB search
  response=delegate.requestSearch(//some request criteria);
  Types obj1=(Types) response.getBaseEntity();
  Types obj2=obj1;
  obj2.setPromaryKeyObject(//some unique value);
 }

私のDAOでは、メソッドを保存します:

session.save(obj1);
session.save(obj2);
transaction.commit(); // transaction

デバッグ ポイントがトランザクションをコミットすると、更新クエリが 1 つだけ取得されます。しかし、2 つの挿入クエリが必要です。

しかし、これはうまくいきます。これは試みでしたが、これは私がやりたいことではありません。

Types tempObj1 = new Types();    
tempObj1.setValue1(obj1.getValue1();
 // all values of the object should be set
session.save(tempObj1);
Types tempObj1 = new Types();    
tempObj2.setValue1(obj2.getValue1();
 // all values of the object should be set
session.save(tempObj2);
transaction.commit(); // transaction

この場合、2 つの挿入クエリをトリガーします。

私は休止状態に非常に慣れていないので、間違いは休止状態の方法にあると確信しています。JDBC および MySql クエリを使用していた場合、この同じコードは問題なく動作します。

4

3 に答える 3

1

それはすべてIDに関するものです。指定された ID を持つオブジェクトがデータベースに存在する場合、それが更新されます。ID が設定されていない場合は、生成戦略に従って生成され、新しいレコードが挿入されます。場合によっては (構成によって異なります)、id を明示的に設定する必要があります。

MySQL を使用しているので、autoincrement列を ID およびIDENTITY生成戦略として使用していると思います。おそらく行う必要があるのは、更新されたレコードの id をそのままにしnullて、新しいものとして挿入するレコードの id を設定することです。

于 2012-08-10T10:45:36.570 に答える
0

これはobj2 == obj1. してみてくださいobj2 = obj1.clone()

于 2012-08-10T10:51:32.637 に答える
0

save()Hibernate は、 'd'したオブジェクトを内部的に追跡します。このコードで実際に新しいインスタンスを作成したわけではありません

  Types obj1=(Types) response.getBaseEntity();
  Types obj2=obj1;

そのため、休止状態は、データを変更せずに同じオブジェクトを再度保存していると考えているため、当然何もしませんでした。

これを解決するには、次の 2 つの方法があります。

  • データを新しいインスタンスにコピーし、save を再度呼び出します。これは、2 番目のコード フラグメントに少し似ています。
  • merge()を呼び出すたびmerge(something)に挿入が生成されるように、引数をセッションに関連付けないメソッドを使用します。(これはsomething、最初に の ID をクリアし、セッションとの関連付けを解除したことを前提としています。)
于 2012-08-10T10:53:29.170 に答える