Re: Cayenne Tutorial: INSERT on table 'PAINTING' caused a violation of foreign key constraint

From: caden whitaker (caden.whitake..mail.com)
Date: Tue Oct 26 2010 - 17:27:32 UTC

  • Next message: Borut Bolčina: "Re: Cayenne Tutorial: INSERT on table 'PAINTING' caused a violation of foreign key constraint"

    Hey Mike,

    I was thinking the same thing, so I removed the code, now it looks like
    this:

                ObjectContext context = DataContext.createDataContext();
                Artist picasso = context.newObject(Artist.class);
                picasso.setName("Pablo Picasso");

                Painting girl = context.newObject(Painting.class);
                girl.setName("Girl Reading at a Table");
                girl.setArtist(picasso);

                Painting stein = context.newObject(Painting.class);
                stein.setName("Gertrude Stein");
                stein.setArtist(picasso);

                context.commitChanges();

    And I get the same error:

    Begin Test
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    startedLoading
    INFO: started configuration loading.
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    shouldLoadDataDomain
    INFO: loaded domain: HelloWorld1
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    loadDataMap
    INFO: loaded <map name='HelloWorld1Map' location='HelloWorld1Map.map.xml'>.
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    shouldLoadDataNode
    INFO: loading <node name='HelloWorld1Node'
    datasource='HelloWorld1Node.driver.xml'
    factory='org.apache.cayenne.conf.DriverDataSourceFactory'
    schema-update-strategy='org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy'>.
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    shouldLoadDataNode
    INFO: using factory: org.apache.cayenne.conf.DriverDataSourceFactory
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.conf.DriverDataSourceFactory
    load
    INFO: loading driver information from 'HelloWorld1Node.driver.xml'.
    Oct 26, 2010 12:26:30 PM
    org.apache.cayenne.conf.DriverDataSourceFactory$DriverHandler init
    INFO: loading driver org.apache.derby.jdbc.EmbeddedDriver
    Oct 26, 2010 12:26:30 PM
    org.apache.cayenne.conf.DriverDataSourceFactory$LoginHandler init
    INFO: loading user name and password.
    Oct 26, 2010 12:26:30 PM org.apache.cayenne.access.QueryLogger
    logPoolCreated
    INFO: Created connection pool: jdbc:derby:memory:testdb;create=true
        Driver class: org.apache.derby.jdbc.EmbeddedDriver
        Min. connections in the pool: 1
        Max. connections in the pool: 1
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    shouldLoadDataNode
    INFO: loaded datasource.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    initAdapter
    INFO: no adapter set, using automatic adapter.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    shouldLinkDataMap
    INFO: loaded map-ref: HelloWorld1Map.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.conf.RuntimeLoadDelegate
    finishedLoading
    INFO: finished configuration loading in 312 ms.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logConnect
    INFO: Opening connection: jdbc:derby:memory:testdb;create=true
        Login: null
        Password: *******
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger
    logConnectSuccess
    INFO: +++ Connecting: SUCCESS.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger
    logBeginTransaction
    INFO: --- transaction started.
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger log
    INFO: Detected and installed adapter:
    org.apache.cayenne.dba.derby.DerbyAdapter
    Oct 26, 2010 12:26:31 PM
    org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy
    processSchemaUpdate
    INFO: No schema detected, will create mapped tables
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: CREATE TABLE ARTIST (ID BIGINT NOT NULL, Name VARCHAR (255), PRIMARY
    KEY (ID))
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: CREATE TABLE PAINTING (ID BIGINT NOT NULL, Name VARCHAR (255), PRIMARY
    KEY (ID))
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: ALTER TABLE PAINTING ADD FOREIGN KEY (ID) REFERENCES ARTIST (ID)
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: CREATE TABLE AUTO_PK_SUPPORT ( TABLE_NAME CHAR(100) NOT NULL,
    NEXT_ID BIGINT NOT NULL, PRIMARY KEY(TABLE_NAME))
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: DELETE FROM AUTO_PK_SUPPORT WHERE TABLE_NAME IN ('ARTIST', 'PAINTING')
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: INSERT INTO AUTO_PK_SUPPORT (TABLE_NAME, NEXT_ID) VALUES ('ARTIST',
    200)
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: INSERT INTO AUTO_PK_SUPPORT (TABLE_NAME, NEXT_ID) VALUES ('PAINTING',
    200)
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger log
    INFO: Detected and installed adapter:
    org.apache.cayenne.dba.derby.DerbyAdapter
    Oct 26, 2010 12:26:31 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = ? FOR UPDATE
    [bind: 1:'ARTIST']
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = ? FOR UPDATE
    [bind: 1:'PAINTING']
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger logQueryStart
    INFO: --- will run 2 queries.
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: INSERT INTO ARTIST (ID, Name) VALUES (?, ?)
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger
    logQueryParameters
    INFO: [batch bind: 1->ID:200, 2->Name:'Pablo Picasso']
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger
    logUpdateCount
    INFO: === updated 1 row.
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger logQuery
    INFO: INSERT INTO PAINTING (ID, Name) VALUES (?, ?)
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger
    logQueryParameters
    INFO: [batch bind: 1->ID:200, 2->Name:'Gertrude Stein']
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger
    logQueryParameters
    INFO: [batch bind: 1->ID:201, 2->Name:'Girl Reading at a Table']
    Oct 26, 2010 12:26:32 PM org.apache.cayenne.access.QueryLogger logQueryError
    INFO: *** error.
    java.sql.SQLIntegrityConstraintViolationException: INSERT on table
    'PAINTING' caused a violation of foreign key constraint 'SQL101026122631940'
    for key (201). The statement has been rolled back.
        at
    org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
    Source)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
    Source)

    On Tue, Oct 26, 2010 at 12:23 PM, Mike Kienenberger <mkienen..mail.com>wrote:

    > In fact, this could be the problem.
    >
    > By calling it twice, you will get two of each object in each relationship.
    > This might be causing your foreign key constraint error.
    >
    >
    > On Tue, Oct 26, 2010 at 1:02 PM, Borut Bolčina <borut.bolcin..mail.com>
    > wrote:
    > > Hi,
    > >
    > > how did you create your database (show us the create statements)? Which
    > > database are you using? Foreign key constraints are optional, but you
    > need
    > > them if you want to reverse engineer the database, so that relationships
    > in
    > > the modeler are created.
    > >
    > > Also, in your unit test, you are setting
    > >
    > > picasso.addToPaintings(girl);
    > > picasso.addToPaintings(stein);
    > >
    > > but this is not needed. Cayenne automatically sets the other side of the
    > > relationship for you, unlike Hibernate.
    > >
    > > -Borut
    > >
    > > 2010/10/26 caden whitaker <caden.whitake..mail.com>
    > >
    > >> Hey all,
    > >>
    > >> Running through the tutorials, I know what that error means, but I don't
    > >> think I've done anything wrong. Can someone take a quick look at this
    > >> xml/object set and tell me what I did wrong? Any help would be greatly
    > >> appreciated.
    > >>
    > >> Mapping.xml
    > >> <?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">
    > >> <property name="defaultPackage"
    > value="org.example.cayenne.persistent"/>
    > >> <db-entity name="ARTIST">
    > >> <db-attribute name="ID" type="BIGINT" isPrimaryKey="true"
    > >> isMandatory="true"/>
    > >> <db-attribute name="Name" type="VARCHAR" length="255"/>
    > >> </db-entity>
    > >> <db-entity name="PAINTING">
    > >> <db-attribute name="ID" type="BIGINT" isPrimaryKey="true"
    > >> isMandatory="true"/>
    > >> <db-attribute name="Name" type="VARCHAR" length="255"/>
    > >> </db-entity>
    > >> <obj-entity name="Artist"
    > >> className="main.java.org.example.cayenne.persistent.Artist"
    > >> dbEntityName="ARTIST">
    > >> <obj-attribute name="name" type="java.lang.String"
    > >> db-attribute-path="Name"/>
    > >> </obj-entity>
    > >> <obj-entity name="Painting"
    > >> className="main.java.org.example.cayenne.persistent.Painting"
    > >> dbEntityName="PAINTING">
    > >> <obj-attribute name="name" type="java.lang.String"
    > >> db-attribute-path="Name"/>
    > >> </obj-entity>
    > >> <db-relationship name="paintings" source="ARTIST" target="PAINTING"
    > >> toMany="true">
    > >> <db-attribute-pair source="ID" target="ID"/>
    > >> </db-relationship>
    > >> <db-relationship name="artist" source="PAINTING" target="ARTIST"
    > >> toMany="false">
    > >> <db-attribute-pair source="ID" target="ID"/>
    > >> </db-relationship>
    > >> <obj-relationship name="paintings" source="Artist" target="Painting"
    > >> deleteRule="Deny" db-relationship-path="paintings"/>
    > >> <obj-relationship name="artist" source="Painting" target="Artist"
    > >> deleteRule="Deny" db-relationship-path="artist"/>
    > >> </data-map>
    > >>
    > >> _Artist.java
    > >> public abstract class _Artist extends CayenneDataObject {
    > >>
    > >> public static final String NAME_PROPERTY = "name";
    > >> public static final String PAINTINGS_PROPERTY = "paintings";
    > >>
    > >> public static final String ID_PK_COLUMN = "ID";
    > >>
    > >> public void setName(String name) {
    > >> writeProperty("name", name);
    > >> }
    > >> public String getName() {
    > >> return (String)readProperty("name");
    > >> }
    > >>
    > >> public void addToPaintings(Painting obj) {
    > >> addToManyTarget("paintings", obj, true);
    > >> }
    > >> public void removeFromPaintings(Painting obj) {
    > >> removeToManyTarget("paintings", obj, true);
    > >> }
    > >> ..uppressWarnings("unchecked")
    > >> public List<Painting> getPaintings() {
    > >> return (List<Painting>)readProperty("paintings");
    > >> }
    > >>
    > >>
    > >> }
    > >>
    > >> _Painting.java
    > >> public abstract class _Painting extends CayenneDataObject {
    > >>
    > >> public static final String NAME_PROPERTY = "name";
    > >> public static final String ARTIST_PROPERTY = "artist";
    > >>
    > >> public static final String ID_PK_COLUMN = "ID";
    > >>
    > >> public void setName(String name) {
    > >> writeProperty("name", name);
    > >> }
    > >> public String getName() {
    > >> return (String)readProperty("name");
    > >> }
    > >>
    > >> public void setArtist(Artist artist) {
    > >> setToOneTarget("artist", artist, true);
    > >> }
    > >>
    > >> public Artist getArtist() {
    > >> return (Artist)readProperty("artist");
    > >> }
    > >>
    > >>
    > >> }
    > >>
    > >>
    > >> JUnit test case:
    > >> // JUnit
    > >> public void testBuild()
    > >> throws Exception
    > >> {
    > >> System.out.println("Begin Test");
    > >> try {
    > >> ObjectContext context = DataContext.createDataContext();
    > >> Artist picasso = context.newObject(Artist.class);
    > >> picasso.setName("Pablo Picasso");
    > >>
    > >>
    > >> Painting girl = context.newObject(Painting.class);
    > >> girl.setName("Girl Reading at a Table");
    > >> girl.setArtist(picasso);
    > >>
    > >> Painting stein = context.newObject(Painting.class);
    > >> stein.setName("Gertrude Stein");
    > >> stein.setArtist(picasso);
    > >>
    > >> picasso.addToPaintings(girl);
    > >> picasso.addToPaintings(stein);
    > >>
    > >> context.commitChanges();
    > >>
    > >> } catch (Exception e) {
    > >> e.printStackTrace();
    > >> }
    > >> System.out.println("End Test");
    > >> }
    > >>
    > >
    >



    This archive was generated by hypermail 2.0.0 : Tue Oct 26 2010 - 17:28:02 UTC