Model many to many

From: JR Ruggentaler (JR.Ruggentale..pv.com)
Date: Tue Feb 20 2007 - 01:56:24 EST

  • Next message: Aristedes Maniatis: "Re: entities with calculated fields"

    I am having some trouble modeling many to many relationships with
    Cayenne Modeler:

    Author<<--AuthorBook-->>Book

    I am using MySQL 5.x inoDB. The schema defines the foreign keys but when
    I generate classes with CayenneModeler the output code seems to be
    missing the to many accessor and setter. Shouldn't Modeler generate a
    method in _Author to allow adding Books to Author? Instead Modeler
    generated method addToAuthorBookArray(com.test.app.AuthorBook obj) which
    adds objects from the join table instead. Does reversengineering the
    database with Cayenne modeler work for to many relationships or do I
    need to edit/update the model after "Reengineer Database Schema"? I
    downloaded 2.0.2 and looked in the source for and example of many to
    many but didn't find any example. Is there an example model for many to
    many? Below I appended _Author, the model and the DDL.

    package com.test.app.auto;

    import java.util.List;

    /** Class _Author was generated by Cayenne.
      * It is probably a good idea to avoid changing this class manually,
      * since it may be overwritten next time code is regenerated.
      * If you need to make any customizations, please use subclass.
      */
    public class _Author extends org.apache.cayenne.CayenneDataObject {

        public static final String NAME_PROPERTY = "name";
        public static final String AUTHOR_BOOK_ARRAY_PROPERTY =
    "authorBookArray";

        public static final String AUTHOR_ID_PK_COLUMN = "AUTHOR_ID";

        public void setName(String name) {
            writeProperty("name", name);
        }
        public String getName() {
            return (String)readProperty("name");
        }
        
        
        public void addToAuthorBookArray(com.test.app.AuthorBook obj) {
            addToManyTarget("authorBookArray", obj, true);
        }
        public void removeFromAuthorBookArray(com.test.app.AuthorBook obj) {
            removeToManyTarget("authorBookArray", obj, true);
        }
        public List getAuthorBookArray() {
            return (List)readProperty("authorBookArray");
        }
        
        
    }

    Model
    <?xml version="1.0" encoding="utf-8"?>
    <data-map project-version="2.0">
            <property name="defaultPackage" value="com.test.app"/>
            <db-entity name="author" catalog="test">
                    <db-attribute name="AUTHOR_ID" type="BIGINT"
    isPrimaryKey="true" isMandatory="true" length="10"/>
                    <db-attribute name="NAME" type="VARCHAR"
    isMandatory="true" length="45"/>
            </db-entity>
            <db-entity name="author_book" catalog="test">
                    <db-attribute name="AUTHOR_ID" type="BIGINT"
    isPrimaryKey="true" isMandatory="true" length="10"/>
                    <db-attribute name="BOOK_ID" type="BIGINT"
    isPrimaryKey="true" isMandatory="true" length="10"/>
            </db-entity>
            <db-entity name="book" catalog="test">
                    <db-attribute name="BOOK_ID" type="BIGINT"
    isPrimaryKey="true" isMandatory="true" length="10"/>
                    <db-attribute name="TITLE" type="VARCHAR"
    isMandatory="true" length="45"/>
            </db-entity>
            <obj-entity name="Author" className="com.test.app.Author"
    dbEntityName="author">
                    <obj-attribute name="name" type="java.lang.String"
    db-attribute-path="NAME"/>
            </obj-entity>
            <obj-entity name="AuthorBook"
    className="com.test.app.AuthorBook" dbEntityName="author_book">
            </obj-entity>
            <obj-entity name="Book" className="com.test.app.Book"
    dbEntityName="book">
                    <obj-attribute name="title" type="java.lang.String"
    db-attribute-path="TITLE"/>
            </obj-entity>
            <db-relationship name="authorBookArray" source="author"
    target="author_book" toDependentPK="true" toMany="true">
                    <db-attribute-pair source="AUTHOR_ID"
    target="AUTHOR_ID"/>
            </db-relationship>
            <db-relationship name="toAuthor" source="author_book"
    target="author" toMany="false">
                    <db-attribute-pair source="AUTHOR_ID"
    target="AUTHOR_ID"/>
            </db-relationship>
            <db-relationship name="toBook" source="author_book"
    target="book" toMany="false">
                    <db-attribute-pair source="BOOK_ID" target="BOOK_ID"/>
            </db-relationship>
            <db-relationship name="authorBookArray" source="book"
    target="author_book" toDependentPK="true" toMany="true">
                    <db-attribute-pair source="BOOK_ID" target="BOOK_ID"/>
            </db-relationship>
            <obj-relationship name="authorBookArray" source="Author"
    target="AuthorBook" db-relationship-path="authorBookArray"/>
            <obj-relationship name="toAuthor" source="AuthorBook"
    target="Author" db-relationship-path="toAuthor"/>
            <obj-relationship name="toBook" source="AuthorBook"
    target="Book" db-relationship-path="toBook"/>
            <obj-relationship name="authorBookArray" source="Book"
    target="AuthorBook" db-relationship-path="authorBookArray"/>
    </data-map>

    -- DDL
    CREATE TABLE author (
        AUTHOR_ID int(10) AUTO_INCREMENT NOT NULL,
        NAME varchar(45) NOT NULL,
        PRIMARY KEY(AUTHOR_ID)
    )
    ;
    CREATE UNIQUE INDEX PRIMARY
        ON author(AUTHOR_ID)
    ;

    CREATE TABLE book (
        BOOK_ID int(10) AUTO_INCREMENT NOT NULL,
        TITLE varchar(45) NOT NULL,
        PRIMARY KEY(BOOK_ID)
    )
    ;
    CREATE UNIQUE INDEX PRIMARY
        ON book(BOOK_ID)
    ;

    CREATE TABLE author_book (
        AUTHOR_ID int(10) NOT NULL DEFAULT '0',
        BOOK_ID int(10) NOT NULL,
        PRIMARY KEY(AUTHOR_ID,BOOK_ID)
    )
    ;
    ALTER TABLE author_book
        ADD CONSTRAINT FK_AUTHOR_ID
            FOREIGN KEY(AUTHOR_ID)
            REFERENCES author(AUTHOR_ID)
    ;
    ALTER TABLE author_book
        ADD CONSTRAINT FK_BOOK_ID
            FOREIGN KEY(BOOK_ID)
            REFERENCES book(BOOK_ID)
    ;
    CREATE INDEX FK_BOOK_ID
        ON author_book(BOOK_ID)
    ;
    CREATE UNIQUE INDEX PRIMARY
        ON author_book(AUTHOR_ID, BOOK_ID)
    ;



    This archive was generated by hypermail 2.0.0 : Tue Feb 20 2007 - 03:21:05 EST