0

Oracle データベースにドメイン オブジェクト インスタンスを保存するためにシーケンスを使用しています。データベース内の各テーブルのシーケンスがあります。たとえば、ユーザーまたはリソースで保存機能を使用すると、最初の試行で新しいリソースが作成されましたが、使用された ID は 70 でしたか? テーブルの最大 ID が 41 であるため、シーケンスは適切な次の番号 - 42 を示しています。新しいリソースを挿入するために id=70 が使用されたのはなぜですか?

また、次の試行から、すべての挿入がこのエラーで失敗します

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into GRARESOURCE (decomm
issioned, disabled, criticality, resourceClass, resourceGroupId, resourceName, ownerId, resourceSegmentId, resourceTypeId, riskSco
re, targetIP, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [GRA.SYS_C0012183]; nested exception is org.hibernate.e
xception.ConstraintViolationException: Could not execute JDBC batch update

これはコードの再構築後に発生しているため、何が問題なのかわかりません...コードを新しいパッケージに移動した場所..

編集:私は原因を見つけました、私の応答を見てください..ありがとうみんな

4

4 に答える 4

1

シーケンスは数字を浪費する可能性があります。つまり、テーブル内のすべてのレコードが必ずしも次から次へとギャップなく表示されるとは限りません。つまり、以前の DB レコードの ID=41 が 70 に跳ね上がったという事実は、問題を示しているわけではありません。

于 2012-03-14T01:23:29.260 に答える
1

テーブルの最大IDは41であるため

シーケンスはテーブルの最大値を確認せず、次の値を取得します。それらは現在の連番を保存し、次の値を使用します。

実際の数は次の方法で確認できます。

select mysequence.currval from dual

あなたの問題はGRA.SYS_C0012183制約にあります。これが何をチェックするかを確認してください。これが主キーである場合は、MY_TABLE_PK などのより読みやすい名前を使用できます...

于 2012-03-14T01:28:04.183 に答える
0

問題の主な原因に気づきました。以前は SequencePerTableOracleDialect を使用していましたが、これは Burt Beckwith による以前の投稿の 1 つから取得しました。ダイアレクトは、ドメイン クラスがテーブルに変換されるのと同様に、アプリケーションの起動時にテーブルごとに新しいシーケンスを作成します。ダイアレクトはまた、すべてのテーブル ID シーケンスがそのシーケンスのみによって管理され、共通のシーケンスがデータベース内のすべての挿入に使用されないようにします (これがデフォルトの戦略です)。コードの再構築中に、カスタムダイアレクトを削除し、デフォルトの 10g 方言。

それが問題の原因でした!

シーケンスの次の値フィールドに関連付けられたテーブルの次の番号が表示されます。ここで、リソース テーブルの max(id) が 41 であるため、resource_sequence の次の値 =42 であることがわかります。

何らかの方法で本当の原因を思い出すのに役立つ洞察をありがとう!カスタム方言について詳しく知りたい方は、こちら

于 2012-03-14T02:03:24.153 に答える
0

SYS_C0012183主キー制約ですか? 定義されているのはid列だけではありませんか(これは、シーケンスによって入力された列であると思います)?

  • シーケンスの次の値が 42 であることをどのように判断しますか? そのために別のクエリを実行していますか?
  • シーケンスがギャップのない数字を与えることを期待していますか? もしそうなら、それはあなたの期待に問題があります。シーケンスは個別の値を返しますが、ギャップがないことを保証するものではありません (実際、データベースがシャットダウンされたか、シーケンスが共有プールから削除されたか、またはトランザクションがロールバックされたために、ギャップが生じることを保証できます)。
  • シーケンスをどのように使用しますか?テーブルにトリガーはありますか?または、シーケンスを使用するように Hibernate が構成されていますか? Hibernate がシーケンスを使用するように構成されている場合は、その構成を投稿します。
于 2012-03-14T01:23:24.073 に答える