Umm we found the same pattern some time ago, and just moved our default values to onPostAdd, and I that is working fine for us, but I am not sure if we are using it with mandatory fields.

El 10/10/2012 13:42, [email protected] escribió:
Does anybody have any news on this, please ?
Thanks.

---------------------------- Original Message ----------------------------
Subject: Re: 3.1B1 Validation Exception
Date:    Thu, September 20, 2012 11:27
--------------------------------------------------------------------------

Not sure how to submit the example, but here goes:

1.  TestMap.map.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="6">
        <property name="defaultPackage" value="test.tables"/>
        <db-entity name="DOCUMENTS">
                <db-attribute name="CLEINT_NO" type="VARCHAR" isMandatory="true"
length="50"/>
                <db-attribute name="DOC_DATE" type="TIMESTAMP" 
isMandatory="true"/>
                <db-attribute name="DOC_ID" type="BIGINT" isPrimaryKey="true"
isGenerated="true" isMandatory="true"/>
                <db-attribute name="DOC_INFO" type="CLOB" isMandatory="true"/>
                <db-attribute name="DOC_REF_NO" type="VARCHAR" 
isMandatory="true"
length="50"/>
        </db-entity>
        <obj-entity name="Document" className="test.tables.Document"
dbEntityName="DOCUMENTS">
                <obj-attribute name="client_id" type="java.lang.String"
db-attribute-path="CLEINT_NO"/>
                <obj-attribute name="docDate" type="java.sql.Timestamp"
db-attribute-path="DOC_DATE"/>
                <obj-attribute name="info" type="java.lang.String"
db-attribute-path="DOC_INFO"/>
                <obj-attribute name="reference" type="java.lang.String"
db-attribute-path="DOC_REF_NO"/>
                <pre-persist method-name="onPrePersist"/>
        </obj-entity>
</data-map>

--------------------------------------------------------------------
2.  Document class

package test.tables;
import java.sql.Timestamp;
import test.tables.auto._Document;

public class Document extends _Document
{
     @Override
     protected void onPrePersist()
     {
          setDocDate( new Timestamp( System.currentTimeMillis() ) );
     }
}

--------------------------------------------------------------------
3.  Test class

import org.apache.cayenne.configuration.server.ServerRuntime;
import test.tables.Document;

public class Test
{
     public static void main( String[] args )
     {
         ServerRuntime server = new ServerRuntime("cayenne-Test.xml");
         Document  newDoc = server.getContext().newObject( Document.class );

         newDoc.setClient_id( "12345" );
         newDoc.setReference( "Test entry" );
         newDoc.setInfo( "Some text about stuff." );

         newDoc.getObjectContext().commitChanges();
     }
}

--------------------------------------------------------------------
4.  The Exception

Exception in thread "main"
org.apache.cayenne.validation.ValidationException: [v.3.1B1 May 28 2012
20:59:56] Validation failures: Validation failure for
test.tables.Document.docDate: "docDate"  is required.
Validation failure for test.tables.Document.docDate: "docDate"  is required.
        at
org.apache.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:111)
        at 
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:806)
        at 
org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:756)
        at Test.main(Test.java:16)

--------------------------------------------------------------------

Thanks.


That doesn't sound like the right behavior.  Can you create small example
that reproduces the problem?

On Wednesday, September 19, 2012, wrote:

Is this a bug or am I doing something wrong ?

I'm using 3.1B1 and getting a validation exception BEFORE my
onPrePersist lifecycle method is called ?

Caused by: org.apache.cayenne.validation.ValidationException: [v.3.1B1
May 28 2012
20:59:56]org.apache.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:111)
         at
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:806)
         at
org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:756)


The Cayenne Guide\Lifecycle Callbacks documentation indicates that
PrePersist is called "Prior to commit (and prior to "validateFor*")
within ObjectContext.commitChanges()"

However from the above this doesn't seem to be the case ?

So is this a bug or am I missing something ?




Reply via email to