2017-12-13 87 views
0

私たちは何年も働いているアプリケーションを持っており、同じOracleデータベースも使用しています。しかし、あるホストから別のホストにデータベースを移行しました。一意の制約違反 - デバッグ

DB:今ORACLE

我々は次の例外を取得している突然、

“org.springframework.dao.DataIntegrityViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated; 
SQL [n/a]; constraint [YYY.XXX_LOG_PK]; nested exception is org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated” 

コード:DB内

@SequenceGenerator(name = "TT_SEQUENCE_GENERATOR", sequenceName = "YYY.XXX_LOG_SEQ") 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TT_SEQUENCE_GENERATOR") 
@Column(name = "ID") 
public Long getId() { 
    return this.id; 
} 

シーケンス:

CREATED 07-NOV-17 
LAST_DDL_TIME 07-NOV-17 
SEQUENCE_OWNER TT 
SEQUENCE_NAME YYY.XXX_LOG_SEQ 
MIN_VALUE 1 
MAX_VALUE 999999999999999999999999999 
INCREMENT_BY 1 
CYCLE_FLAG N 
ORDER_FLAG N 
CACHE_SIZE 0 
LAST_NUMBER 75305 

問題: JPAコードでレコードを挿入しようとすると、上記の例外が発生しますが、sequence.nextvalを使用してレコードをDBに挿入しようとすると、例外が発生しません。

とにかく私は例外が何であるかを見つけるためにデバッグできますか?私もshow_sqlを試しました - これで解決策を見つけることができませんでした。コンソールの次のシーケンス番号が表示されません。

ソリューションを知っていれば、私に正しい方向を教えてください。

+0

Oracleデータベースの未加工の挿入でエラーが発生しないということは、この問題をさらに狡猾にします。 Hibernateがシーンの背後で1つ以上のジャンクションテーブルを作成している可能性はありますか?これが実際にエラーが発生している場所ですか? –

+0

私は休止状態を複数回呼び出す機会はないと思っています....しかし、正しい点は、show_sqlを置くことでチェックします。 – abc

答えて

2

自己拡張シーケンスで一意の制約が矛盾する最も一般的なシナリオは、データの移行時にデータの最大値がシーケンス値を超える原因となります。

まずsequanence現在の値照会:

SELECT seqname.CURRVAL FROM dual 

をそしてシーケンスのNEXTVALは、データの現在の最大値を超えていることを確認するためのシーケンス値を変更します。

ALTER SEQUENCE seqname INCREMENT BY XXXXXX; 
SELECT seqname.NEXTVAL FROM dual; 
+0

CURRVALは、同じセッションで以前のNEXTVALコールの最後の値のみを返します。 ALL_SEQUENCES.LAST_NUMBERの実際の値を確認する必要があります。 – APC

0

私たちが直面した問題の解決策を見つけました。

問題はデータベースの問題です。私たちは、移行文書を見直し、ファイルをチェックすることでそれを発見しました。

@エドウィン:ご協力ありがとうございます。あなたの質問は、問題がどこにあるのかを見つけるのにも役立ちました。

移行中に、シーケンスは古いサーバーから新しいサーバーにコピーされませんでした。新しいサーバーにコピーしたとき、すべて正常に動作しました。

ありがとうございました。

関連する問題