Re: [question]: problems with n:m mappings(flattened-relationships).

From: Laszlo Spoor (lspoor_cayenn..otmail.com)
Date: Thu Feb 27 2003 - 15:04:47 EST

  • Next message: Craig Miskell: "Re: [question]: problems with n:m mappings(flattened-relationships)."

    Hi Craig!

    I got it working! You were right. I forget to set the primary key in the
    intermediate/intersection table.

    Thanks for your support :-).

    Best regards, Laszlo Spoor

    >From: Craig Miskell <cmiskel..lbatross.co.nz>
    >To: cayenne-use..bjectstyle.org
    >Subject: Re: [question]: problems with n:m
    >mappings(flattened-relationships).
    >Date: 28 Feb 2003 07:48:58 +1300
    >
    >You're certainly close and have all the right ideas, but there's likely
    >just one small thing tripping you up. Flattened relationships are
    >determined to be readonly, UNLESS
    >
    >1) It has exactly 2 dbrelationships (true in your case, so not the
    >problem)
    >2) The first relationship in the path is toMany or the the second is
    >toOne (in your case, toProjectEmployees is toMany and toEmployess is
    >toOne, so that's not the problem).
    >3) Finally, and this is where I suspect something may be going astray in
    >your model, all of the attributes in the intermediate table must be part
    >of the primary key of the intermediate table. It's a guess (without
    >seeing your model), but I reckon that the most likely candidate is that
    >EMP_PROJ dbEntity doesn't have both it's attributes marked as pk?
    >
    >If not, send me your data map and I'll have a look.
    >
    >Craig
    >
    >On Thu, 2003-02-27 at 21:54, Laszlo Spoor wrote:
    > > Database: MySQL 3.23
    > > Cayenne : 1.0a6
    > >
    > > Hi Guys,
    > >
    > > I have recently started to work with Cayenne. Pretty cool stuff!
    >However, I
    > > have some problems with the 'flattened-relationships'. My problem is
    >that I
    > > cannot get it to work, but I don't know what I am doing wrong. I
    >described
    > > the steps I took below:
    > >
    > > I have created 3 tables (this case is based on the mail of one of the
    > > subscribers of this mailing list) and inserted some data:
    > >
    > > EMPLOYEES (id integer, firstname varchar(100));
    > > PROJECTS (id integer, projectname varchar2(100));
    > > EMP_PROJ (emp_id integer, prj_id integer);
    > >
    > > Since I use MySQL (which has no support for referential constraints), I
    > > created the relationships between the DataObject myself in the modeler
    > > (after reverse engineering the schema into cayenne):
    > >
    > > EMPLOYEES <-|(1:n)|-> EMP_PROJ
    > > PROJECTS <-|(1:n)|-> EMP_PROJ
    > > EMP_PROJ <-|(n:1)|-> EMPLOYEES
    > > EMP_PROJ <-|(n:1)|-> PROJECTS
    > >
    > > The objects that Cayenne generated for me where:
    > > - Employees
    > > - Projects
    > > - EmpProj
    > >
    > > I removed the EmpProj Object (not the table), removed the Ids and
    >renamed
    > > the classes to:
    > > - Employee
    > > - Project
    > >
    > > In the ObjectMap I created a pass-through relationship for Employee:
    > > name : projects
    > > target : Project
    > > to-many : yes.
    > >
    > > The DBRelationship I selected was: toProjectEmployees.ToProjects. This
    >maps
    > > from EMPLOYEE.ID to EMP_PROJ.PRJ_ID. I cannot select anything else. It
    >will
    > > just replace it with PRJ_ID, which seems fine.
    > >
    > > In the ObjectMap I created a pass-through relationship for Project:
    > > name : employees
    > > target : Projects
    > > to-many : yes.
    > >
    > > The DBRelationship I selected here was: toProjectEmployeesToEmployees.
    >This
    > > maps from PROJECT.ID to EMP_PROJ.EMP_ID. I cannot select anything else
    >here
    > > as well.
    > >
    > > The Java Code I use is:
    > >
    > > [...]
    > > DataContext mContext =
    > > Configuration.getSharedConfig().getDomain().createDataContext();
    > >
    > > SelectQuery qry = new SelectQuery (Employee.class);
    > > List emps = mContext.performQuery(qry);
    > >
    > > Employee emp = (Employee) emps.get(0);
    > > logger.info("The Employee instance found: " + emp.getFirstname());
    > >
    > > qry = null;
    > > qry = new SelectQuery (Project.class);
    > > List prjs = mContext.performQuery(qry);
    > >
    > > Project prj = (Project) prjs.get(0);
    > > logger.info("The Project Instance found: " + prj.getName());
    > >
    > >
    > > logger.info("Adding employee to project... ");
    > > emp.addToProjects(prj);
    > >
    > > mContext.commitChanges(Level.WARN);
    > > [...]
    > >
    > > ... Which results in:
    > >
    > > INFO AddEmpToProject: The Employee instance found: John
    > > INFO AddEmpToProject: The Project Instance found : yx-05
    > > INFO AddEmpToProject: Adding employee to project...
    > >
    > > org.objectstyle.cayenne.CayenneRuntimeException: Cannot modify (add to)
    >the
    > > read-only relationship projects
    > > at
    > >
    >org.objectstyle.cayenne.CayenneDataObject.addToManyTarget(CayenneDataObject.java
    > > :283)at tst.cayenne._Employee.addToProjects(_Employee.java:22)
    > > at tst.test.AddEmpToProject.main(AddEmpToProject.java:51)
    > > Exception in thread main
    > >
    > > I tried several variations, but this seems the most probable way to me.
    >Can
    > > anyone tell me what I am doing wrong and what I should do to get this
    > > working?
    > >
    > > Thanks in advance, Laszlo
    > >
    > > _________________________________________________________________
    > > Add photos to your e-mail with MSN 8. Get 2 months FREE*.
    > > http://join.msn.com/?page=features/featuredemail
    > >
    >
    >

    _________________________________________________________________
    Protect your PC - get McAfee.com VirusScan Online
    http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963



    This archive was generated by hypermail 2.0.0 : Thu Feb 27 2003 - 15:07:31 EST