-1

私は休止状態を使用するのが初めてです。次のコードを作成して、注文テーブルの最大 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 が必要です。これに関する助けをいただければ幸いです。

4

1 に答える 1

3

Hibernate に ID を生成させてみませんか?

/** The id. */
@Id @GeneratedValue
private Long id;

編集:

休止状態を介して行う限り、複数のプロセスからエントリを作成でき、ID はそれに応じて調整されます。

ただし、休止状態以外でデータベースに挿入すると、問題が発生します。この問題を回避するには、カスタマー ID ジェネレーターを使用できる場合があります。役立つかもしれないこの例を見つけました

Hibernate 以外でデータベースを編集すると、他の問題が発生する可能性があります (特に、たとえば 2 番目のレベルのキャッシュを使用している場合)。

同じ を使用するとSession、第 1 レベルのキャッシュによって引き起こされる問題にも遭遇します。

于 2013-04-04T15:01:56.087 に答える