3

リレーショナルストアを使用して、ActivePivotストアから参加ストアへの1対多の参加を行うことは可能ですか。ActivePivotストアがSOME_IDの別のストアに参加しているが、他のストアのキーはSOME_ID、SOME_TYPEであるとします。次に、次のことが可能です。

AP_STORE SOME_ID | JOIN_STORE SOME_ID | JOIN_STORE SOME_TYPE
------------------------------------------------------------
      1          |      1             | TYPE1
      1          |      1             | TYPE2

ただし、結合を試みると、結合ストアに一意のエントリがないため、次のエラーが発生します。

Caused by: com.quartetfs.fwk.QuartetRuntimeException: Impossible to find exactly 1 entry from store with key: Key 

APストアに1つのレコードがあり、実際にはそれぞれ結合ストアの各レコードに結合する2つの別個のレコードになる必要があるため、問題がある理由はわかりますが、JOIN_STOREがないと発生しないと思います。 SOME_TYPEは、APストアのフィールドでもあります。

APストアからこのような1対多の参加を実現する方法はありますか?

ありがとう

編集:明確にするために、SOME_TYPEはAPストアに存在しません(別の名前でも)。すべての共通フィールドに参加しましたが、参加ストアに一致するエントリが複数あります。一致するエントリは、一般的ではなく、APストアに存在しないフィールドで異なります。

APストアに存在しない外部キーを(別の名前でも)追加しようとすると、次のようになります。

Caused by: com.quartetfs.fwk.QuartetRuntimeException: com.quartetfs.fwk.AgentException: On join 'AP_STORE=>JOIN_STORE' the store 'AP_STORE' does not contain the foreign key 'FIELD_ONLY_IN_JOIN_STORE' in its fields:
4

2 に答える 2

3

リレーショナルストア結合はデータを複製しません。リレーショナルストアの結合を使用して、1つのエントリを複数のエントリに結合することはできません。リレーショナルストアでも複数生成計算機を使用することはできません。

プロジェクトのアーキテクチャとワークフローに応じて、AP_Storeのフィードに使用されるトランザクションハンドラーにロジックを追加することを検討できます。このトランザクションハンドラーでは、AP_Storeのエントリを複製するために、Join_Storeのエントリを取得できます。

最初に、重複を区別するために使用される新しいフィールドを追加して、AP_Storeキーを変更する必要があります。

    AP_STORE SOME_ID | AP_STORE SOME_DUPLICATE_ID |JOIN_STORE SOME_ID | JOIN_STORE SOME_TYPE
    -----------------------------------------------------------------------------------------        
          1          |            1               |         1         |       TYPE1
          1          |            2               |         1         |       TYPE2

トランザクションハンドラーの場合、Join_Storeを取得するためにStoresUniverseを挿入し、Join_StoreでSOME_ID値を使用して検索を実行し、作成する必要のある重複の数を取得できます。

    IRelationalStore joinStore = storeUniverse.get("Join_Store");
    List<IRelationalEntry> joinEntries = joinStore.search("SOME_ID",apStoreObject.get("SOME_ID"));
    for(int i = 0; i < joinEntries.size(); i++) {
       // Clone apStoreObject, add a SOME_DUPLICATE_ID value and add it to the list of objects to add in your AP_Store
    }
于 2012-09-21T08:53:15.323 に答える
0

APストアをjoiningStoreに参加させるには、2つのストア間で共通の一連のフィールドを指定する必要があります。これらのフィールドが各ストアのキーフィールドであるような制約はありません。

次に、APストアにSOME_TYPEを表すフィールドがある場合は、それを外部キーとして追加するだけです。

<property name="joins">
    <list>
        <bean class="com.quartetfs.tech.store.description.impl.JoinDescription">
             <property name="targetStoreName" value="JoiningStore" /> 
             <property name="foreignKeys" value="SOME_TYPE" /> 
        </bean>
    </list>
</property>

結合ストアと結合ストアでフィールドの名前が異なる場合は、マップを使用して、結合ストアの外部キーと結合フィールドの関連フィールドとの関係を記述することができます。

<property name="joins">
    <list>
        <bean class="com.quartetfs.tech.store.description.impl.JoinDescription">
             <property name="targetStoreName" value="JoiningStore" /> 
             <property name="foreignKeyMap" >
                 <map>
                      <entry key="AP_SOME_TYPE" value="SOME_TYPE" />
                 </map>
             </property>
        </bean>
    </list>
</property>
于 2012-09-21T06:55:48.147 に答える