JBO-25030: 行キーYを持つ詳細エンティティXは、その所有エンティティを検出または無効化できません
-
問題摘要
所有する親オブジェクトの識別に必要なコンテキスト情報を指定せずに、タイプ
X
行の新しい子オブジェクト行を作成しようとしました。 子行の作成時に正しい所有親コンテキストを指定する必要があります。そうしないと、作成される新しい子行は「孤立」になります。たとえば、
Activity
という名前の子オブジェクトを持つTroubleTicket
という名前のカスタム・オブジェクトがあるとします。 新規アクティビティを作成しようとする次のスクリプトでは、このエラーが発生します:def activityVO = newView('Activity') // PROBLEM: Attempting to create a new child activity row // ------- without providing context about which owning // TroubleTicket row this activity belongs to. def newActivity = activityVO.createRow()
これにより、スクリプトが新しいアクティビティ行を作成しようとしているため、その新しい行が属するTroubleTicketを認識できるコンテキストを指定せずに、「JBO-25030: 行キーがnullの詳細エンティティ・アクティビティは、その所有エンティティを検出または無効化できません」例外が生成されます。
-
解決方法
新しい子オブジェクト行を作成するときに、適切な親オブジェクト・コンテキストを提供する方法は2つあります。 最初の方法は、新しい子行を追加する所有親行を取得し、親行の子コレクション属性を使用して
createRow()
とinsertRow()
の組合せを実行することです。 たとえば、Id
が100000000272002のTroubleTicket
のコンテキストで新しいActivity
行を作成するには、「IDによるオブジェクトの検索」に示されているヘルパー関数を使用して次を実行できます。 この方法を使用する場合、親行の子コレクションに対して処理を実行しているため、親オブジェクトのコンテキストは暗黙的です。def idParent = 100000000272002 def ttVO = newView('TroubleTicket') def parent = adf.util.findRowByKey(ttVO,idParent) if (parent != null) { // Access the collection of Activity child rows for // this TroubleTicket parent object def activities = parent.ActivityCollection // Use this child collection to create/insert the new row def newActivity = activities.createRow() activities.insertRow(newActivity); // Set other field values of the new activity here... }
使用できる2つ目の方法は、子行の作成時に親
TroubleTicket
行のIDを識別するコンテキストを渡すことです。 これを行うには、次に示すように、createAndInitRow()
という名前の代替関数を使用します。 この場合、親の行を手元に持ったり、親のTroubleTicketビュー・オブジェクトを使用する必要はありません。 子アクティビティ行の作成時に、所有する親行にIDを指定すると十分です。def idParent = 100000000272002 // Create an name/value pairs object to pass the parent id def parentAttrs = new oracle.jbo.NameValuePairs() parentAttrs.setAttribute('Id',idParent) // Use this name/value pairs object to pass the parent // context information while creating the new child row def activityVO = newView('Activity') def newActivity = activityVO.createAndInitRow(parentAttrs) activityVO.insertRow(newActivity); // Set other field values of the new activity here...