Oracleシーケンスがめちゃくちゃになって、そのために失敗したことがありますか?
質問
私のOracleデータベースにドメインオブジェクトインスタンスを保存するためのシーケンスを使用しています。 データベース内の各テーブルのシーケンスがあります。 たとえば、ユーザーまたはリソースの保存機能を使用する場合は、最初の試行で新しいリソースを作成しましたが、使用されたIDは70でしたか。テーブル内の最大IDが41であるため、シーケンスは適切な次数を表示します。
次回の試してみたすべての挿入はこのエラーで失敗する
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
問題の主な原因を実現しました。 私は以前にSequencePertableAcledialectを使用していました、私はButt Beckwithによる以前の投稿の1つからそれを得ました。 Applicationがテーブルに変換されたドメインクラスと同様に、Applicationが起動しているときに、Appliceは各テーブルの新しいシーケンスを作成します。 Dialectはまた、すべてのテーブルIDシーケンスがそのシーケンスのみを通じて管理されていることを確認し、共通のシーケンスはデータベース内のすべての挿入(デフォルトの戦略です)には使用されません。 コードの再構築中に、私はカスタム方言を削除し、デフォルトの10gの方言を使用していました。
それは問題を引き起こしていたものです!
テーブル関連シーケンスの次の値フィールドの次の数字を見て、リソーステーブルのMAX(ID)のNew Resource_Sequenceの次のval= 42が41です。
洞察のためのたくさんの人たちは、私が本当の原因を思い出すのを助けることができます! カスタム方言についてもっと知る必要がある人のために、 その
他のヒント
シーケンスは数字を浪費することができます、すなわちテーブル内のすべてのレコードは、次にギャップなしで次の後に1つずつであろう。言い換えれば、以前のDBレコードがID= 41であっても70にジャンプしたという事実は問題を示していません。
表の最大IDは41
です
シーケンスはテーブルの最大値を見ずに次のものを取得します。現在のシーケンシャル番号を格納し、次の値を使用します。
実際の番号を確認できます。
select mysequence.currval from dual
.
あなたの問題はGRA.SYS_C0012183
の制約を含むです。これがチェックされているものを見て、これがあなたの主キーの場合はmy_table_pkのようないくつかの読みやすい名前を使うことができます...
はSYS_C0012183
主キー制約ですか?それは、id
列だけを定義していません(これは、シーケンスによって入力された列を想定しています)?
- どのようにしてシーケンスの次の値が42であるとどのように判断しますか?あなたはそのために別のクエリを実行していますか?
- あなたはあなたにギャップのない数字を与えるためのシーケンスを期待していますか?もしそうなら、それはあなたの期待の問題です。シーケンスは明確な値を返しますが、ギャップがないことを保証しません(実際には、データベースがシャットダウンしたり、シーケンスが共有プールから消去されたり、トランザクションがロールバックされたためにギャップが発生することが保証される可能性があります)。
- どのようにシーケンスを使いますか?テーブルにトリガーはありますか?またはシーケンスを使用するようにHibernateが設定されていますか?Hibernateがシーケンスを使用するように設定されている場合は、その構成を投稿してください。