Re: Commit with validation errors in detail table

From: Fixe106 (fixe10..france.com)
Date: Wed May 07 2008 - 04:32:59 EDT

  • Next message: Marcin Skladaniec: "relationship query and cache refreshing in 3tier cayenne"

    Thank you for your trick Andrus
    But DataContext.invalidateObjects(failed) does not work because cayenne
    tries to recommit all the same objects
    so I used dataContext.unregisterObjects();
    But I have a duplicate primary key :-(
    A snapshot of my code :

             try {
               dataContext.commitChanges();
             }
             catch (ValidationException e) {
               logger.error("Cannot commit, trying to invalidate objects ?!",
    e);
               ValidationResult validationResult = e.getValidationResult();
               if (validationResult != null) {
                 List failures = validationResult.getFailures();
                 List failedObjects = new LinkedList();
                 for (Object validationFailure : failures) {
                   failedObjects.add(((ValidationFailure)
    validationFailure).getSource());
                 }
                 dataContext.unregisterObjects(failedObjects);
                 dataContext.commitChanges();
               }
             }

    In this test the database was empty
    an extract of the log :

    2008-05-07 10:14:46,812 INFO [main] (QueryLogger.java:300) - INSERT INTO
    RDV (Absent, Adresse, Agent, Appel_Date, Appel_Heure, Appel_Timestamp,
    Argumentation, CommentairesTA, CommercialId, Controle, ExchangeId, Id,
    Mobile, Nom, Presentation, Prix, RDV_Date, RDV_Heure, RDV_Timestamp,
    Refus, RemarquesCommercial, Report, StatutMadame, StatutMonsieur,
    Telephone, TypeArgumentation, Vente) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    2008-05-07 10:14:46,812 INFO [main] (QueryLogger.java:322) - [bind:
    'non', '1344 ROUTE DE VERMEIL 30380 ST CHRISTOL LES ALES', 'Claudine
    (cbrunet)', '2008-03-06 09:30:00.0', '2008-03-06 09:30:00.0',
    1204792200000, 'non', 'portail bleu en retrait de la route a 100m de la
    route de montpellier', 201, 'non', '1204707505208', 200, NULL, 'Dulaurent
    Jean-Michel', 'oui', 0, '2008-03-06 09:30:00.0', '2008-03-06 09:30:00.0',
    1204792200000, 'non', 'dejà vu l''année derniere pro control,ne fera
    jamais rien', 'non', NULL, NULL, '33466832655', NULL, 'non']
    2008-05-07 10:14:46,843 INFO [main] (QueryLogger.java:368) - === updated
    1 row.

    --> this row was saved in db with id 200

    2008-05-07 10:14:46,875 ERROR [main] (Main.java:257) - Cannot commit,
    trying to invalidate objects ?!
    org.apache.cayenne.validation.ValidationException: [v.2.0.4 October 8
    2007] Validation has failed.
    Validation failure for fr.c3t.aeh.entity.dao.Rdv.absent: "absent" exceeds
    maximum allowed length (3 chars): 11
            at
    org.apache.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:112)
            at
    org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:1217)
            at
    org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:1138)
            at fr.c3t.aeh.Main.getRDV(Main.java:254)
            at fr.c3t.aeh.Main.extract(Main.java:161)
            at fr.c3t.aeh.Main.testGetRDV(Main.java:134)
            at fr.c3t.aeh.Main.main(Main.java:121)

    --> it was the first object unregistered

    2008-05-07 10:14:46,890 ERROR [main] (Main.java:257) - Cannot commit,
    trying to invalidate objects ?!
    org.apache.cayenne.validation.ValidationException: [v.2.0.4 October 8
    2007] Validation has failed.
    Validation failure for fr.c3t.aeh.entity.dao.Rdv.vente: "vente" exceeds
    maximum allowed length (3 chars): 13
            at
    org.apache.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:112)
            at
    org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:1217)
            at
    org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:1138)
            at fr.c3t.aeh.Main.getRDV(Main.java:254)
            at fr.c3t.aeh.Main.extract(Main.java:161)
            at fr.c3t.aeh.Main.testGetRDV(Main.java:134)
            at fr.c3t.aeh.Main.main(Main.java:121)

    --> it was the second object unregistered

    2008-05-07 10:14:46,921 INFO [main] (QueryLogger.java:300) - INSERT INTO
    RDV (Absent, Adresse, Agent, Appel_Date, Appel_Heure, Appel_Timestamp,
    Argumentation, CommentairesTA, CommercialId, Controle, ExchangeId, Id,
    Mobile, Nom, Presentation, Prix, RDV_Date, RDV_Heure, RDV_Timestamp,
    Refus, RemarquesCommercial, Report, StatutMadame, StatutMonsieur,
    Telephone, TypeArgumentation, Vente) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    2008-05-07 10:14:46,937 INFO [main] (QueryLogger.java:322) - [bind:
    'non', '28 CHEMIN DES TOURETTES 30340 MEJANNES LES ALES', 'Sabrina
    (skara)', '2008-03-05 16:00:00.0', '2008-03-05 16:00:00.0', 1204729200000,
    'oui', 'A coté de l''ancienne mairie,portail gris', 201, 'oui',
    '1204537791936', 200, NULL, 'Brodure Serge', 'oui', 6000, '2008-03-05
    16:00:00.0', '2008-03-05 16:00:00.0', 1204729200000, 'non', 'bon rdv',
    'non', NULL, NULL, '33466603463', NULL, 'oui']
    2008-05-07 10:14:46,953 INFO [main] (QueryLogger.java:403) - *** error.
    java.sql.SQLException: Duplicate key or integrity constraint violation
    message from server: "Duplicate entry '200' for key 1"
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2001)
            at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1168)
            at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279)
            at com.mysql.jdbc.Connection.execSQL(Connection.java:2281)
            at
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1825)
            at
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1667)
            at
    org.apache.cayenne.access.jdbc.BatchAction.runAsIndividualQueries(BatchAction.java:188)
            at
    org.apache.cayenne.access.jdbc.BatchAction.performAction(BatchAction.java:81)
            at
    org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:59)
            at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273)
            at
    org.apache.cayenne.access.DataDomainFlushAction.runQueries(DataDomainFlushAction.java:219)
            at
    org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:141)
            at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:810)
            at org.apache.cayenne.access.DataDomain$2.transform(DataDomain.java:781)
            at
    org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:836)
            at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:778)
            at
    org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:1234)
            at
    org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:1138)
            at fr.c3t.aeh.Main.getRDV(Main.java:254)
            at fr.c3t.aeh.Main.extract(Main.java:161)
            at fr.c3t.aeh.Main.testGetRDV(Main.java:134)
            at fr.c3t.aeh.Main.main(Main.java:121)

    Finally this third object was valid but Cayenne used the same Id.

    Sincerely,
    Julien



    This archive was generated by hypermail 2.0.0 : Wed May 07 2008 - 04:32:54 EDT