0

親レコードの前に子レコードを保存するときに発生する例外:

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

4

1 に答える 1