配置关系存储连接时,我可以从ActivePivot存储执行一对多连接吗?

时间:2012-09-20 14:16:35

标签: activepivot

使用Relational Stores,是否可以从ActivePivot商店到加入商店进行一对多连接。假设我的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商店中的单个记录确实需要分别成为连接到连接存储中每个记录的两个单独记录,但我想这不可能发生除非JOIN_STORE:SOME_TYPE也是AP商店中的字段。

有没有办法从AP商店进行这样的一对多连接?

由于

编辑:要清楚,AP商店中不存在SOME_TYPE(即使名称不同)。我加入了所有常见字段,但加入商店中有多个匹配条目。匹配条目在不常见且在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:

2 个答案:

答案 0 :(得分:3)

关系存储连接不会复制数据。 您不能使用关系存储的连接将一个条目连接到多个条目。 您也不能使用多重生成计算器和关系存储。

根据项目架构和工作流程,您可以考虑在用于提供AP_Store的事务处理程序中添加逻辑。在此事务处理程序中,您可以检索Join_Store的条目,以便复制AP_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

对于您的事务处理程序,您可以注入StoresUniverse以检索Join_Store,然后使用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
    }

答案 1 :(得分:0)

要将您的AP商店加入加入商店,您需要提供一组在两个商店之间通用的字段。这些字段不是每个商店的关键字段。

然后,如果您的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>