sql >> データベース >  >> RDS >> Oracle

SequenceGeneratorを使用したjavax.persistence.EntityExistsException

    allocationSize パラメータはINCREMENT BYと一致する必要があります シーケンスの値。

    これは、Hibernateが(データベースから)シーケンスから値を取得し、その値をメモリに保持し、次のX個の後続の識別子(X =layoutSize)を生成して、この値をメモリ内で1ずつインクリメントするように機能します。データベースにアクセスします。

    HibernateがX識別子を生成すると、シーケンスから次の値を取得し、新しいX識別子を生成して、その値を1ずつインクリメントします

    簡単な例-次のようにしましょう:

    • @SequenceGenerator( ....allocationSize=5 ...)
    • CREATE SEQUENCE .... INCREMENT BY 1 ...

    上記の場合、Hibernate:

    1. シーケンスから最初の数値を取得します-たとえば、NextVal = 1 そしてそれをメモリに保存します
    2. 次のallocationSize=5を生成します 上記の値を1ずつインクリメントする識別子、つまりId = 1, 2, 3, 4, 5
    3. シーケンスから次の番号を取得します-INCREMENT BY 1のため 、nextVal 2になります
    4. 次のallocationSize=5を生成します 上記の値を1ずつインクリメントする識別子、つまりId = 2, 3, 4, 5, 6

    ご覧のとおり、重複エラーが発生します。

    ここで、このケースを検討してください:

    • @SequenceGenerator( ....allocationSize=5 ...)
    • CREATE SEQUENCE .... INCREMENT BY 5 ...

    この場合、Hibernate:

    1. シーケンスから最初の数値を取得します-たとえば、NextVal = 1 そしてそれをメモリに保存します
    2. 次のallocationSize=5を生成します 上記の値を1ずつインクリメントする識別子、つまりId = 1, 2, 3, 4, 5
    3. シーケンスから次の番号を取得します-INCREMENT BY 5のため 、nextVal 6になります
    4. 次のallocationSize=5を生成します 上記の値を1ずつインクリメントする識別子、つまりId = 6, 7, 8, 9, 10

    この場合、重複エラーはありません。

    最後のケースには、シーケンスがHibernateの外部で使用される場合、シーケンスによってギャップが生成されるという欠点があります。




    1. SQLでタプルのグループを比較する方法

    2. sqlfiddle.com5.5.30とMariaDB5.5.31で異なる結果

    3. オプションのパラメータでpostgresをクエリする方法は?

    4. MySQLのフィールドをインクリメントすることはアトミックですか?