親レコードの前に子レコードを保存するときに発生する例外:
GrailsWrappedRuntimeException: ORA-02291:
integrity constraint (GRB.FKF8F6B734389E9766) violated -
parent key not found
コード:
class Child {
Parent parent
static constraints = {
parent nullable: true
}
}
class Parent {
static hasMany = [ children: Child ]
}
def child = new Child()
child.save() // first save of Child
def parent = new Parent()
parent.save()
//session.flush() // the sudden flush
child.parent = parent
child.save()
// here is 'constraint violation' when transaction is committed
例外メッセージで述べられているように、Child
親キーParent
が設定されていますが、どういうわけかキーはその時点で Hibernate によって既存の行として認識されません...
上記は、私のコードで発生しているイベントを簡単に再構成したものです。これらのアクションはコードの異なる場所で実行されることに注意してください (互いに分離するように設計されています)。残念ながら、このような縮小されたコードはうまく機能し、問題を再現しません...また、以前にそのような問題に遭遇したことはありません.親レコードの前に子レコードを保存し、その逆も問題なく実行していました.
コードを修正するには、次の 2 つの方法があります。
- 「最初の保存」のコメント
Child
(保存の順序は重要ですか?!) - またはセッションフラッシュのコメントを外します
私はそれを修正できましたが、保存の順序や突然のフラッシュなどに依存したくありません...信頼できるコードがまだ残っている問題を解決する方法はありますか?
Grails 2.2.0、Hibernate 3.6、Oracle XE