Apache Cayenne的多对多关系

时间:2012-03-07 16:16:58

标签: java apache-cayenne

我是Apache Cayenne的新手。

我只有一个实体,名为Product。 该实体与其自身具有多对多关系,即产品可以包含产品,并且可以包含其他产品。

我无法模仿这种与Cayenne的关系.. 我所做的是: 1)我创建了一个名为Composition的表,其中两个字段都是PK和FK。 2)我从Product到Composition创建两个toMany(一个从product.id到Composition.contained_id,一个从product.id到Composition.base_id) 这应该适用于DB 现在我只创建了一个ObjEntity:Product。 但是......我怎样才能创造一个平坦的关系?我正在关注此事:http://cayenne.apache.org/doc/cayennemodeler-flattened-relationships.html但也许是因为它与自身的关系我无法在“目标”组合框中选择实体。

谢谢 弗朗西斯

编辑:如果两个实体不同,也会出现目标复选框问题。 Cayenne Modeler v.3.0.2

1 个答案:

答案 0 :(得分:1)

选择第一个关系时,

“目标”组合为空,只是因为连接表没有ObjEntity。但是如果你继续选择下一个路径组件,“Product”将出现在组合框中。我希望我们重新设计这个UI以获得更好的清晰度,但它现在仍然有用。请参阅下面的DataMap XML示例。我刚用3.0.2 Modeler创建它。

希望这有帮助。

<?xml version="1.0" encoding="utf-8"?>
<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
  project-version="3.0.0.1">
    <db-entity name="composition">
        <db-attribute name="BASE_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
        <db-attribute name="CONTAINED_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
    </db-entity>
    <db-entity name="product">
        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
        <db-attribute name="NAME" type="VARCHAR" length="255"/>
    </db-entity>
    <obj-entity name="Product" dbEntityName="product">
        <obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
    </obj-entity>
    <db-relationship name="base" source="composition" target="product" toMany="false">
        <db-attribute-pair source="BASE_ID" target="ID"/>
    </db-relationship>
    <db-relationship name="contained" source="composition" target="product" toMany="false">
        <db-attribute-pair source="CONTAINED_ID" target="ID"/>
    </db-relationship>
    <db-relationship name="base" source="product" target="composition" toDependentPK="true" toMany="true">
        <db-attribute-pair source="ID" target="BASE_ID"/>
    </db-relationship>
    <db-relationship name="contained" source="product" target="composition" toDependentPK="true" toMany="true">
        <db-attribute-pair source="ID" target="CONTAINED_ID"/>
    </db-relationship>
    <obj-relationship name="base" source="Product" target="Product" deleteRule="Deny" db-relationship-path="contained.base"/>
    <obj-relationship name="contained" source="Product" target="Product" deleteRule="Deny" db-relationship-path="base.contained"/>
</data-map>