merge() メソッドの微妙な違い
Hibernate を使用してデータベースに既に格納されているオブジェクトを変更する場合、これを行うための方法もいくつかあります。
1 つ目はmerge()メソッドで、渡されたオブジェクトに基づいてデータベース内の情報を更新します。これにより、SQL UPDATE クエリが呼び出されます。例:
User user = new User();
user.setName("Kolyan");
session.save(user);
session.evict(user); // detach the object from the session
user.setName("Masha");
User user2 = (User) session.merge(user);
ここには重要なニュアンスがいくつかあります。
まず、merge()メソッドは結果、つまり更新されたオブジェクトを返します。このオブジェクトは Persist 状態を持ち、セッション オブジェクトにアタッチされます。merge()メソッドに渡されるオブジェクトは変更されません。
user と user2 の間に違いがないように見えるかもしれませんが、そうではありません。POJO オブジェクトをmerge()メソッドに渡すことができ、その結果、メソッドは (Hibernate の設定に応じて) プロキシを返すことができます。したがって、merge()メソッドは渡されたオブジェクトを変更しないことに注意してください。
次に、 merge()に渡されたオブジェクトがTransient ステータスを持つ (ID がない) 場合、データベース内にそのオブジェクトに対して別の行が作成されます。つまり、 persist()コマンドが実行されます。
第三に、すでにセッションにアタッチされているオブジェクト (Persist ステータスを持つ) がmerge()メソッドに渡された場合、何も起こりません。メソッドは単に同じオブジェクトを返すだけです。なぜ?それは、トランザクションがコミットされると、とにかくデータがデータベースに書き込まれるからです。
User user = new User();
user.setName("Kolyan");
session.save(user);
user.setName("Masha"); //change the object attached to the session
session.close(); //all changed objects will be written to the database
オブジェクトを変更した後、毎回オブジェクトを保存する必要はありません。このオブジェクトが Persist ステータスにある場合、Hibernate はすべてを自動的に実行します。「ベースに接続されている」オブジェクトを変更すると、そのすべての変更がベースに書き込まれます。
update() メソッドの微妙な違い
Hibernate には、 save()メソッドと同様に、以前のバージョンから継承されたupdate()メソッドもあります。この方法では、既に保存されているオブジェクトのデータのみを更新できます。これにより、SQL UPDATE クエリが呼び出されます。例:
User user = new User();
user.setName("Kolyan");
session.save(user);
session.evict(user); // detach the object from the session
user.setName("Masha");
session.update(user);
このメソッドは何も返さず、既存のオブジェクトを変更しません。
新しいオブジェクトに対してこのメソッドを呼び出すと、単純に例外がスローされます。
User user = new User();
user.setName("Kolyan");
session.update(user); //an exception will be thrown here
saveOrUpdate() メソッド
JPA が登場する前は、 persist()メソッドの機能はsaveOrUpdate()メソッドによって実行されていました。彼の仕事は、データベース内の既存のオブジェクトに関する情報を更新し、存在しない場合は作成することでした。これは、ほとんどの場合、save() メソッドとupdate()メソッドの代わりに使用されます。
update()メソッドとは異なり、渡されたオブジェクトを変更できます。たとえば、データベースに保存するときに割り当てられた ID に設定します。例:
User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user); //object will be written to the database
使い方:
- 渡されたオブジェクトに ID がある場合、UPDATE SQL メソッドが呼び出されます。
- 渡されたオブジェクトの ID が設定されていない場合は、INSERT SQL メソッドが呼び出されます。
GO TO FULL VERSION