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 ?