http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest3.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest3.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest3.java
index 6f7d250..a908ca4 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest3.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest3.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_delete_rules.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleTest2;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleTest2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteRuleTest3 extends CayenneDataObject {
+public abstract class _DeleteRuleTest3 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _DeleteRuleTest3 extends 
CayenneDataObject {
 
     public static final Property<DeleteRuleTest2> TO_DELETE_RULE_TEST2 = 
Property.create("toDeleteRuleTest2", DeleteRuleTest2.class);
 
+
+    protected Object toDeleteRuleTest2;
+
     public void setToDeleteRuleTest2(DeleteRuleTest2 toDeleteRuleTest2) {
         setToOneTarget("toDeleteRuleTest2", toDeleteRuleTest2, true);
     }
@@ -26,5 +33,53 @@ public abstract class _DeleteRuleTest3 extends 
CayenneDataObject {
         return (DeleteRuleTest2)readProperty("toDeleteRuleTest2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "toDeleteRuleTest2":
+                return this.toDeleteRuleTest2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "toDeleteRuleTest2":
+                this.toDeleteRuleTest2 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(toDeleteRuleTest2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        toDeleteRuleTest2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedCircular.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedCircular.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedCircular.java
index 7406905..23b387e 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedCircular.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedCircular.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedCircular;
 
@@ -12,7 +15,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedCircular;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedCircular extends CayenneDataObject {
+public abstract class _FlattenedCircular extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,28 +24,90 @@ public abstract class _FlattenedCircular extends 
CayenneDataObject {
     public static final Property<List<FlattenedCircular>> SIDE1S = 
Property.create("side1s", List.class);
     public static final Property<List<FlattenedCircular>> SIDE2S = 
Property.create("side2s", List.class);
 
+
+    protected Object side1s;
+    protected Object side2s;
+
     public void addToSide1s(FlattenedCircular obj) {
         addToManyTarget("side1s", obj, true);
     }
+
     public void removeFromSide1s(FlattenedCircular obj) {
         removeToManyTarget("side1s", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedCircular> getSide1s() {
         return (List<FlattenedCircular>)readProperty("side1s");
     }
 
-
     public void addToSide2s(FlattenedCircular obj) {
         addToManyTarget("side2s", obj, true);
     }
+
     public void removeFromSide2s(FlattenedCircular obj) {
         removeToManyTarget("side2s", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedCircular> getSide2s() {
         return (List<FlattenedCircular>)readProperty("side2s");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "side1s":
+                return this.side1s;
+            case "side2s":
+                return this.side2s;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "side1s":
+                this.side1s = val;
+                break;
+            case "side2s":
+                this.side2s = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(side1s);
+        out.writeObject(side2s);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        side1s = in.readObject();
+        side2s = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest1.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest1.java
index a215d50..a60aff7 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest2;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
@@ -15,7 +18,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedTest5;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedTest1 extends CayenneDataObject {
+public abstract class _FlattenedTest1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -28,59 +31,155 @@ public abstract class _FlattenedTest1 extends 
CayenneDataObject {
     public static final Property<List<FlattenedTest4>> FT4ARRAY_FOR1 = 
Property.create("ft4ArrayFor1", List.class);
     public static final Property<List<FlattenedTest5>> FT5ARRAY = 
Property.create("ft5Array", List.class);
 
+    protected String name;
+
+    protected Object ft2Array;
+    protected Object ft3Array;
+    protected Object ft3OverComplex;
+    protected Object ft4ArrayFor1;
+    protected Object ft5Array;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToFt2Array(FlattenedTest2 obj) {
         addToManyTarget("ft2Array", obj, true);
     }
+
     public void removeFromFt2Array(FlattenedTest2 obj) {
         removeToManyTarget("ft2Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedTest2> getFt2Array() {
         return (List<FlattenedTest2>)readProperty("ft2Array");
     }
 
-
     @SuppressWarnings("unchecked")
     public List<FlattenedTest3> getFt3Array() {
         return (List<FlattenedTest3>)readProperty("ft3Array");
     }
 
-
     public void addToFt3OverComplex(FlattenedTest3 obj) {
         addToManyTarget("ft3OverComplex", obj, true);
     }
+
     public void removeFromFt3OverComplex(FlattenedTest3 obj) {
         removeToManyTarget("ft3OverComplex", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedTest3> getFt3OverComplex() {
         return (List<FlattenedTest3>)readProperty("ft3OverComplex");
     }
 
-
     @SuppressWarnings("unchecked")
     public List<FlattenedTest4> getFt4ArrayFor1() {
         return (List<FlattenedTest4>)readProperty("ft4ArrayFor1");
     }
 
-
     public void addToFt5Array(FlattenedTest5 obj) {
         addToManyTarget("ft5Array", obj, true);
     }
+
     public void removeFromFt5Array(FlattenedTest5 obj) {
         removeToManyTarget("ft5Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedTest5> getFt5Array() {
         return (List<FlattenedTest5>)readProperty("ft5Array");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "ft2Array":
+                return this.ft2Array;
+            case "ft3Array":
+                return this.ft3Array;
+            case "ft3OverComplex":
+                return this.ft3OverComplex;
+            case "ft4ArrayFor1":
+                return this.ft4ArrayFor1;
+            case "ft5Array":
+                return this.ft5Array;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "ft2Array":
+                this.ft2Array = val;
+                break;
+            case "ft3Array":
+                this.ft3Array = val;
+                break;
+            case "ft3OverComplex":
+                this.ft3OverComplex = val;
+                break;
+            case "ft4ArrayFor1":
+                this.ft4ArrayFor1 = val;
+                break;
+            case "ft5Array":
+                this.ft5Array = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(ft2Array);
+        out.writeObject(ft3Array);
+        out.writeObject(ft3OverComplex);
+        out.writeObject(ft4ArrayFor1);
+        out.writeObject(ft5Array);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        ft2Array = in.readObject();
+        ft3Array = in.readObject();
+        ft3OverComplex = in.readObject();
+        ft4ArrayFor1 = in.readObject();
+        ft5Array = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest2.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest2.java
index d2fdb0b..5cee2ab 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest2.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest1;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
@@ -13,7 +16,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedTest2 extends CayenneDataObject {
+public abstract class _FlattenedTest2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,25 +26,34 @@ public abstract class _FlattenedTest2 extends 
CayenneDataObject {
     public static final Property<List<FlattenedTest3>> FT3ARRAY = 
Property.create("ft3Array", List.class);
     public static final Property<FlattenedTest1> TO_FT1 = 
Property.create("toFT1", FlattenedTest1.class);
 
+    protected String name;
+
+    protected Object ft3Array;
+    protected Object toFT1;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToFt3Array(FlattenedTest3 obj) {
         addToManyTarget("ft3Array", obj, true);
     }
+
     public void removeFromFt3Array(FlattenedTest3 obj) {
         removeToManyTarget("ft3Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedTest3> getFt3Array() {
         return (List<FlattenedTest3>)readProperty("ft3Array");
     }
 
-
     public void setToFT1(FlattenedTest1 toFT1) {
         setToOneTarget("toFT1", toFT1, true);
     }
@@ -50,5 +62,67 @@ public abstract class _FlattenedTest2 extends 
CayenneDataObject {
         return (FlattenedTest1)readProperty("toFT1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "ft3Array":
+                return this.ft3Array;
+            case "toFT1":
+                return this.toFT1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "ft3Array":
+                this.ft3Array = val;
+                break;
+            case "toFT1":
+                this.toFT1 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(ft3Array);
+        out.writeObject(toFT1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        ft3Array = in.readObject();
+        toFT1 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest3.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest3.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest3.java
index d05da64..ce4fb5c 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest3.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest3.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest1;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest2;
@@ -14,7 +17,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedTest4;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedTest3 extends CayenneDataObject {
+public abstract class _FlattenedTest3 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -25,31 +28,39 @@ public abstract class _FlattenedTest3 extends 
CayenneDataObject {
     public static final Property<FlattenedTest1> TO_FT1 = 
Property.create("toFT1", FlattenedTest1.class);
     public static final Property<FlattenedTest2> TO_FT2 = 
Property.create("toFT2", FlattenedTest2.class);
 
+    protected String name;
+
+    protected Object ft4Array;
+    protected Object toFT1;
+    protected Object toFT2;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToFt4Array(FlattenedTest4 obj) {
         addToManyTarget("ft4Array", obj, true);
     }
+
     public void removeFromFt4Array(FlattenedTest4 obj) {
         removeToManyTarget("ft4Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FlattenedTest4> getFt4Array() {
         return (List<FlattenedTest4>)readProperty("ft4Array");
     }
 
-
-
     public FlattenedTest1 getToFT1() {
         return (FlattenedTest1)readProperty("toFT1");
     }
 
-
     public void setToFT2(FlattenedTest2 toFT2) {
         setToOneTarget("toFT2", toFT2, true);
     }
@@ -58,5 +69,74 @@ public abstract class _FlattenedTest3 extends 
CayenneDataObject {
         return (FlattenedTest2)readProperty("toFT2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "ft4Array":
+                return this.ft4Array;
+            case "toFT1":
+                return this.toFT1;
+            case "toFT2":
+                return this.toFT2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "ft4Array":
+                this.ft4Array = val;
+                break;
+            case "toFT1":
+                this.toFT1 = val;
+                break;
+            case "toFT2":
+                this.toFT2 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(ft4Array);
+        out.writeObject(toFT1);
+        out.writeObject(toFT2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        ft4Array = in.readObject();
+        toFT1 = in.readObject();
+        toFT2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest4.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest4.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest4.java
index 55392e9..725f2b5 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest4.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest4.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedTest4 extends CayenneDataObject {
+public abstract class _FlattenedTest4 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _FlattenedTest4 extends 
CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", 
String.class);
     public static final Property<FlattenedTest3> TO_FT3 = 
Property.create("toFT3", FlattenedTest3.class);
 
+    protected String name;
+
+    protected Object toFT3;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void setToFT3(FlattenedTest3 toFT3) {
@@ -34,5 +45,60 @@ public abstract class _FlattenedTest4 extends 
CayenneDataObject {
         return (FlattenedTest3)readProperty("toFT3");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toFT3":
+                return this.toFT3;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "toFT3":
+                this.toFT3 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(toFT3);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toFT3 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest5.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest5.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest5.java
index 3233a3d..e6112ab 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest5.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_flattened/auto/_FlattenedTest5.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_flattened.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest1;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_flattened.FlattenedTest1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FlattenedTest5 extends CayenneDataObject {
+public abstract class _FlattenedTest5 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _FlattenedTest5 extends 
CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", 
String.class);
     public static final Property<FlattenedTest1> TO_FT1 = 
Property.create("toFT1", FlattenedTest1.class);
 
+    protected String name;
+
+    protected Object toFT1;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void setToFT1(FlattenedTest1 toFT1) {
@@ -34,5 +45,60 @@ public abstract class _FlattenedTest5 extends 
CayenneDataObject {
         return (FlattenedTest1)readProperty("toFT1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toFT1":
+                return this.toFT1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "toFT1":
+                this.toFT1 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(toFT1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toFT1 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToMany.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToMany.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToMany.java
index 5c4427f..07ba3e7 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToMany.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToMany.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_set_to_many.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Set;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_set_to_many.SetToManyTarget;
 
@@ -12,7 +15,7 @@ import 
org.apache.cayenne.testdo.relationships_set_to_many.SetToManyTarget;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SetToMany extends CayenneDataObject {
+public abstract class _SetToMany extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _SetToMany extends CayenneDataObject {
 
     public static final Property<Set<SetToManyTarget>> TARGETS = 
Property.create("targets", Set.class);
 
+
+    protected Object targets;
+
     public void addToTargets(SetToManyTarget obj) {
         addToManyTarget("targets", obj, true);
     }
+
     public void removeFromTargets(SetToManyTarget obj) {
         removeToManyTarget("targets", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public Set<SetToManyTarget> getTargets() {
         return (Set<SetToManyTarget>)readProperty("targets");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "targets":
+                return this.targets;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "targets":
+                this.targets = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(targets);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        targets = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToManyTarget.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToManyTarget.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToManyTarget.java
index d2edc6c..dd0d5ca 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToManyTarget.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_set_to_many/auto/_SetToManyTarget.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_set_to_many.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_set_to_many.SetToMany;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_set_to_many.SetToMany;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SetToManyTarget extends CayenneDataObject {
+public abstract class _SetToManyTarget extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _SetToManyTarget extends 
CayenneDataObject {
 
     public static final Property<SetToMany> SET_TO_MANY = 
Property.create("setToMany", SetToMany.class);
 
+
+    protected Object setToMany;
+
     public void setSetToMany(SetToMany setToMany) {
         setToOneTarget("setToMany", setToMany, true);
     }
@@ -26,5 +33,53 @@ public abstract class _SetToManyTarget extends 
CayenneDataObject {
         return (SetToMany)readProperty("setToMany");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "setToMany":
+                return this.setToMany;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "setToMany":
+                this.setToMany = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(setToMany);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        setToMany = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkDep.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkDep.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkDep.java
index 5aa0b67..25c3d34 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkDep.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkDep.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_to_many_fk.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_to_many_fk.ToManyFkRoot;
 import org.apache.cayenne.testdo.relationships_to_many_fk.ToManyRoot2;
@@ -11,7 +15,7 @@ import 
org.apache.cayenne.testdo.relationships_to_many_fk.ToManyRoot2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ToManyFkDep extends CayenneDataObject {
+public abstract class _ToManyFkDep extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,18 +27,30 @@ public abstract class _ToManyFkDep extends 
CayenneDataObject {
     public static final Property<ToManyFkRoot> ROOT = Property.create("root", 
ToManyFkRoot.class);
     public static final Property<ToManyRoot2> ROOT2 = Property.create("root2", 
ToManyRoot2.class);
 
+    protected Integer depId;
+    protected String name;
+
+    protected Object root;
+    protected Object root2;
+
     public void setDepId(Integer depId) {
-        writeProperty("depId", depId);
+        beforePropertyWrite("depId", this.depId, depId);
+        this.depId = depId;
     }
+
     public Integer getDepId() {
-        return (Integer)readProperty("depId");
+        beforePropertyRead("depId");
+        return depId;
     }
 
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void setRoot(ToManyFkRoot root) {
@@ -45,7 +61,6 @@ public abstract class _ToManyFkDep extends CayenneDataObject {
         return (ToManyFkRoot)readProperty("root");
     }
 
-
     public void setRoot2(ToManyRoot2 root2) {
         setToOneTarget("root2", root2, true);
     }
@@ -54,5 +69,74 @@ public abstract class _ToManyFkDep extends CayenneDataObject 
{
         return (ToManyRoot2)readProperty("root2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "depId":
+                return this.depId;
+            case "name":
+                return this.name;
+            case "root":
+                return this.root;
+            case "root2":
+                return this.root2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "depId":
+                this.depId = (Integer)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "root":
+                this.root = val;
+                break;
+            case "root2":
+                this.root2 = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(depId);
+        out.writeObject(name);
+        out.writeObject(root);
+        out.writeObject(root2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        depId = (Integer)in.readObject();
+        name = (String)in.readObject();
+        root = in.readObject();
+        root2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkRoot.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkRoot.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkRoot.java
index 98a159f..496de77 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkRoot.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyFkRoot.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_to_many_fk.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_to_many_fk.ToManyFkDep;
 
@@ -12,7 +15,7 @@ import 
org.apache.cayenne.testdo.relationships_to_many_fk.ToManyFkDep;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ToManyFkRoot extends CayenneDataObject {
+public abstract class _ToManyFkRoot extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _ToManyFkRoot extends 
CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", 
String.class);
     public static final Property<List<ToManyFkDep>> DEPS = 
Property.create("deps", List.class);
 
+    protected Integer depId;
+    protected String name;
+
+    protected Object deps;
+
     public void setDepId(Integer depId) {
-        writeProperty("depId", depId);
+        beforePropertyWrite("depId", this.depId, depId);
+        this.depId = depId;
     }
+
     public Integer getDepId() {
-        return (Integer)readProperty("depId");
+        beforePropertyRead("depId");
+        return depId;
     }
 
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToDeps(ToManyFkDep obj) {
         addToManyTarget("deps", obj, true);
     }
+
     public void removeFromDeps(ToManyFkDep obj) {
         removeToManyTarget("deps", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ToManyFkDep> getDeps() {
         return (List<ToManyFkDep>)readProperty("deps");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "depId":
+                return this.depId;
+            case "name":
+                return this.name;
+            case "deps":
+                return this.deps;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "depId":
+                this.depId = (Integer)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "deps":
+                this.deps = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(depId);
+        out.writeObject(name);
+        out.writeObject(deps);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        depId = (Integer)in.readObject();
+        name = (String)in.readObject();
+        deps = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyRoot2.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyRoot2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyRoot2.java
index 51d53fc..27bebd2 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyRoot2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_many_fk/auto/_ToManyRoot2.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_to_many_fk.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_to_many_fk.ToManyFkDep;
 
@@ -12,7 +15,7 @@ import 
org.apache.cayenne.testdo.relationships_to_many_fk.ToManyFkDep;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ToManyRoot2 extends CayenneDataObject {
+public abstract class _ToManyRoot2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _ToManyRoot2 extends 
CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", 
String.class);
     public static final Property<List<ToManyFkDep>> DEPS = 
Property.create("deps", List.class);
 
+    protected String name;
+
+    protected Object deps;
+
     public void setName(String name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public String getName() {
-        return (String)readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToDeps(ToManyFkDep obj) {
         addToManyTarget("deps", obj, true);
     }
+
     public void removeFromDeps(ToManyFkDep obj) {
         removeToManyTarget("deps", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ToManyFkDep> getDeps() {
         return (List<ToManyFkDep>)readProperty("deps");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "deps":
+                return this.deps;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "name":
+                this.name = (String)val;
+                break;
+            case "deps":
+                this.deps = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(name);
+        out.writeObject(deps);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        deps = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK1.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK1.java
index 2a018ca..3e911ce 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK1.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_to_one_fk.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK2;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ToOneFK1 extends CayenneDataObject {
+public abstract class _ToOneFK1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _ToOneFK1 extends CayenneDataObject {
 
     public static final Property<ToOneFK2> TO_PK = Property.create("toPK", 
ToOneFK2.class);
 
+
+    protected Object toPK;
+
     public void setToPK(ToOneFK2 toPK) {
         setToOneTarget("toPK", toPK, true);
     }
@@ -26,5 +33,53 @@ public abstract class _ToOneFK1 extends CayenneDataObject {
         return (ToOneFK2)readProperty("toPK");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "toPK":
+                return this.toPK;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "toPK":
+                this.toPK = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(toPK);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        toPK = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK2.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK2.java
index 92c6415..1ae24c7 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_to_one_fk/auto/_ToOneFK2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_to_one_fk.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK1;
 
@@ -10,7 +14,7 @@ import 
org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ToOneFK2 extends CayenneDataObject {
+public abstract class _ToOneFK2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _ToOneFK2 extends CayenneDataObject {
 
     public static final Property<ToOneFK1> TO_ONE_TO_FK = 
Property.create("toOneToFK", ToOneFK1.class);
 
+
+    protected Object toOneToFK;
+
     public void setToOneToFK(ToOneFK1 toOneToFK) {
         setToOneTarget("toOneToFK", toOneToFK, true);
     }
@@ -26,5 +33,53 @@ public abstract class _ToOneFK2 extends CayenneDataObject {
         return (ToOneFK1)readProperty("toOneToFK");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "toOneToFK":
+                return this.toOneToFK;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "toOneToFK":
+                this.toOneToFK = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(toOneToFK);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        toOneToFK = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap1.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap1.java
index e30256f..fc1de31 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap1.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.return_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -39,144 +42,408 @@ public abstract class _ReturnTypesMap1 extends 
CayenneDataObject {
     public static final Property<Byte> TINYINT_COLUMN = 
Property.create("tinyintColumn", Byte.class);
     public static final Property<String> VARCHAR_COLUMN = 
Property.create("varcharColumn", String.class);
 
+    protected Long bigintColumn;
+    protected Boolean bitColumn;
+    protected Boolean booleanColumn;
+    protected String charColumn;
+    protected Date dateColumn;
+    protected BigDecimal decimalColumn;
+    protected Double doubleColumn;
+    protected Float floatColumn;
+    protected Integer integerColumn;
+    protected String longnvarcharColumn;
+    protected String longvarcharColumn;
+    protected String ncharColumn;
+    protected BigDecimal numericColumn;
+    protected String nvarcharColumn;
+    protected Float realColumn;
+    protected Short smallintColumn;
+    protected Date timeColumn;
+    protected Date timestampColumn;
+    protected Byte tinyintColumn;
+    protected String varcharColumn;
+
+
     public void setBigintColumn(Long bigintColumn) {
-        writeProperty("bigintColumn", bigintColumn);
+        beforePropertyWrite("bigintColumn", this.bigintColumn, bigintColumn);
+        this.bigintColumn = bigintColumn;
     }
+
     public Long getBigintColumn() {
-        return (Long)readProperty("bigintColumn");
+        beforePropertyRead("bigintColumn");
+        return bigintColumn;
     }
 
     public void setBitColumn(Boolean bitColumn) {
-        writeProperty("bitColumn", bitColumn);
+        beforePropertyWrite("bitColumn", this.bitColumn, bitColumn);
+        this.bitColumn = bitColumn;
     }
+
     public Boolean getBitColumn() {
-        return (Boolean)readProperty("bitColumn");
+        beforePropertyRead("bitColumn");
+        return bitColumn;
     }
 
     public void setBooleanColumn(Boolean booleanColumn) {
-        writeProperty("booleanColumn", booleanColumn);
+        beforePropertyWrite("booleanColumn", this.booleanColumn, 
booleanColumn);
+        this.booleanColumn = booleanColumn;
     }
+
     public Boolean getBooleanColumn() {
-        return (Boolean)readProperty("booleanColumn");
+        beforePropertyRead("booleanColumn");
+        return booleanColumn;
     }
 
     public void setCharColumn(String charColumn) {
-        writeProperty("charColumn", charColumn);
+        beforePropertyWrite("charColumn", this.charColumn, charColumn);
+        this.charColumn = charColumn;
     }
+
     public String getCharColumn() {
-        return (String)readProperty("charColumn");
+        beforePropertyRead("charColumn");
+        return charColumn;
     }
 
     public void setDateColumn(Date dateColumn) {
-        writeProperty("dateColumn", dateColumn);
+        beforePropertyWrite("dateColumn", this.dateColumn, dateColumn);
+        this.dateColumn = dateColumn;
     }
+
     public Date getDateColumn() {
-        return (Date)readProperty("dateColumn");
+        beforePropertyRead("dateColumn");
+        return dateColumn;
     }
 
     public void setDecimalColumn(BigDecimal decimalColumn) {
-        writeProperty("decimalColumn", decimalColumn);
+        beforePropertyWrite("decimalColumn", this.decimalColumn, 
decimalColumn);
+        this.decimalColumn = decimalColumn;
     }
+
     public BigDecimal getDecimalColumn() {
-        return (BigDecimal)readProperty("decimalColumn");
+        beforePropertyRead("decimalColumn");
+        return decimalColumn;
     }
 
     public void setDoubleColumn(Double doubleColumn) {
-        writeProperty("doubleColumn", doubleColumn);
+        beforePropertyWrite("doubleColumn", this.doubleColumn, doubleColumn);
+        this.doubleColumn = doubleColumn;
     }
+
     public Double getDoubleColumn() {
-        return (Double)readProperty("doubleColumn");
+        beforePropertyRead("doubleColumn");
+        return doubleColumn;
     }
 
     public void setFloatColumn(Float floatColumn) {
-        writeProperty("floatColumn", floatColumn);
+        beforePropertyWrite("floatColumn", this.floatColumn, floatColumn);
+        this.floatColumn = floatColumn;
     }
+
     public Float getFloatColumn() {
-        return (Float)readProperty("floatColumn");
+        beforePropertyRead("floatColumn");
+        return floatColumn;
     }
 
     public void setIntegerColumn(Integer integerColumn) {
-        writeProperty("integerColumn", integerColumn);
+        beforePropertyWrite("integerColumn", this.integerColumn, 
integerColumn);
+        this.integerColumn = integerColumn;
     }
+
     public Integer getIntegerColumn() {
-        return (Integer)readProperty("integerColumn");
+        beforePropertyRead("integerColumn");
+        return integerColumn;
     }
 
     public void setLongnvarcharColumn(String longnvarcharColumn) {
-        writeProperty("longnvarcharColumn", longnvarcharColumn);
+        beforePropertyWrite("longnvarcharColumn", this.longnvarcharColumn, 
longnvarcharColumn);
+        this.longnvarcharColumn = longnvarcharColumn;
     }
+
     public String getLongnvarcharColumn() {
-        return (String)readProperty("longnvarcharColumn");
+        beforePropertyRead("longnvarcharColumn");
+        return longnvarcharColumn;
     }
 
     public void setLongvarcharColumn(String longvarcharColumn) {
-        writeProperty("longvarcharColumn", longvarcharColumn);
+        beforePropertyWrite("longvarcharColumn", this.longvarcharColumn, 
longvarcharColumn);
+        this.longvarcharColumn = longvarcharColumn;
     }
+
     public String getLongvarcharColumn() {
-        return (String)readProperty("longvarcharColumn");
+        beforePropertyRead("longvarcharColumn");
+        return longvarcharColumn;
     }
 
     public void setNcharColumn(String ncharColumn) {
-        writeProperty("ncharColumn", ncharColumn);
+        beforePropertyWrite("ncharColumn", this.ncharColumn, ncharColumn);
+        this.ncharColumn = ncharColumn;
     }
+
     public String getNcharColumn() {
-        return (String)readProperty("ncharColumn");
+        beforePropertyRead("ncharColumn");
+        return ncharColumn;
     }
 
     public void setNumericColumn(BigDecimal numericColumn) {
-        writeProperty("numericColumn", numericColumn);
+        beforePropertyWrite("numericColumn", this.numericColumn, 
numericColumn);
+        this.numericColumn = numericColumn;
     }
+
     public BigDecimal getNumericColumn() {
-        return (BigDecimal)readProperty("numericColumn");
+        beforePropertyRead("numericColumn");
+        return numericColumn;
     }
 
     public void setNvarcharColumn(String nvarcharColumn) {
-        writeProperty("nvarcharColumn", nvarcharColumn);
+        beforePropertyWrite("nvarcharColumn", this.nvarcharColumn, 
nvarcharColumn);
+        this.nvarcharColumn = nvarcharColumn;
     }
+
     public String getNvarcharColumn() {
-        return (String)readProperty("nvarcharColumn");
+        beforePropertyRead("nvarcharColumn");
+        return nvarcharColumn;
     }
 
     public void setRealColumn(Float realColumn) {
-        writeProperty("realColumn", realColumn);
+        beforePropertyWrite("realColumn", this.realColumn, realColumn);
+        this.realColumn = realColumn;
     }
+
     public Float getRealColumn() {
-        return (Float)readProperty("realColumn");
+        beforePropertyRead("realColumn");
+        return realColumn;
     }
 
     public void setSmallintColumn(Short smallintColumn) {
-        writeProperty("smallintColumn", smallintColumn);
+        beforePropertyWrite("smallintColumn", this.smallintColumn, 
smallintColumn);
+        this.smallintColumn = smallintColumn;
     }
+
     public Short getSmallintColumn() {
-        return (Short)readProperty("smallintColumn");
+        beforePropertyRead("smallintColumn");
+        return smallintColumn;
     }
 
     public void setTimeColumn(Date timeColumn) {
-        writeProperty("timeColumn", timeColumn);
+        beforePropertyWrite("timeColumn", this.timeColumn, timeColumn);
+        this.timeColumn = timeColumn;
     }
+
     public Date getTimeColumn() {
-        return (Date)readProperty("timeColumn");
+        beforePropertyRead("timeColumn");
+        return timeColumn;
     }
 
     public void setTimestampColumn(Date timestampColumn) {
-        writeProperty("timestampColumn", timestampColumn);
+        beforePropertyWrite("timestampColumn", this.timestampColumn, 
timestampColumn);
+        this.timestampColumn = timestampColumn;
     }
+
     public Date getTimestampColumn() {
-        return (Date)readProperty("timestampColumn");
+        beforePropertyRead("timestampColumn");
+        return timestampColumn;
     }
 
     public void setTinyintColumn(Byte tinyintColumn) {
-        writeProperty("tinyintColumn", tinyintColumn);
+        beforePropertyWrite("tinyintColumn", this.tinyintColumn, 
tinyintColumn);
+        this.tinyintColumn = tinyintColumn;
     }
+
     public Byte getTinyintColumn() {
-        return (Byte)readProperty("tinyintColumn");
+        beforePropertyRead("tinyintColumn");
+        return tinyintColumn;
     }
 
     public void setVarcharColumn(String varcharColumn) {
-        writeProperty("varcharColumn", varcharColumn);
+        beforePropertyWrite("varcharColumn", this.varcharColumn, 
varcharColumn);
+        this.varcharColumn = varcharColumn;
     }
+
     public String getVarcharColumn() {
-        return (String)readProperty("varcharColumn");
+        beforePropertyRead("varcharColumn");
+        return varcharColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "bigintColumn":
+                return this.bigintColumn;
+            case "bitColumn":
+                return this.bitColumn;
+            case "booleanColumn":
+                return this.booleanColumn;
+            case "charColumn":
+                return this.charColumn;
+            case "dateColumn":
+                return this.dateColumn;
+            case "decimalColumn":
+                return this.decimalColumn;
+            case "doubleColumn":
+                return this.doubleColumn;
+            case "floatColumn":
+                return this.floatColumn;
+            case "integerColumn":
+                return this.integerColumn;
+            case "longnvarcharColumn":
+                return this.longnvarcharColumn;
+            case "longvarcharColumn":
+                return this.longvarcharColumn;
+            case "ncharColumn":
+                return this.ncharColumn;
+            case "numericColumn":
+                return this.numericColumn;
+            case "nvarcharColumn":
+                return this.nvarcharColumn;
+            case "realColumn":
+                return this.realColumn;
+            case "smallintColumn":
+                return this.smallintColumn;
+            case "timeColumn":
+                return this.timeColumn;
+            case "timestampColumn":
+                return this.timestampColumn;
+            case "tinyintColumn":
+                return this.tinyintColumn;
+            case "varcharColumn":
+                return this.varcharColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "bigintColumn":
+                this.bigintColumn = (Long)val;
+                break;
+            case "bitColumn":
+                this.bitColumn = (Boolean)val;
+                break;
+            case "booleanColumn":
+                this.booleanColumn = (Boolean)val;
+                break;
+            case "charColumn":
+                this.charColumn = (String)val;
+                break;
+            case "dateColumn":
+                this.dateColumn = (Date)val;
+                break;
+            case "decimalColumn":
+                this.decimalColumn = (BigDecimal)val;
+                break;
+            case "doubleColumn":
+                this.doubleColumn = (Double)val;
+                break;
+            case "floatColumn":
+                this.floatColumn = (Float)val;
+                break;
+            case "integerColumn":
+                this.integerColumn = (Integer)val;
+                break;
+            case "longnvarcharColumn":
+                this.longnvarcharColumn = (String)val;
+                break;
+            case "longvarcharColumn":
+                this.longvarcharColumn = (String)val;
+                break;
+            case "ncharColumn":
+                this.ncharColumn = (String)val;
+                break;
+            case "numericColumn":
+                this.numericColumn = (BigDecimal)val;
+                break;
+            case "nvarcharColumn":
+                this.nvarcharColumn = (String)val;
+                break;
+            case "realColumn":
+                this.realColumn = (Float)val;
+                break;
+            case "smallintColumn":
+                this.smallintColumn = (Short)val;
+                break;
+            case "timeColumn":
+                this.timeColumn = (Date)val;
+                break;
+            case "timestampColumn":
+                this.timestampColumn = (Date)val;
+                break;
+            case "tinyintColumn":
+                this.tinyintColumn = (Byte)val;
+                break;
+            case "varcharColumn":
+                this.varcharColumn = (String)val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(bigintColumn);
+        out.writeObject(bitColumn);
+        out.writeObject(booleanColumn);
+        out.writeObject(charColumn);
+        out.writeObject(dateColumn);
+        out.writeObject(decimalColumn);
+        out.writeObject(doubleColumn);
+        out.writeObject(floatColumn);
+        out.writeObject(integerColumn);
+        out.writeObject(longnvarcharColumn);
+        out.writeObject(longvarcharColumn);
+        out.writeObject(ncharColumn);
+        out.writeObject(numericColumn);
+        out.writeObject(nvarcharColumn);
+        out.writeObject(realColumn);
+        out.writeObject(smallintColumn);
+        out.writeObject(timeColumn);
+        out.writeObject(timestampColumn);
+        out.writeObject(tinyintColumn);
+        out.writeObject(varcharColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        bigintColumn = (Long)in.readObject();
+        bitColumn = (Boolean)in.readObject();
+        booleanColumn = (Boolean)in.readObject();
+        charColumn = (String)in.readObject();
+        dateColumn = (Date)in.readObject();
+        decimalColumn = (BigDecimal)in.readObject();
+        doubleColumn = (Double)in.readObject();
+        floatColumn = (Float)in.readObject();
+        integerColumn = (Integer)in.readObject();
+        longnvarcharColumn = (String)in.readObject();
+        longvarcharColumn = (String)in.readObject();
+        ncharColumn = (String)in.readObject();
+        numericColumn = (BigDecimal)in.readObject();
+        nvarcharColumn = (String)in.readObject();
+        realColumn = (Float)in.readObject();
+        smallintColumn = (Short)in.readObject();
+        timeColumn = (Date)in.readObject();
+        timestampColumn = (Date)in.readObject();
+        tinyintColumn = (Byte)in.readObject();
+        varcharColumn = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap2.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap2.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap2.java
index c4b9d29..99d82d1 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap2.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMap2.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.return_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.exp.Property;
 
@@ -20,32 +24,120 @@ public abstract class _ReturnTypesMap2 extends 
CayenneDataObject {
     public static final Property<byte[]> LONGVARBINARY_COLUMN = 
Property.create("longvarbinaryColumn", byte[].class);
     public static final Property<byte[]> VARBINARY_COLUMN = 
Property.create("varbinaryColumn", byte[].class);
 
+    protected byte[] binaryColumn;
+    protected byte[] blobColumn;
+    protected byte[] longvarbinaryColumn;
+    protected byte[] varbinaryColumn;
+
+
     public void setBinaryColumn(byte[] binaryColumn) {
-        writeProperty("binaryColumn", binaryColumn);
+        beforePropertyWrite("binaryColumn", this.binaryColumn, binaryColumn);
+        this.binaryColumn = binaryColumn;
     }
+
     public byte[] getBinaryColumn() {
-        return (byte[])readProperty("binaryColumn");
+        beforePropertyRead("binaryColumn");
+        return binaryColumn;
     }
 
     public void setBlobColumn(byte[] blobColumn) {
-        writeProperty("blobColumn", blobColumn);
+        beforePropertyWrite("blobColumn", this.blobColumn, blobColumn);
+        this.blobColumn = blobColumn;
     }
+
     public byte[] getBlobColumn() {
-        return (byte[])readProperty("blobColumn");
+        beforePropertyRead("blobColumn");
+        return blobColumn;
     }
 
     public void setLongvarbinaryColumn(byte[] longvarbinaryColumn) {
-        writeProperty("longvarbinaryColumn", longvarbinaryColumn);
+        beforePropertyWrite("longvarbinaryColumn", this.longvarbinaryColumn, 
longvarbinaryColumn);
+        this.longvarbinaryColumn = longvarbinaryColumn;
     }
+
     public byte[] getLongvarbinaryColumn() {
-        return (byte[])readProperty("longvarbinaryColumn");
+        beforePropertyRead("longvarbinaryColumn");
+        return longvarbinaryColumn;
     }
 
     public void setVarbinaryColumn(byte[] varbinaryColumn) {
-        writeProperty("varbinaryColumn", varbinaryColumn);
+        beforePropertyWrite("varbinaryColumn", this.varbinaryColumn, 
varbinaryColumn);
+        this.varbinaryColumn = varbinaryColumn;
     }
+
     public byte[] getVarbinaryColumn() {
-        return (byte[])readProperty("varbinaryColumn");
+        beforePropertyRead("varbinaryColumn");
+        return varbinaryColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "binaryColumn":
+                return this.binaryColumn;
+            case "blobColumn":
+                return this.blobColumn;
+            case "longvarbinaryColumn":
+                return this.longvarbinaryColumn;
+            case "varbinaryColumn":
+                return this.varbinaryColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "binaryColumn":
+                this.binaryColumn = (byte[])val;
+                break;
+            case "blobColumn":
+                this.blobColumn = (byte[])val;
+                break;
+            case "longvarbinaryColumn":
+                this.longvarbinaryColumn = (byte[])val;
+                break;
+            case "varbinaryColumn":
+                this.varbinaryColumn = (byte[])val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(binaryColumn);
+        out.writeObject(blobColumn);
+        out.writeObject(longvarbinaryColumn);
+        out.writeObject(varbinaryColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        binaryColumn = (byte[])in.readObject();
+        blobColumn = (byte[])in.readObject();
+        longvarbinaryColumn = (byte[])in.readObject();
+        varbinaryColumn = (byte[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMapLobs1.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMapLobs1.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMapLobs1.java
index 33993bc..8bff54e 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMapLobs1.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/return_types/auto/_ReturnTypesMapLobs1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.return_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.exp.Property;
 
@@ -18,18 +22,84 @@ public abstract class _ReturnTypesMapLobs1 extends 
CayenneDataObject {
     public static final Property<String> CLOB_COLUMN = 
Property.create("clobColumn", String.class);
     public static final Property<String> NCLOB_COLUMN = 
Property.create("nclobColumn", String.class);
 
+    protected String clobColumn;
+    protected String nclobColumn;
+
+
     public void setClobColumn(String clobColumn) {
-        writeProperty("clobColumn", clobColumn);
+        beforePropertyWrite("clobColumn", this.clobColumn, clobColumn);
+        this.clobColumn = clobColumn;
     }
+
     public String getClobColumn() {
-        return (String)readProperty("clobColumn");
+        beforePropertyRead("clobColumn");
+        return clobColumn;
     }
 
     public void setNclobColumn(String nclobColumn) {
-        writeProperty("nclobColumn", nclobColumn);
+        beforePropertyWrite("nclobColumn", this.nclobColumn, nclobColumn);
+        this.nclobColumn = nclobColumn;
     }
+
     public String getNclobColumn() {
-        return (String)readProperty("nclobColumn");
+        beforePropertyRead("nclobColumn");
+        return nclobColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "clobColumn":
+                return this.clobColumn;
+            case "nclobColumn":
+                return this.nclobColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "clobColumn":
+                this.clobColumn = (String)val;
+                break;
+            case "nclobColumn":
+                this.nclobColumn = (String)val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeObject(clobColumn);
+        out.writeObject(nclobColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        super.readState(in);
+        clobColumn = (String)in.readObject();
+        nclobColumn = (String)in.readObject();
     }
 
 }

Reply via email to