2016-12-03 4 views
0

RECORD_IDは問題がエラーRECORD_IDカウンターの上に内部的 し、次の成功のセーブにをインクリメントということです例外時に自動インクリメントを防ぐ方法は?

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "record_id", unique = true, nullable = false) 
public Integer getRecordId() { 
    return recordId; 
} 

をオートインクリメントされますが、いくつかの操作上のエラー

Session session = HibernateUtil.getSessionFactory().openSession(); 
session.beginTransaction(); 
Score record = new Score(); 
try { 
    session.save(record); 
} catch (ConstraintViolationException e) { ... 

があることができ、エンティティスコアがありますたとえば、69と71は成功操作で書き込みが行われますが、70秒ではエラーが発生しました。

69 1 6 2016-12-03 
71 2 6 2016-12-03 

エラー時にその増分を防ぐ方法はありますか?

答えて

0

が、あなたはどちらか気にしてはいけません。

シーケンスの増分は一方向の操作です。これはパフォーマンスのために行われます。シーケンスのインクリメントは、複数のプロセスが同時に行を挿入する必要があり、インターリーブIDが必要な場合があるため、アトミック操作でなければなりません。

インサートが爆発したり、手作業で一部のIDを噛んだりしたり、多くの理由がある場合には、IDのギャップが予想されます。あなたはそれを絶対に防ぐことはできません。

重要なことに、アプリケーションはギャップを気にする必要はありません。自動インクリメントキーは、値が特に何かに依存してはならない代理キーです。あなたのシステムが連続的なIDを必要とするなら、それはデザインの匂いです。

0

IDENTITYの代わりにSEQUENCE Generationを使用すると、この問題に対処できます。

レコードは、テーブルにレコードが作成されたときにのみインクリメントされます。

関連する問題