Apache Cayenne отношения многие ко многим - PullRequest
0 голосов
/ 07 марта 2012

Я новичок в Apache Cayenne.

У меня есть только одна сущность, которая называется Product. Эта сущность имеет отношения «многие ко многим» с самим собой, то есть продукт может содержать продукты, а также другие продукты.

Я не могу смоделировать эти отношения с Кайенной .. Что я делаю это: 1) Я создаю таблицу с именем Composition, в которой есть два поля: PK и FK. 2) Я создаю два toMany из Product to Composition (один из product.id в Composition.contained_id, а другой из product.id в Composition.base_id) Это должно работать с БД Сейчас я создаю только один ObjEntity: Product. Но .. Как я могу создать сплющенные отношения ?? Я следую за этим: http://cayenne.apache.org/doc/cayennemodeler-flattened-relationships.html но, возможно, потому что это отношения с самим собой, я не могу выбрать сущность в поле со списком "Target" ..

Спасибо Francesco

РЕДАКТИРОВАТЬ: целевой флажок проблема также существует, если два объекта отличаются. Cayenne Modeler v.3.0.2

1 Ответ

1 голос
/ 08 марта 2012

Комбинация "Target" пуста, когда вы выбираете первое отношение, просто потому, что для таблицы объединения нет ObjEntity Но если вы продолжите выбирать следующий компонент пути, в выпадающем списке появится «Продукт». Я бы хотел, чтобы мы переработали этот интерфейс для большей ясности, но он все еще работает. См. Пример XML-файла DataMap ниже. Я только что создал его с 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>
...