私は休止状態を使用するのが初めてです。次のコードを作成して、注文テーブルの最大 ID を取得しました。
public int getOrderMaxUID() {
Session session = sessionFactory.getCurrentSession();
String query = "SELECT max(o.UID) FROM Order o";
List list = session.createQuery(query).list();
int maxOrderUID = ((Integer) list.get(0)).intValue();
return maxOrderUID;
}
新しいレコードをテーブルに追加する前に、コントローラーでこのメソッドを呼び出します。
orderService.getOrderMaxUID();
orderService.add(o);
問題:レコードは、他のプロセスによっても Order テーブルに追加されます。したがって、PK の重複の問題を回避するために、レコードを挿入する前に注文テーブルから最大 ID を取得します。しかし、他のプロセスがレコードを追加すると、まだ次のエラーが発生します
2013-04-04 09:27:24,841 WARN ["ajp-bio-8009"-exec-2] org.hibernate.util.JDBCExceptionReporter - SQL Error: 2627, SQLState: S1000
2013-04-04 09:27:24,841 ERROR ["ajp-bio-8009"-exec-2] org.hibernate.util.JDBCExceptionReporter - Violation of PRIMARY KEY constraint 'PK_Order'. Cannot insert duplicate key in object 'Order'. The duplicate key value is (1001508).
と
org.springframework.dao.DuplicateKeyException: Hibernate flushing: could not insert:
getMaxOrderId() メソッドによって取得された ID をメモリに格納し、新しいレコードを追加するときと同じように次の番号を使用するように hibernate が必要です。これに関する助けをいただければ幸いです。