Hi Michael,
Isn't it a "many-to-one", not "one-to-one" relationship? I have a feeling
that this is the case.
What I would suggest is to uncheck "to dep pk" on RaceDBEntity (see
below). "to dep pk" is used for things like join tables, or truly
dependent tables, like say "User -> UserAdditionalInfo". Its purpose is to
propagate the value of a primary key from the "master" entity to the
"dependent" entity. It doesn't seem appropriate in your case.
Andrus
P.S. Since I knew that the modeler wouldn't normally allow you to check
"to dep pk" unless both source and destination attributes are marked as
PK, I was surprised to see the model that you have... Well it turned out
to be a bug in the modeler. If you create a relationship as "to dep pk",
and then change one of its attributes from "PK" to a regular one, "to dep
pk" is still checked, and even worse - it becomes disabled.
I will fix this bug; in the meantime please manually delete
"toDependentPK="true"" piece from your XML.
> Hi:
>
> I have a lookup table which is used as a logical one to one (not in the
> cayenne sense of FK). I am having a hard time understanding how to use
> the cayenne modeler to get the relationship correct so that I get back
> only the lookup value I need. The database tables are as follows:
>
> CREATE TABLE RaceDBEntity (location VARCHAR(255) NOT NULL, race_date
> DATE NOT NULL, race_id INT NOT NULL, race_name VARCHAR(255) NOT NULL,
> race_type_id INT NOT
> NULL, year VARCHAR(4) NOT NULL, PRIMARY KEY (race_id))
>
> CREATE TABLE RaceTypeDbEntity (race_type_id INT NOT NULL, type_name
> VARCHAR(255) NOT NULL, PRIMARY KEY (race_type_id))
>
> RaceTypes are just lookups and each race has a single race type. If I
> create a RaceTypeDbEntity relation in RaceDbEntity that is to Dep PK,
> and in RaceDbEntity to RaceTypeDbEntity that is To Many, I get the
> following error when I add a race with the below code:
>
> Caused by: org.objectstyle.cayenne.CayenneException: [v.1.0b4 June 16
> 2003] Error generating PK: More than one row for 'RaceDBEntity'
> at
> org.objectstyle.cayenne.access.util.PrimaryKeyHelper.createPermIdsForObjEntity(PrimaryKeyHelper.java:200)
> at
> org.objectstyle.cayenne.access.ContextCommit.createPrimaryKeys(ContextCommit.java:517)
> at
> org.objectstyle.cayenne.access.ContextCommit.commit(ContextCommit.java:139)
> at
> org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:732)
> ... 42 more
> Caused by: java.sql.SQLException: More than one row for 'RaceDBEntity'
> at
> org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.getPrimaryKey(MySQLPkGenerator.java:166)
> at
> org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.pkFromDatabase(MySQLPkGenerator.java:93)
> at
> org.objectstyle.cayenne.dba.JdbcPkGenerator.generatePkForDbEntity(JdbcPkGenerator.java:322)
> at
> org.objectstyle.cayenne.access.util.PrimaryKeyHelper.createPermIdsForObjEntity(PrimaryKeyHelper.java:195)
>
> code snippet:
> BeanUtils.copyProperties(race, raceForm);
> RaceType raceType =
> LookupDao.loadRaceTypeById(ctxt,raceForm.getRaceType());
> race.setToRaceType(raceType);
> ctxt.commitChanges(org.apache.log4j.Level.WARN);
>
> The xml file looks like this:
>
> <db-entity name="RaceDBEntity">
> <db-attribute name="location" type="VARCHAR" isMandatory="true"
> length="255"/>
> <db-attribute name="race_date" type="DATE" isMandatory="true"/>
> <db-attribute name="race_id" type="INTEGER" isPrimaryKey="true"
> isMandatory="true"/>
> <db-attribute name="race_name" type="VARCHAR" isMandatory="true"
> length="255"/>
> <db-attribute name="race_type_id" type="INTEGER"
> isMandatory="true"/>
> <db-attribute name="year" type="VARCHAR" isMandatory="true"
> length="4"/> </db-entity>
> <db-entity name="RaceTypeDbEntity">
> <db-attribute name="race_type_id" type="INTEGER"
> isPrimaryKey="true" isMandatory="true"/>
> <db-attribute name="type_name" type="VARCHAR" isMandatory="true"
> length="255"/>
> </db-entity>
>
> .....
>
> <db-relationship name="toRace" source="RaceTypeDbEntity"
> target="RaceDBEntity" toDependentPK="false" toMany="true">
> <db-attribute-pair source="race_type_id" target="race_type_id"/>
> </db-relationship>
> <db-relationship name="toRaceType" source="RaceDBEntity"
> target="RaceTypeDbEntity" toDependentPK="true" toMany="false">
> <db-attribute-pair source="race_type_id" target="race_type_id"/>
> </db-relationship>
>
> Any clue as to how to get this to work is greatly appreciated. I have
> the many-to-many situations working fine based on the example in the
> tutorial.
>
> -MA
This archive was generated by hypermail 2.0.0 : Sat Jul 05 2003 - 23:10:29 EDT