You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/08/11 07:54:38 UTC

[01/18] cayenne git commit: CAY-2330 Field based data objects

Repository: cayenne
Updated Branches:
  refs/heads/master caaeb99bf -> 7b762e9a3


http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
index f4a84f3..2a01c13 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _RWCompoundPainting extends CayenneDataObject {
+public abstract class _RWCompoundPainting extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,25 +24,102 @@ public abstract class _RWCompoundPainting extends CayenneDataObject {
     public static final Property<String> PAINTING_TITLE = Property.create("paintingTitle", String.class);
     public static final Property<String> TEXT_REVIEW = Property.create("textReview", String.class);
 
+    protected BigDecimal estimatedPrice;
+    protected String paintingTitle;
+    protected String textReview;
+
+
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
-        writeProperty("estimatedPrice", estimatedPrice);
+        beforePropertyWrite("estimatedPrice", this.estimatedPrice, estimatedPrice);
+        this.estimatedPrice = estimatedPrice;
     }
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
     public void setTextReview(String textReview) {
-        writeProperty("textReview", textReview);
+        beforePropertyWrite("textReview", this.textReview, textReview);
+        this.textReview = textReview;
     }
+
     public String getTextReview() {
-        return (String)readProperty("textReview");
+        beforePropertyRead("textReview");
+        return textReview;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "textReview":
+                return this.textReview;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "textReview":
+                this.textReview = (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(estimatedPrice);
+        out.writeObject(paintingTitle);
+        out.writeObject(textReview);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        estimatedPrice = (BigDecimal)in.readObject();
+        paintingTitle = (String)in.readObject();
+        textReview = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
index 9029232..44f0d97 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.testmap.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SubPainting extends CayenneDataObject {
+public abstract class _SubPainting extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _SubPainting extends CayenneDataObject {
 
     public static final Property<String> PAINTING_TITLE = Property.create("paintingTitle", String.class);
 
+    protected String paintingTitle;
+
+
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "paintingTitle":
+                return this.paintingTitle;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "paintingTitle":
+                this.paintingTitle = (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(paintingTitle);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        paintingTitle = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
index ca0a68e..de58c44 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.things.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.CayenneDataObject;
@@ -25,11 +28,20 @@ public abstract class _Bag extends CayenneDataObject {
     public static final Property<List<Box>> BOXES = Property.create("boxes", List.class);
     public static final Property<List<Thing>> THINGS = Property.create("things", List.class);
 
+    protected String name;
+
+    protected Object balls;
+    protected Object boxes;
+    protected Object things;
+
     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;
     }
 
     @SuppressWarnings("unchecked")
@@ -37,23 +49,92 @@ public abstract class _Bag extends CayenneDataObject {
         return (List<Ball>)readProperty("balls");
     }
 
-
     public void addToBoxes(Box obj) {
         addToManyTarget("boxes", obj, true);
     }
+
     public void removeFromBoxes(Box obj) {
         removeToManyTarget("boxes", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Box> getBoxes() {
         return (List<Box>)readProperty("boxes");
     }
 
-
     @SuppressWarnings("unchecked")
     public List<Thing> getThings() {
         return (List<Thing>)readProperty("things");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "balls":
+                return this.balls;
+            case "boxes":
+                return this.boxes;
+            case "things":
+                return this.things;
+            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 "balls":
+                this.balls = val;
+                break;
+            case "boxes":
+                this.boxes = val;
+                break;
+            case "things":
+                this.things = 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(balls);
+        out.writeObject(boxes);
+        out.writeObject(things);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        balls = in.readObject();
+        boxes = in.readObject();
+        things = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
index 6ecb6de..cffdcc9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.things.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.things.Box;
@@ -22,18 +26,30 @@ public abstract class _Ball extends CayenneDataObject {
     public static final Property<Box> BOX = Property.create("box", Box.class);
     public static final Property<Thing> THING = Property.create("thing", Thing.class);
 
+    protected Integer thingVolume;
+    protected Integer thingWeight;
+
+    protected Object box;
+    protected Object thing;
+
     public void setThingVolume(Integer thingVolume) {
-        writeProperty("thingVolume", thingVolume);
+        beforePropertyWrite("thingVolume", this.thingVolume, thingVolume);
+        this.thingVolume = thingVolume;
     }
+
     public Integer getThingVolume() {
-        return (Integer)readProperty("thingVolume");
+        beforePropertyRead("thingVolume");
+        return thingVolume;
     }
 
     public void setThingWeight(Integer thingWeight) {
-        writeProperty("thingWeight", thingWeight);
+        beforePropertyWrite("thingWeight", this.thingWeight, thingWeight);
+        this.thingWeight = thingWeight;
     }
+
     public Integer getThingWeight() {
-        return (Integer)readProperty("thingWeight");
+        beforePropertyRead("thingWeight");
+        return thingWeight;
     }
 
     public void setBox(Box box) {
@@ -44,7 +60,6 @@ public abstract class _Ball extends CayenneDataObject {
         return (Box)readProperty("box");
     }
 
-
     public void setThing(Thing thing) {
         setToOneTarget("thing", thing, true);
     }
@@ -53,5 +68,74 @@ public abstract class _Ball extends CayenneDataObject {
         return (Thing)readProperty("thing");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "thingVolume":
+                return this.thingVolume;
+            case "thingWeight":
+                return this.thingWeight;
+            case "box":
+                return this.box;
+            case "thing":
+                return this.thing;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "thingVolume":
+                this.thingVolume = (Integer)val;
+                break;
+            case "thingWeight":
+                this.thingWeight = (Integer)val;
+                break;
+            case "box":
+                this.box = val;
+                break;
+            case "thing":
+                this.thing = 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(thingVolume);
+        out.writeObject(thingWeight);
+        out.writeObject(box);
+        out.writeObject(thing);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        thingVolume = (Integer)in.readObject();
+        thingWeight = (Integer)in.readObject();
+        box = in.readObject();
+        thing = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
index 25d42ca..9a9b09e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.things.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.CayenneDataObject;
@@ -27,11 +30,21 @@ public abstract class _Box extends CayenneDataObject {
     public static final Property<BoxInfo> BOX_INFO = Property.create("boxInfo", BoxInfo.class);
     public static final Property<List<Thing>> THINGS = Property.create("things", List.class);
 
+    protected String name;
+
+    protected Object bag;
+    protected Object balls;
+    protected Object boxInfo;
+    protected Object things;
+
     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 setBag(Bag bag) {
@@ -42,19 +55,19 @@ public abstract class _Box extends CayenneDataObject {
         return (Bag)readProperty("bag");
     }
 
-
     public void addToBalls(Ball obj) {
         addToManyTarget("balls", obj, true);
     }
+
     public void removeFromBalls(Ball obj) {
         removeToManyTarget("balls", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Ball> getBalls() {
         return (List<Ball>)readProperty("balls");
     }
 
-
     public void setBoxInfo(BoxInfo boxInfo) {
         setToOneTarget("boxInfo", boxInfo, true);
     }
@@ -63,11 +76,86 @@ public abstract class _Box extends CayenneDataObject {
         return (BoxInfo)readProperty("boxInfo");
     }
 
-
     @SuppressWarnings("unchecked")
     public List<Thing> getThings() {
         return (List<Thing>)readProperty("things");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "bag":
+                return this.bag;
+            case "balls":
+                return this.balls;
+            case "boxInfo":
+                return this.boxInfo;
+            case "things":
+                return this.things;
+            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 "bag":
+                this.bag = val;
+                break;
+            case "balls":
+                this.balls = val;
+                break;
+            case "boxInfo":
+                this.boxInfo = val;
+                break;
+            case "things":
+                this.things = 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(bag);
+        out.writeObject(balls);
+        out.writeObject(boxInfo);
+        out.writeObject(things);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        bag = in.readObject();
+        balls = in.readObject();
+        boxInfo = in.readObject();
+        things = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
index 5242a02..2a23b29 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.things.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.things.Box;
@@ -19,11 +23,18 @@ public abstract class _BoxInfo extends CayenneDataObject {
     public static final Property<String> COLOR = Property.create("color", String.class);
     public static final Property<Box> BOX = Property.create("box", Box.class);
 
+    protected String color;
+
+    protected Object box;
+
     public void setColor(String color) {
-        writeProperty("color", color);
+        beforePropertyWrite("color", this.color, color);
+        this.color = color;
     }
+
     public String getColor() {
-        return (String)readProperty("color");
+        beforePropertyRead("color");
+        return color;
     }
 
     public void setBox(Box box) {
@@ -34,5 +45,60 @@ public abstract class _BoxInfo extends CayenneDataObject {
         return (Box)readProperty("box");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "color":
+                return this.color;
+            case "box":
+                return this.box;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "color":
+                this.color = (String)val;
+                break;
+            case "box":
+                this.box = 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(color);
+        out.writeObject(box);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        color = (String)in.readObject();
+        box = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
index 29b14d9..d184188 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.things.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.CayenneDataObject;
@@ -24,18 +27,30 @@ public abstract class _Thing extends CayenneDataObject {
     public static final Property<Ball> BALL = Property.create("ball", Ball.class);
     public static final Property<List<Box>> BOX = Property.create("box", List.class);
 
+    protected Integer volume;
+    protected Integer weight;
+
+    protected Object ball;
+    protected Object box;
+
     public void setVolume(Integer volume) {
-        writeProperty("volume", volume);
+        beforePropertyWrite("volume", this.volume, volume);
+        this.volume = volume;
     }
+
     public Integer getVolume() {
-        return (Integer)readProperty("volume");
+        beforePropertyRead("volume");
+        return volume;
     }
 
     public void setWeight(Integer weight) {
-        writeProperty("weight", weight);
+        beforePropertyWrite("weight", this.weight, weight);
+        this.weight = weight;
     }
+
     public Integer getWeight() {
-        return (Integer)readProperty("weight");
+        beforePropertyRead("weight");
+        return weight;
     }
 
     public void setBall(Ball ball) {
@@ -46,11 +61,79 @@ public abstract class _Thing extends CayenneDataObject {
         return (Ball)readProperty("ball");
     }
 
-
     @SuppressWarnings("unchecked")
     public List<Box> getBox() {
         return (List<Box>)readProperty("box");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "volume":
+                return this.volume;
+            case "weight":
+                return this.weight;
+            case "ball":
+                return this.ball;
+            case "box":
+                return this.box;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "volume":
+                this.volume = (Integer)val;
+                break;
+            case "weight":
+                this.weight = (Integer)val;
+                break;
+            case "ball":
+                this.ball = val;
+                break;
+            case "box":
+                this.box = 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(volume);
+        out.writeObject(weight);
+        out.writeObject(ball);
+        out.writeObject(box);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        volume = (Integer)in.readObject();
+        weight = (Integer)in.readObject();
+        ball = in.readObject();
+        box = in.readObject();
+    }
 
 }

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

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
index de114e6..a63b36d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.unsupported_distinct_types.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.unsupported_distinct_types.Product;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.unsupported_distinct_types.Product;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Customer extends CayenneDataObject {
+public abstract class _Customer extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _Customer extends CayenneDataObject {
     public static final Property<String> LONGVARCHAR_COL = Property.create("longvarcharCol", String.class);
     public static final Property<List<Product>> ORDER = Property.create("order", List.class);
 
+    protected String longvarcharCol;
+
+    protected Object order;
+
     public void setLongvarcharCol(String longvarcharCol) {
-        writeProperty("longvarcharCol", longvarcharCol);
+        beforePropertyWrite("longvarcharCol", this.longvarcharCol, longvarcharCol);
+        this.longvarcharCol = longvarcharCol;
     }
+
     public String getLongvarcharCol() {
-        return (String)readProperty("longvarcharCol");
+        beforePropertyRead("longvarcharCol");
+        return longvarcharCol;
     }
 
     public void addToOrder(Product obj) {
         addToManyTarget("order", obj, true);
     }
+
     public void removeFromOrder(Product obj) {
         removeToManyTarget("order", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Product> getOrder() {
         return (List<Product>)readProperty("order");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "longvarcharCol":
+                return this.longvarcharCol;
+            case "order":
+                return this.order;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "longvarcharCol":
+                this.longvarcharCol = (String)val;
+                break;
+            case "order":
+                this.order = 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(longvarcharCol);
+        out.writeObject(order);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        longvarcharCol = (String)in.readObject();
+        order = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
index 9739b36..d61e552 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.unsupported_distinct_types.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.unsupported_distinct_types.Customer;
 import org.apache.cayenne.testdo.unsupported_distinct_types.Product;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.unsupported_distinct_types.Product;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Product extends CayenneDataObject {
+public abstract class _Product extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -24,47 +27,129 @@ public abstract class _Product extends CayenneDataObject {
     public static final Property<List<Product>> CONTAINED = Property.create("contained", List.class);
     public static final Property<List<Customer>> ORDER_BY = Property.create("orderBy", List.class);
 
+    protected String longvarcharCol;
+
+    protected Object base;
+    protected Object contained;
+    protected Object orderBy;
+
     public void setLongvarcharCol(String longvarcharCol) {
-        writeProperty("longvarcharCol", longvarcharCol);
+        beforePropertyWrite("longvarcharCol", this.longvarcharCol, longvarcharCol);
+        this.longvarcharCol = longvarcharCol;
     }
+
     public String getLongvarcharCol() {
-        return (String)readProperty("longvarcharCol");
+        beforePropertyRead("longvarcharCol");
+        return longvarcharCol;
     }
 
     public void addToBase(Product obj) {
         addToManyTarget("base", obj, true);
     }
+
     public void removeFromBase(Product obj) {
         removeToManyTarget("base", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Product> getBase() {
         return (List<Product>)readProperty("base");
     }
 
-
     public void addToContained(Product obj) {
         addToManyTarget("contained", obj, true);
     }
+
     public void removeFromContained(Product obj) {
         removeToManyTarget("contained", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Product> getContained() {
         return (List<Product>)readProperty("contained");
     }
 
-
     public void addToOrderBy(Customer obj) {
         addToManyTarget("orderBy", obj, true);
     }
+
     public void removeFromOrderBy(Customer obj) {
         removeToManyTarget("orderBy", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Customer> getOrderBy() {
         return (List<Customer>)readProperty("orderBy");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "longvarcharCol":
+                return this.longvarcharCol;
+            case "base":
+                return this.base;
+            case "contained":
+                return this.contained;
+            case "orderBy":
+                return this.orderBy;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "longvarcharCol":
+                this.longvarcharCol = (String)val;
+                break;
+            case "base":
+                this.base = val;
+                break;
+            case "contained":
+                this.contained = val;
+                break;
+            case "orderBy":
+                this.orderBy = 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(longvarcharCol);
+        out.writeObject(base);
+        out.writeObject(contained);
+        out.writeObject(orderBy);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        longvarcharCol = (String)in.readObject();
+        base = in.readObject();
+        contained = in.readObject();
+        orderBy = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
index 1550c32..2f77d87 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.uuid.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.UUID;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _UuidPkEntity extends CayenneDataObject {
+public abstract class _UuidPkEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _UuidPkEntity extends CayenneDataObject {
 
     public static final Property<UUID> ID = Property.create("id", UUID.class);
 
+    protected UUID id;
+
+
     public void setId(UUID id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public UUID getId() {
-        return (UUID)readProperty("id");
+        beforePropertyRead("id");
+        return id;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "id":
+                return this.id;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "id":
+                this.id = (UUID)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(id);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        id = (UUID)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
index c5f0671..3342cb6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.uuid.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.UUID;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _UuidTestEntity extends CayenneDataObject {
+public abstract class _UuidTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _UuidTestEntity extends CayenneDataObject {
 
     public static final Property<UUID> UUID = Property.create("uuid", UUID.class);
 
+    protected UUID uuid;
+
+
     public void setUuid(UUID uuid) {
-        writeProperty("uuid", uuid);
+        beforePropertyWrite("uuid", this.uuid, uuid);
+        this.uuid = uuid;
     }
+
     public UUID getUuid() {
-        return (UUID)readProperty("uuid");
+        beforePropertyRead("uuid");
+        return uuid;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "uuid":
+                return this.uuid;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "uuid":
+                this.uuid = (UUID)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(uuid);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        uuid = (UUID)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
index 3f6f3ca..b4803c4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.weighted_sort.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.weighted_sort.SortRoot;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.weighted_sort.SortRoot;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SortDep extends CayenneDataObject {
+public abstract class _SortDep extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _SortDep extends CayenneDataObject {
 
     public static final Property<SortRoot> ROOT = Property.create("root", SortRoot.class);
 
+
+    protected Object root;
+
     public void setRoot(SortRoot root) {
         setToOneTarget("root", root, true);
     }
@@ -26,5 +33,53 @@ public abstract class _SortDep extends CayenneDataObject {
         return (SortRoot)readProperty("root");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "root":
+                return this.root;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "root":
+                this.root = 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(root);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        root = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
index 06d8d60..67b4d45 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.weighted_sort.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.weighted_sort.SortDep;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.weighted_sort.SortDep;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SortRoot extends CayenneDataObject {
+public abstract class _SortRoot extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _SortRoot extends CayenneDataObject {
 
     public static final Property<List<SortDep>> DEPS = Property.create("deps", List.class);
 
+
+    protected Object deps;
+
     public void addToDeps(SortDep obj) {
         addToManyTarget("deps", obj, true);
     }
+
     public void removeFromDeps(SortDep obj) {
         removeToManyTarget("deps", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<SortDep> getDeps() {
         return (List<SortDep>)readProperty("deps");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            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 "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(deps);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        deps = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/resources/testmap.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/testmap.map.xml b/cayenne-server/src/test/resources/testmap.map.xml
index 8e082d9..3805003 100644
--- a/cayenne-server/src/test/resources/testmap.map.xml
+++ b/cayenne-server/src/test/resources/testmap.map.xml
@@ -109,7 +109,7 @@
 		<obj-attribute name="paintingTitle" type="java.lang.String" db-attribute-path="PAINTING_TITLE"/>
 		<obj-attribute name="textReview" type="java.lang.String" db-attribute-path="toPaintingInfo.TEXT_REVIEW"/>
 	</obj-entity>
-	<obj-entity name="CompoundPaintingLongNames" className="org.apache.cayenne.testdo.testmap.CompoundPaintingLongNames" clientClassName="test.client.CompoundPaintingLongNames" dbEntityName="PAINTING" superClassName="org.apache.cayenne.CayenneDataObject" clientSuperClassName="org.apache.cayenne.PersistentObject">
+	<obj-entity name="CompoundPaintingLongNames" className="org.apache.cayenne.testdo.testmap.CompoundPaintingLongNames" clientClassName="test.client.CompoundPaintingLongNames" dbEntityName="PAINTING" clientSuperClassName="org.apache.cayenne.PersistentObject">
 		<obj-attribute name="artistLongName" type="java.lang.String" db-attribute-path="toArtist.ARTIST_NAME"/>
 		<obj-attribute name="estimatedPrice" type="java.math.BigDecimal" db-attribute-path="ESTIMATED_PRICE"/>
 		<obj-attribute name="galleryLongName" type="java.lang.String" db-attribute-path="toGallery.GALLERY_NAME"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 4192d30..7a373a0 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
 Changes/New Features:
 
 CAY-2329 Update project dependencies
+CAY-2330 Field based data objects
 
 Bug Fixes:
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/UPGRADE.txt b/docs/doc/src/main/resources/UPGRADE.txt
index 45ae5d1..3594439 100644
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@ -5,6 +5,14 @@ IMPORTANT: be sure to read all notes for the intermediate releases between your
            current release and the release you are upgrading to.
 -------------------------------------------------------------------------------
 
+UPGRADING TO 4.1.M1
+
+* Per CAY-2330 Field-based data objects are introduced and enabled by default.
+      Your existing code will continue to work, but in order to get benefits from this feature you should
+      regenerate code via Modeler ("Tools" -> "Generate Classes") or cgen tools in Maven/Ant/Gradle plugins.
+      Also note that serialization format of old data objects have changed, make sure you don't use serialization
+      form to store your objects.
+
 UPGRADING TO 4.0.B1
 
 * Per CAY-2302 postcommit module and all it's internals renamed to commitlog.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
----------------------------------------------------------------------
diff --git a/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java b/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
index dfb9d8f..2142389 100644
--- a/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
+++ b/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
@@ -57,7 +57,7 @@ public class CayenneGeneratorIntegrationTest {
         startTest("single-classes1");
 
         assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
-                "CayenneDataObject");
+                "BaseDataObject");
         assertExists("org/apache/cayenne/testdo/testmap/_Artist.java");
     }
 
@@ -66,7 +66,7 @@ public class CayenneGeneratorIntegrationTest {
     public void testSingleClasses2() throws Exception {
         startTest("single-classes2");
 
-        assertContents("Artist.java", "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+        assertContents("Artist.java", "Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
         assertExists("_Artist.java");
         assertExists("org/apache/cayenne/testdo/testmap/Artist.java");
     }
@@ -79,7 +79,7 @@ public class CayenneGeneratorIntegrationTest {
         assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
                 "_Artist");
         assertContents("org/apache/cayenne/testdo/testmap/auto/_Artist.java", "_Artist",
-                "org.apache.cayenne.testdo.testmap.auto", "CayenneDataObject");
+                "org.apache.cayenne.testdo.testmap.auto", "BaseDataObject");
     }
 
     /** Test pairs generation in the same directory. */
@@ -88,7 +88,7 @@ public class CayenneGeneratorIntegrationTest {
         startTest("pairs2");
 
         assertContents("Artist.java", "Artist", "org.apache.cayenne.testdo.testmap", "_Artist");
-        assertContents("_Artist.java", "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+        assertContents("_Artist.java", "_Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
         assertExists("org/apache/cayenne/testdo/testmap/Artist.java");
     }
 
@@ -103,7 +103,7 @@ public class CayenneGeneratorIntegrationTest {
         assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
                 "_Artist");
         assertContents("org/apache/cayenne/testdo/testmap/superart/_Artist.java", "_Artist",
-                "org.apache.cayenne.testdo.testmap.superart", "CayenneDataObject");
+                "org.apache.cayenne.testdo.testmap.superart", "BaseDataObject");
     }
 
     @Test
@@ -123,7 +123,7 @@ public class CayenneGeneratorIntegrationTest {
         assertContents("org/apache/cayenne/testdo/embeddable/EmbedEntity1.java", "EmbedEntity1",
                 "org.apache.cayenne.testdo.embeddable", "_EmbedEntity1");
         assertContents("org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java", "_EmbedEntity1",
-                "org.apache.cayenne.testdo.embeddable.auto", "CayenneDataObject");
+                "org.apache.cayenne.testdo.embeddable.auto", "BaseDataObject");
         assertContents("org/apache/cayenne/testdo/embeddable/Embeddable1.java", "Embeddable1",
                 "org.apache.cayenne.testdo.embeddable", "_Embeddable1");
         assertContents("org/apache/cayenne/testdo/embeddable/auto/_Embeddable1.java", "_Embeddable1",


[07/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
index aa12f80..e7dba28 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance_people.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.inheritance_people.PersonNotes;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.inheritance_people.PersonNotes;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _AbstractPerson extends CayenneDataObject {
+public abstract class _AbstractPerson extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _AbstractPerson extends CayenneDataObject {
     public static final Property<String> PERSON_TYPE = Property.create("personType", String.class);
     public static final Property<List<PersonNotes>> NOTES = Property.create("notes", List.class);
 
+    protected String name;
+    protected String personType;
+
+    protected Object notes;
+
     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 setPersonType(String personType) {
-        writeProperty("personType", personType);
+        beforePropertyWrite("personType", this.personType, personType);
+        this.personType = personType;
     }
+
     public String getPersonType() {
-        return (String)readProperty("personType");
+        beforePropertyRead("personType");
+        return personType;
     }
 
     public void addToNotes(PersonNotes obj) {
         addToManyTarget("notes", obj, true);
     }
+
     public void removeFromNotes(PersonNotes obj) {
         removeToManyTarget("notes", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<PersonNotes> getNotes() {
         return (List<PersonNotes>)readProperty("notes");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "personType":
+                return this.personType;
+            case "notes":
+                return this.notes;
+            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 "personType":
+                this.personType = (String)val;
+                break;
+            case "notes":
+                this.notes = 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(personType);
+        out.writeObject(notes);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        personType = (String)in.readObject();
+        notes = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
index 762e3be..a8e18db 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_people.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.inheritance_people.Employee;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.inheritance_people.Employee;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Address extends CayenneDataObject {
+public abstract class _Address extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _Address extends CayenneDataObject {
     public static final Property<String> CITY = Property.create("city", String.class);
     public static final Property<Employee> TO_EMPLOYEE = Property.create("toEmployee", Employee.class);
 
+    protected String city;
+
+    protected Object toEmployee;
+
     public void setCity(String city) {
-        writeProperty("city", city);
+        beforePropertyWrite("city", this.city, city);
+        this.city = city;
     }
+
     public String getCity() {
-        return (String)readProperty("city");
+        beforePropertyRead("city");
+        return city;
     }
 
     public void setToEmployee(Employee toEmployee) {
@@ -34,5 +45,60 @@ public abstract class _Address extends CayenneDataObject {
         return (Employee)readProperty("toEmployee");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "city":
+                return this.city;
+            case "toEmployee":
+                return this.toEmployee;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "city":
+                this.city = (String)val;
+                break;
+            case "toEmployee":
+                this.toEmployee = 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(city);
+        out.writeObject(toEmployee);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        city = (String)in.readObject();
+        toEmployee = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
index 0aa752f..856cfa9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance_people.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.inheritance_people.CustomerRepresentative;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.inheritance_people.CustomerRepresentative;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ClientCompany extends CayenneDataObject {
+public abstract class _ClientCompany extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _ClientCompany extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<CustomerRepresentative>> REPRESENTATIVES = Property.create("representatives", List.class);
 
+    protected String name;
+
+    protected Object representatives;
+
     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 addToRepresentatives(CustomerRepresentative obj) {
         addToManyTarget("representatives", obj, true);
     }
+
     public void removeFromRepresentatives(CustomerRepresentative obj) {
         removeToManyTarget("representatives", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CustomerRepresentative> getRepresentatives() {
         return (List<CustomerRepresentative>)readProperty("representatives");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "representatives":
+                return this.representatives;
+            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 "representatives":
+                this.representatives = 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(representatives);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        representatives = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
index 4aac968..a2e0f3b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_people.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_people.AbstractPerson;
 import org.apache.cayenne.testdo.inheritance_people.ClientCompany;
@@ -19,11 +23,18 @@ public abstract class _CustomerRepresentative extends AbstractPerson {
     public static final Property<String> CLIENT_CONTACT_TYPE = Property.create("clientContactType", String.class);
     public static final Property<ClientCompany> TO_CLIENT_COMPANY = Property.create("toClientCompany", ClientCompany.class);
 
+    protected String clientContactType;
+
+    protected Object toClientCompany;
+
     public void setClientContactType(String clientContactType) {
-        writeProperty("clientContactType", clientContactType);
+        beforePropertyWrite("clientContactType", this.clientContactType, clientContactType);
+        this.clientContactType = clientContactType;
     }
+
     public String getClientContactType() {
-        return (String)readProperty("clientContactType");
+        beforePropertyRead("clientContactType");
+        return clientContactType;
     }
 
     public void setToClientCompany(ClientCompany toClientCompany) {
@@ -34,5 +45,60 @@ public abstract class _CustomerRepresentative extends AbstractPerson {
         return (ClientCompany)readProperty("toClientCompany");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "clientContactType":
+                return this.clientContactType;
+            case "toClientCompany":
+                return this.toClientCompany;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "clientContactType":
+                this.clientContactType = (String)val;
+                break;
+            case "toClientCompany":
+                this.toClientCompany = 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(clientContactType);
+        out.writeObject(toClientCompany);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        clientContactType = (String)in.readObject();
+        toClientCompany = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
index b52592a..b379e04 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance_people.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.inheritance_people.Employee;
 import org.apache.cayenne.testdo.inheritance_people.Manager;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.inheritance_people.Manager;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Department extends CayenneDataObject {
+public abstract class _Department extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,25 +26,34 @@ public abstract class _Department extends CayenneDataObject {
     public static final Property<List<Employee>> EMPLOYEES = Property.create("employees", List.class);
     public static final Property<Manager> TO_MANAGER = Property.create("toManager", Manager.class);
 
+    protected String name;
+
+    protected Object employees;
+    protected Object toManager;
+
     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 addToEmployees(Employee obj) {
         addToManyTarget("employees", obj, true);
     }
+
     public void removeFromEmployees(Employee obj) {
         removeToManyTarget("employees", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Employee> getEmployees() {
         return (List<Employee>)readProperty("employees");
     }
 
-
     public void setToManager(Manager toManager) {
         setToOneTarget("toManager", toManager, true);
     }
@@ -50,5 +62,67 @@ public abstract class _Department extends CayenneDataObject {
         return (Manager)readProperty("toManager");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "employees":
+                return this.employees;
+            case "toManager":
+                return this.toManager;
+            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 "employees":
+                this.employees = val;
+                break;
+            case "toManager":
+                this.toManager = 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(employees);
+        out.writeObject(toManager);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        employees = in.readObject();
+        toManager = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
index 6cebc42..81c6d93 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.inheritance_people.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.exp.Property;
@@ -23,25 +26,34 @@ public abstract class _Employee extends AbstractPerson {
     public static final Property<List<Address>> ADDRESSES = Property.create("addresses", List.class);
     public static final Property<Department> TO_DEPARTMENT = Property.create("toDepartment", Department.class);
 
+    protected Float salary;
+
+    protected Object addresses;
+    protected Object toDepartment;
+
     public void setSalary(Float salary) {
-        writeProperty("salary", salary);
+        beforePropertyWrite("salary", this.salary, salary);
+        this.salary = salary;
     }
+
     public Float getSalary() {
-        return (Float)readProperty("salary");
+        beforePropertyRead("salary");
+        return salary;
     }
 
     public void addToAddresses(Address obj) {
         addToManyTarget("addresses", obj, true);
     }
+
     public void removeFromAddresses(Address obj) {
         removeToManyTarget("addresses", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Address> getAddresses() {
         return (List<Address>)readProperty("addresses");
     }
 
-
     public void setToDepartment(Department toDepartment) {
         setToOneTarget("toDepartment", toDepartment, true);
     }
@@ -50,5 +62,67 @@ public abstract class _Employee extends AbstractPerson {
         return (Department)readProperty("toDepartment");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "salary":
+                return this.salary;
+            case "addresses":
+                return this.addresses;
+            case "toDepartment":
+                return this.toDepartment;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "salary":
+                this.salary = (Float)val;
+                break;
+            case "addresses":
+                this.addresses = val;
+                break;
+            case "toDepartment":
+                this.toDepartment = 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(salary);
+        out.writeObject(addresses);
+        out.writeObject(toDepartment);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        salary = (Float)in.readObject();
+        addresses = in.readObject();
+        toDepartment = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
index b56dd23..cad5dbf 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.inheritance_people.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.exp.Property;
@@ -20,16 +23,69 @@ public abstract class _Manager extends Employee {
 
     public static final Property<List<Department>> MANAGED_DEPARTMENTS = Property.create("managedDepartments", List.class);
 
+
+    protected Object managedDepartments;
+
     public void addToManagedDepartments(Department obj) {
         addToManyTarget("managedDepartments", obj, true);
     }
+
     public void removeFromManagedDepartments(Department obj) {
         removeToManyTarget("managedDepartments", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Department> getManagedDepartments() {
         return (List<Department>)readProperty("managedDepartments");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "managedDepartments":
+                return this.managedDepartments;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "managedDepartments":
+                this.managedDepartments = 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(managedDepartments);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        managedDepartments = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
index 49868b9..951773f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_people.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.inheritance_people.AbstractPerson;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.inheritance_people.AbstractPerson;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _PersonNotes extends CayenneDataObject {
+public abstract class _PersonNotes extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _PersonNotes extends CayenneDataObject {
     public static final Property<String> NOTES = Property.create("notes", String.class);
     public static final Property<AbstractPerson> PERSON = Property.create("person", AbstractPerson.class);
 
+    protected String notes;
+
+    protected Object person;
+
     public void setNotes(String notes) {
-        writeProperty("notes", notes);
+        beforePropertyWrite("notes", this.notes, notes);
+        this.notes = notes;
     }
+
     public String getNotes() {
-        return (String)readProperty("notes");
+        beforePropertyRead("notes");
+        return notes;
     }
 
     public void setPerson(AbstractPerson person) {
@@ -34,5 +45,60 @@ public abstract class _PersonNotes extends CayenneDataObject {
         return (AbstractPerson)readProperty("person");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "notes":
+                return this.notes;
+            case "person":
+                return this.person;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "notes":
+                this.notes = (String)val;
+                break;
+            case "person":
+                this.person = 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(notes);
+        out.writeObject(person);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        notes = (String)in.readObject();
+        person = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
index 4dd6db4..9a2c384 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Iv1Root extends CayenneDataObject {
+public abstract class _Iv1Root extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _Iv1Root extends CayenneDataObject {
     public static final Property<String> DISCRIMINATOR = Property.create("discriminator", String.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String discriminator;
+    protected String name;
+
+
     public void setDiscriminator(String discriminator) {
-        writeProperty("discriminator", discriminator);
+        beforePropertyWrite("discriminator", this.discriminator, discriminator);
+        this.discriminator = discriminator;
     }
+
     public String getDiscriminator() {
-        return (String)readProperty("discriminator");
+        beforePropertyRead("discriminator");
+        return discriminator;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "discriminator":
+                return this.discriminator;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "discriminator":
+                this.discriminator = (String)val;
+                break;
+            case "name":
+                this.name = (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(discriminator);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        discriminator = (String)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
index c758e1a..9087579 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
 
@@ -17,11 +21,66 @@ public abstract class _Iv1Sub1 extends Iv1Root {
 
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String name;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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;
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
index b36cbaf..84434f5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Iv2Root extends CayenneDataObject {
+public abstract class _Iv2Root extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _Iv2Root extends CayenneDataObject {
 
     public static final Property<String> DISCRIMINATOR = Property.create("discriminator", String.class);
 
+    protected String discriminator;
+
+
     public void setDiscriminator(String discriminator) {
-        writeProperty("discriminator", discriminator);
+        beforePropertyWrite("discriminator", this.discriminator, discriminator);
+        this.discriminator = discriminator;
     }
+
     public String getDiscriminator() {
-        return (String)readProperty("discriminator");
+        beforePropertyRead("discriminator");
+        return discriminator;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "discriminator":
+                return this.discriminator;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "discriminator":
+                this.discriminator = (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(discriminator);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        discriminator = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
index fb574b7..7fccf6c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv2Root;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
@@ -18,6 +22,9 @@ public abstract class _Iv2Sub1 extends Iv2Root {
 
     public static final Property<Iv2X> X = Property.create("x", Iv2X.class);
 
+
+    protected Object x;
+
     public void setX(Iv2X x) {
         setToOneTarget("x", x, true);
     }
@@ -26,5 +33,53 @@ public abstract class _Iv2Sub1 extends Iv2Root {
         return (Iv2X)readProperty("x");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "x":
+                return this.x;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "x":
+                this.x = 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(x);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        x = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
index e6b6a57..c43ad20 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 
 /**
  * Class _Iv2X was generated by Cayenne.
@@ -8,11 +12,55 @@ import org.apache.cayenne.CayenneDataObject;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Iv2X extends CayenneDataObject {
+public abstract class _Iv2X extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
     public static final String ID_PK_COLUMN = "ID";
 
 
+
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
index 3eb93a3..021f9e3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvAbstract extends CayenneDataObject {
+public abstract class _IvAbstract extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _IvAbstract extends CayenneDataObject {
 
     public static final Property<String> TYPE = Property.create("type", String.class);
 
+    protected String type;
+
+
     public void setType(String type) {
-        writeProperty("type", type);
+        beforePropertyWrite("type", this.type, type);
+        this.type = type;
     }
+
     public String getType() {
-        return (String)readProperty("type");
+        beforePropertyRead("type");
+        return type;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "type":
+                return this.type;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "type":
+                this.type = (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(type);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
index 59984a8..91b2119 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvBase extends CayenneDataObject {
+public abstract class _IvBase extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _IvBase extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<String> TYPE = Property.create("type", String.class);
 
+    protected String name;
+    protected String type;
+
+
     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 setType(String type) {
-        writeProperty("type", type);
+        beforePropertyWrite("type", this.type, type);
+        this.type = type;
     }
+
     public String getType() {
-        return (String)readProperty("type");
+        beforePropertyRead("type");
+        return type;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "type":
+                return this.type;
+            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 "type":
+                this.type = (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(name);
+        out.writeObject(type);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
index 1fd3765..29dfc23 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
@@ -1,34 +1,19 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
- * Class _IvBase was generated by Cayenne.
+ * Class _IvBaseWithLock was generated by Cayenne.
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvBaseWithLock extends CayenneDataObject {
+public abstract class _IvBaseWithLock extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -37,18 +22,84 @@ public abstract class _IvBaseWithLock extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<String> TYPE = Property.create("type", String.class);
 
+    protected String name;
+    protected String type;
+
+
     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 setType(String type) {
-        writeProperty("type", type);
+        beforePropertyWrite("type", this.type, type);
+        this.type = type;
     }
+
     public String getType() {
-        return (String)readProperty("type");
+        beforePropertyRead("type");
+        return type;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "type":
+                return this.type;
+            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 "type":
+                this.type = (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(name);
+        out.writeObject(type);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
index bd260e1..898c954 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.exp.Property;
@@ -22,25 +25,34 @@ public abstract class _IvConcrete extends IvAbstract {
     public static final Property<List<IvConcrete>> CHILDREN = Property.create("children", List.class);
     public static final Property<IvConcrete> PARENT = Property.create("parent", IvConcrete.class);
 
+    protected String name;
+
+    protected Object children;
+    protected Object parent;
+
     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 addToChildren(IvConcrete obj) {
         addToManyTarget("children", obj, true);
     }
+
     public void removeFromChildren(IvConcrete obj) {
         removeToManyTarget("children", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<IvConcrete> getChildren() {
         return (List<IvConcrete>)readProperty("children");
     }
 
-
     public void setParent(IvConcrete parent) {
         setToOneTarget("parent", parent, true);
     }
@@ -49,5 +61,67 @@ public abstract class _IvConcrete extends IvAbstract {
         return (IvConcrete)readProperty("parent");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "children":
+                return this.children;
+            case "parent":
+                return this.parent;
+            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 "children":
+                this.children = val;
+                break;
+            case "parent":
+                this.parent = 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(children);
+        out.writeObject(parent);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        children = in.readObject();
+        parent = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
index a6aee01..b24df08 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvBase;
 import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
@@ -21,18 +25,30 @@ public abstract class _IvImpl extends IvBase {
     public static final Property<IvOther> OTHER1 = Property.create("other1", IvOther.class);
     public static final Property<IvOther> OTHER2 = Property.create("other2", IvOther.class);
 
+    protected String attr1;
+    protected String attr2;
+
+    protected Object other1;
+    protected Object other2;
+
     public void setAttr1(String attr1) {
-        writeProperty("attr1", attr1);
+        beforePropertyWrite("attr1", this.attr1, attr1);
+        this.attr1 = attr1;
     }
+
     public String getAttr1() {
-        return (String)readProperty("attr1");
+        beforePropertyRead("attr1");
+        return attr1;
     }
 
     public void setAttr2(String attr2) {
-        writeProperty("attr2", attr2);
+        beforePropertyWrite("attr2", this.attr2, attr2);
+        this.attr2 = attr2;
     }
+
     public String getAttr2() {
-        return (String)readProperty("attr2");
+        beforePropertyRead("attr2");
+        return attr2;
     }
 
     public void setOther1(IvOther other1) {
@@ -43,7 +59,6 @@ public abstract class _IvImpl extends IvBase {
         return (IvOther)readProperty("other1");
     }
 
-
     public void setOther2(IvOther other2) {
         setToOneTarget("other2", other2, true);
     }
@@ -52,5 +67,74 @@ public abstract class _IvImpl extends IvBase {
         return (IvOther)readProperty("other2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "attr1":
+                return this.attr1;
+            case "attr2":
+                return this.attr2;
+            case "other1":
+                return this.other1;
+            case "other2":
+                return this.other2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "attr1":
+                this.attr1 = (String)val;
+                break;
+            case "attr2":
+                this.attr2 = (String)val;
+                break;
+            case "other1":
+                this.other1 = val;
+                break;
+            case "other2":
+                this.other2 = 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(attr1);
+        out.writeObject(attr2);
+        out.writeObject(other1);
+        out.writeObject(other2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        attr1 = (String)in.readObject();
+        attr2 = (String)in.readObject();
+        other1 = in.readObject();
+        other2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
index b6836ea..b72749b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
@@ -1,35 +1,20 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
-import org.apache.cayenne.testdo.inheritance_vertical.IvBase;
+import org.apache.cayenne.testdo.inheritance_vertical.IvBaseWithLock;
 import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
 
 /**
- * Class _IvImpl was generated by Cayenne.
+ * Class _IvImplWithLock was generated by Cayenne.
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvImplWithLock extends IvBase {
+public abstract class _IvImplWithLock extends IvBaseWithLock {
 
     private static final long serialVersionUID = 1L; 
 
@@ -38,11 +23,18 @@ public abstract class _IvImplWithLock extends IvBase {
     public static final Property<String> ATTR1 = Property.create("attr1", String.class);
     public static final Property<IvOther> OTHER1 = Property.create("other1", IvOther.class);
 
+    protected String attr1;
+
+    protected Object other1;
+
     public void setAttr1(String attr1) {
-        writeProperty("attr1", attr1);
+        beforePropertyWrite("attr1", this.attr1, attr1);
+        this.attr1 = attr1;
     }
+
     public String getAttr1() {
-        return (String)readProperty("attr1");
+        beforePropertyRead("attr1");
+        return attr1;
     }
 
     public void setOther1(IvOther other1) {
@@ -53,5 +45,60 @@ public abstract class _IvImplWithLock extends IvBase {
         return (IvOther)readProperty("other1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "attr1":
+                return this.attr1;
+            case "other1":
+                return this.other1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "attr1":
+                this.attr1 = (String)val;
+                break;
+            case "other1":
+                this.other1 = 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(attr1);
+        out.writeObject(other1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        attr1 = (String)in.readObject();
+        other1 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
index d3f9aa2..0554293 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
@@ -1,19 +1,22 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.List;
+
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvImpl;
 import org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
 
-import java.util.List;
-
 /**
  * Class _IvOther was generated by Cayenne.
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvOther extends CayenneDataObject {
+public abstract class _IvOther extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,34 +26,92 @@ public abstract class _IvOther extends CayenneDataObject {
     public static final Property<List<IvImpl>> IMPLS = Property.create("impls", List.class);
     public static final Property<List<IvImplWithLock>> IMPLS_WITH_LOCK = Property.create("implsWithLock", List.class);
 
+    protected String name;
+
+    protected Object impls;
+    protected Object implsWithLock;
+
     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 addToImpls(IvImpl obj) {
-        addToManyTarget("impls", obj, true);
-    }
-    public void removeFromImpls(IvImpl obj) {
-        removeToManyTarget("impls", obj, true);
-    }
     @SuppressWarnings("unchecked")
     public List<IvImpl> getImpls() {
         return (List<IvImpl>)readProperty("impls");
     }
 
-    public void addToImplsWithLock(IvImplWithLock obj) {
-        addToManyTarget("implsWithLock", obj, true);
-    }
-    public void removeFromImplsWithLock(IvImplWithLock obj) {
-        removeToManyTarget("implsWithLock", obj, true);
-    }
     @SuppressWarnings("unchecked")
     public List<IvImplWithLock> getImplsWithLock() {
         return (List<IvImplWithLock>)readProperty("implsWithLock");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "impls":
+                return this.impls;
+            case "implsWithLock":
+                return this.implsWithLock;
+            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 "impls":
+                this.impls = val;
+                break;
+            case "implsWithLock":
+                this.implsWithLock = 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(impls);
+        out.writeObject(implsWithLock);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        impls = in.readObject();
+        implsWithLock = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
index 68f0488..b88346b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_vertical.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IvRoot extends CayenneDataObject {
+public abstract class _IvRoot extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _IvRoot extends CayenneDataObject {
     public static final Property<String> DISCRIMINATOR = Property.create("discriminator", String.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String discriminator;
+    protected String name;
+
+
     public void setDiscriminator(String discriminator) {
-        writeProperty("discriminator", discriminator);
+        beforePropertyWrite("discriminator", this.discriminator, discriminator);
+        this.discriminator = discriminator;
     }
+
     public String getDiscriminator() {
-        return (String)readProperty("discriminator");
+        beforePropertyRead("discriminator");
+        return discriminator;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "discriminator":
+                return this.discriminator;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "discriminator":
+                this.discriminator = (String)val;
+                break;
+            case "name":
+                this.name = (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(discriminator);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        discriminator = (String)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
index 8d21cd7..3dc23bb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
 
@@ -17,11 +21,66 @@ public abstract class _IvSub1 extends IvRoot {
 
     public static final Property<String> SUB1NAME = Property.create("sub1Name", String.class);
 
+    protected String sub1Name;
+
+
     public void setSub1Name(String sub1Name) {
-        writeProperty("sub1Name", sub1Name);
+        beforePropertyWrite("sub1Name", this.sub1Name, sub1Name);
+        this.sub1Name = sub1Name;
     }
+
     public String getSub1Name() {
-        return (String)readProperty("sub1Name");
+        beforePropertyRead("sub1Name");
+        return sub1Name;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "sub1Name":
+                return this.sub1Name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "sub1Name":
+                this.sub1Name = (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(sub1Name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        sub1Name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
index f4ebb4d..83e36f4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
 
@@ -17,11 +21,66 @@ public abstract class _IvSub1Sub1 extends IvSub1 {
 
     public static final Property<String> SUB1SUB1NAME = Property.create("sub1Sub1Name", String.class);
 
+    protected String sub1Sub1Name;
+
+
     public void setSub1Sub1Name(String sub1Sub1Name) {
-        writeProperty("sub1Sub1Name", sub1Sub1Name);
+        beforePropertyWrite("sub1Sub1Name", this.sub1Sub1Name, sub1Sub1Name);
+        this.sub1Sub1Name = sub1Sub1Name;
     }
+
     public String getSub1Sub1Name() {
-        return (String)readProperty("sub1Sub1Name");
+        beforePropertyRead("sub1Sub1Name");
+        return sub1Sub1Name;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "sub1Sub1Name":
+                return this.sub1Sub1Name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "sub1Sub1Name":
+                this.sub1Sub1Name = (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(sub1Sub1Name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        sub1Sub1Name = (String)in.readObject();
     }
 
 }


[04/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
index c75b539..fd82379 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.qualified.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.qualified.Qualified1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.qualified.Qualified1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Qualified2 extends CayenneDataObject {
+public abstract class _Qualified2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _Qualified2 extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<Qualified1> QUALIFIED1 = Property.create("qualified1", Qualified1.class);
 
+    protected Boolean deleted;
+    protected String name;
+
+    protected Object qualified1;
+
     public void setDeleted(Boolean deleted) {
-        writeProperty("deleted", deleted);
+        beforePropertyWrite("deleted", this.deleted, deleted);
+        this.deleted = deleted;
     }
+
     public Boolean getDeleted() {
-        return (Boolean)readProperty("deleted");
+        beforePropertyRead("deleted");
+        return deleted;
     }
 
     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 setQualified1(Qualified1 qualified1) {
@@ -42,5 +57,67 @@ public abstract class _Qualified2 extends CayenneDataObject {
         return (Qualified1)readProperty("qualified1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "deleted":
+                return this.deleted;
+            case "name":
+                return this.name;
+            case "qualified1":
+                return this.qualified1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "deleted":
+                this.deleted = (Boolean)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "qualified1":
+                this.qualified1 = 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(deleted);
+        out.writeObject(name);
+        out.writeObject(qualified1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        deleted = (Boolean)in.readObject();
+        name = (String)in.readObject();
+        qualified1 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
index a62ef4d..cba1592 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.quotemap.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.quotemap.Quote_Person;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.quotemap.Quote_Person;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _QuoteAdress extends CayenneDataObject {
+public abstract class _QuoteAdress extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _QuoteAdress extends CayenneDataObject {
     public static final Property<String> GROUP = Property.create("group", String.class);
     public static final Property<Quote_Person> PERSON_REL = Property.create("person_Rel", Quote_Person.class);
 
+    protected String city;
+    protected String group;
+
+    protected Object person_Rel;
+
     public void setCity(String city) {
-        writeProperty("city", city);
+        beforePropertyWrite("city", this.city, city);
+        this.city = city;
     }
+
     public String getCity() {
-        return (String)readProperty("city");
+        beforePropertyRead("city");
+        return city;
     }
 
     public void setGroup(String group) {
-        writeProperty("group", group);
+        beforePropertyWrite("group", this.group, group);
+        this.group = group;
     }
+
     public String getGroup() {
-        return (String)readProperty("group");
+        beforePropertyRead("group");
+        return group;
     }
 
     public void setPerson_Rel(Quote_Person person_Rel) {
@@ -42,5 +57,67 @@ public abstract class _QuoteAdress extends CayenneDataObject {
         return (Quote_Person)readProperty("person_Rel");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "city":
+                return this.city;
+            case "group":
+                return this.group;
+            case "person_Rel":
+                return this.person_Rel;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "city":
+                this.city = (String)val;
+                break;
+            case "group":
+                this.group = (String)val;
+                break;
+            case "person_Rel":
+                this.person_Rel = 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(city);
+        out.writeObject(group);
+        out.writeObject(person_Rel);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        city = (String)in.readObject();
+        group = (String)in.readObject();
+        person_Rel = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
index 32e734a..0f32540 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.quotemap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Date;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.quotemap.QuoteAdress;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.quotemap.QuoteAdress;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Quote_Person extends CayenneDataObject {
+public abstract class _Quote_Person extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -25,39 +28,62 @@ public abstract class _Quote_Person extends CayenneDataObject {
     public static final Property<Integer> SALARY = Property.create("salary", Integer.class);
     public static final Property<QuoteAdress> ADDRESS_REL = Property.create("address_Rel", QuoteAdress.class);
 
+    protected Date dAte;
+    protected String fULL_name;
+    protected String group;
+    protected String name;
+    protected Integer salary;
+
+    protected Object address_Rel;
+
     public void setDAte(Date dAte) {
-        writeProperty("dAte", dAte);
+        beforePropertyWrite("dAte", this.dAte, dAte);
+        this.dAte = dAte;
     }
+
     public Date getDAte() {
-        return (Date)readProperty("dAte");
+        beforePropertyRead("dAte");
+        return dAte;
     }
 
     public void setFULL_name(String fULL_name) {
-        writeProperty("fULL_name", fULL_name);
+        beforePropertyWrite("fULL_name", this.fULL_name, fULL_name);
+        this.fULL_name = fULL_name;
     }
+
     public String getFULL_name() {
-        return (String)readProperty("fULL_name");
+        beforePropertyRead("fULL_name");
+        return fULL_name;
     }
 
     public void setGroup(String group) {
-        writeProperty("group", group);
+        beforePropertyWrite("group", this.group, group);
+        this.group = group;
     }
+
     public String getGroup() {
-        return (String)readProperty("group");
+        beforePropertyRead("group");
+        return group;
     }
 
     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 setSalary(Integer salary) {
-        writeProperty("salary", salary);
+        beforePropertyWrite("salary", this.salary, salary);
+        this.salary = salary;
     }
+
     public Integer getSalary() {
-        return (Integer)readProperty("salary");
+        beforePropertyRead("salary");
+        return salary;
     }
 
     public void setAddress_Rel(QuoteAdress address_Rel) {
@@ -68,5 +94,88 @@ public abstract class _Quote_Person extends CayenneDataObject {
         return (QuoteAdress)readProperty("address_Rel");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "dAte":
+                return this.dAte;
+            case "fULL_name":
+                return this.fULL_name;
+            case "group":
+                return this.group;
+            case "name":
+                return this.name;
+            case "salary":
+                return this.salary;
+            case "address_Rel":
+                return this.address_Rel;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "dAte":
+                this.dAte = (Date)val;
+                break;
+            case "fULL_name":
+                this.fULL_name = (String)val;
+                break;
+            case "group":
+                this.group = (String)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "salary":
+                this.salary = (Integer)val;
+                break;
+            case "address_Rel":
+                this.address_Rel = 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(dAte);
+        out.writeObject(fULL_name);
+        out.writeObject(group);
+        out.writeObject(name);
+        out.writeObject(salary);
+        out.writeObject(address_Rel);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        dAte = (Date)in.readObject();
+        fULL_name = (String)in.readObject();
+        group = (String)in.readObject();
+        name = (String)in.readObject();
+        salary = (Integer)in.readObject();
+        address_Rel = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
index 8ab8644..9a4238d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.reflexive.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.reflexive.Reflexive;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.reflexive.Reflexive;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Reflexive extends CayenneDataObject {
+public abstract class _Reflexive extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,25 +25,34 @@ public abstract class _Reflexive extends CayenneDataObject {
     public static final Property<List<Reflexive>> CHILDREN = Property.create("children", List.class);
     public static final Property<Reflexive> TO_PARENT = Property.create("toParent", Reflexive.class);
 
+    protected String name;
+
+    protected Object children;
+    protected Object toParent;
+
     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 addToChildren(Reflexive obj) {
         addToManyTarget("children", obj, true);
     }
+
     public void removeFromChildren(Reflexive obj) {
         removeToManyTarget("children", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Reflexive> getChildren() {
         return (List<Reflexive>)readProperty("children");
     }
 
-
     public void setToParent(Reflexive toParent) {
         setToOneTarget("toParent", toParent, true);
     }
@@ -49,5 +61,67 @@ public abstract class _Reflexive extends CayenneDataObject {
         return (Reflexive)readProperty("toParent");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "children":
+                return this.children;
+            case "toParent":
+                return this.toParent;
+            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 "children":
+                this.children = val;
+                break;
+            case "toParent":
+                this.toParent = 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(children);
+        out.writeObject(toParent);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        children = in.readObject();
+        toParent = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
index 0573abf..33129d9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships.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.RelationshipHelper;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.relationships.RelationshipHelper;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _FkOfDifferentType extends CayenneDataObject {
+public abstract class _FkOfDifferentType extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _FkOfDifferentType extends CayenneDataObject {
 
     public static final Property<RelationshipHelper> RELATIONSHIP_HELPER = Property.create("relationshipHelper", RelationshipHelper.class);
 
+
+    protected Object relationshipHelper;
+
     public void setRelationshipHelper(RelationshipHelper relationshipHelper) {
         setToOneTarget("relationshipHelper", relationshipHelper, true);
     }
@@ -26,5 +33,53 @@ public abstract class _FkOfDifferentType extends CayenneDataObject {
         return (RelationshipHelper)readProperty("relationshipHelper");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "relationshipHelper":
+                return this.relationshipHelper;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "relationshipHelper":
+                this.relationshipHelper = 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(relationshipHelper);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        relationshipHelper = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
index 97e939a..37b13c0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships.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.RelationshipHelper;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.relationships.RelationshipHelper;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulFK extends CayenneDataObject {
+public abstract class _MeaningfulFK extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _MeaningfulFK extends CayenneDataObject {
     public static final Property<Integer> RELATIONSHIP_HELPER_ID = Property.create("relationshipHelperID", Integer.class);
     public static final Property<RelationshipHelper> TO_RELATIONSHIP_HELPER = Property.create("toRelationshipHelper", RelationshipHelper.class);
 
+    protected Integer relationshipHelperID;
+
+    protected Object toRelationshipHelper;
+
     public void setRelationshipHelperID(Integer relationshipHelperID) {
-        writeProperty("relationshipHelperID", relationshipHelperID);
+        beforePropertyWrite("relationshipHelperID", this.relationshipHelperID, relationshipHelperID);
+        this.relationshipHelperID = relationshipHelperID;
     }
+
     public Integer getRelationshipHelperID() {
-        return (Integer)readProperty("relationshipHelperID");
+        beforePropertyRead("relationshipHelperID");
+        return relationshipHelperID;
     }
 
     public void setToRelationshipHelper(RelationshipHelper toRelationshipHelper) {
@@ -34,5 +45,60 @@ public abstract class _MeaningfulFK extends CayenneDataObject {
         return (RelationshipHelper)readProperty("toRelationshipHelper");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "relationshipHelperID":
+                return this.relationshipHelperID;
+            case "toRelationshipHelper":
+                return this.toRelationshipHelper;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "relationshipHelperID":
+                this.relationshipHelperID = (Integer)val;
+                break;
+            case "toRelationshipHelper":
+                this.toRelationshipHelper = 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(relationshipHelperID);
+        out.writeObject(toRelationshipHelper);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        relationshipHelperID = (Integer)in.readObject();
+        toRelationshipHelper = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
index 1f180dd..3666855 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships.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.ReflexiveAndToOne;
 import org.apache.cayenne.testdo.relationships.RelationshipHelper;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.relationships.RelationshipHelper;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ReflexiveAndToOne extends CayenneDataObject {
+public abstract class _ReflexiveAndToOne extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -24,25 +27,35 @@ public abstract class _ReflexiveAndToOne extends CayenneDataObject {
     public static final Property<RelationshipHelper> TO_HELPER = Property.create("toHelper", RelationshipHelper.class);
     public static final Property<ReflexiveAndToOne> TO_PARENT = Property.create("toParent", ReflexiveAndToOne.class);
 
+    protected String name;
+
+    protected Object children;
+    protected Object toHelper;
+    protected Object toParent;
+
     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 addToChildren(ReflexiveAndToOne obj) {
         addToManyTarget("children", obj, true);
     }
+
     public void removeFromChildren(ReflexiveAndToOne obj) {
         removeToManyTarget("children", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ReflexiveAndToOne> getChildren() {
         return (List<ReflexiveAndToOne>)readProperty("children");
     }
 
-
     public void setToHelper(RelationshipHelper toHelper) {
         setToOneTarget("toHelper", toHelper, true);
     }
@@ -51,7 +64,6 @@ public abstract class _ReflexiveAndToOne extends CayenneDataObject {
         return (RelationshipHelper)readProperty("toHelper");
     }
 
-
     public void setToParent(ReflexiveAndToOne toParent) {
         setToOneTarget("toParent", toParent, true);
     }
@@ -60,5 +72,74 @@ public abstract class _ReflexiveAndToOne extends CayenneDataObject {
         return (ReflexiveAndToOne)readProperty("toParent");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "children":
+                return this.children;
+            case "toHelper":
+                return this.toHelper;
+            case "toParent":
+                return this.toParent;
+            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 "children":
+                this.children = val;
+                break;
+            case "toHelper":
+                this.toHelper = val;
+                break;
+            case "toParent":
+                this.toParent = 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(children);
+        out.writeObject(toHelper);
+        out.writeObject(toParent);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        children = in.readObject();
+        toHelper = in.readObject();
+        toParent = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
index 86fd4e9..b36d04d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships.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.FkOfDifferentType;
 import org.apache.cayenne.testdo.relationships.MeaningfulFK;
@@ -14,7 +17,7 @@ import org.apache.cayenne.testdo.relationships.ReflexiveAndToOne;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _RelationshipHelper extends CayenneDataObject {
+public abstract class _RelationshipHelper extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -25,47 +28,129 @@ public abstract class _RelationshipHelper extends CayenneDataObject {
     public static final Property<List<MeaningfulFK>> MEANIGFUL_FKS = Property.create("meanigfulFKs", List.class);
     public static final Property<List<ReflexiveAndToOne>> REFLEXIVE_AND_TO_ONE_ARRAY = Property.create("reflexiveAndToOneArray", List.class);
 
+    protected String name;
+
+    protected Object fksOfDifferentType;
+    protected Object meanigfulFKs;
+    protected Object reflexiveAndToOneArray;
+
     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 addToFksOfDifferentType(FkOfDifferentType obj) {
         addToManyTarget("fksOfDifferentType", obj, true);
     }
+
     public void removeFromFksOfDifferentType(FkOfDifferentType obj) {
         removeToManyTarget("fksOfDifferentType", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<FkOfDifferentType> getFksOfDifferentType() {
         return (List<FkOfDifferentType>)readProperty("fksOfDifferentType");
     }
 
-
     public void addToMeanigfulFKs(MeaningfulFK obj) {
         addToManyTarget("meanigfulFKs", obj, true);
     }
+
     public void removeFromMeanigfulFKs(MeaningfulFK obj) {
         removeToManyTarget("meanigfulFKs", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MeaningfulFK> getMeanigfulFKs() {
         return (List<MeaningfulFK>)readProperty("meanigfulFKs");
     }
 
-
     public void addToReflexiveAndToOneArray(ReflexiveAndToOne obj) {
         addToManyTarget("reflexiveAndToOneArray", obj, true);
     }
+
     public void removeFromReflexiveAndToOneArray(ReflexiveAndToOne obj) {
         removeToManyTarget("reflexiveAndToOneArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ReflexiveAndToOne> getReflexiveAndToOneArray() {
         return (List<ReflexiveAndToOne>)readProperty("reflexiveAndToOneArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "fksOfDifferentType":
+                return this.fksOfDifferentType;
+            case "meanigfulFKs":
+                return this.meanigfulFKs;
+            case "reflexiveAndToOneArray":
+                return this.reflexiveAndToOneArray;
+            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 "fksOfDifferentType":
+                this.fksOfDifferentType = val;
+                break;
+            case "meanigfulFKs":
+                this.meanigfulFKs = val;
+                break;
+            case "reflexiveAndToOneArray":
+                this.reflexiveAndToOneArray = 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(fksOfDifferentType);
+        out.writeObject(meanigfulFKs);
+        out.writeObject(reflexiveAndToOneArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        fksOfDifferentType = in.readObject();
+        meanigfulFKs = in.readObject();
+        reflexiveAndToOneArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
index 85beb7f..1dbdc84 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
@@ -1,9 +1,12 @@
 package org.apache.cayenne.testdo.relationships_activity.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.sql.Date;
 import java.util.Map;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_activity.ActivityResult;
 
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.relationships_activity.ActivityResult;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Activity extends CayenneDataObject {
+public abstract class _Activity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,31 +26,105 @@ public abstract class _Activity extends CayenneDataObject {
     public static final Property<Integer> APPOINTMENT_NO = Property.create("appointmentNo", Integer.class);
     public static final Property<Map<String, ActivityResult>> RESULTS = Property.create("results", Map.class);
 
+    protected Date appointmentDate;
+    protected int appointmentNo;
+
+    protected Object results;
+
     public void setAppointmentDate(Date appointmentDate) {
-        writeProperty("appointmentDate", appointmentDate);
+        beforePropertyWrite("appointmentDate", this.appointmentDate, appointmentDate);
+        this.appointmentDate = appointmentDate;
     }
+
     public Date getAppointmentDate() {
-        return (Date)readProperty("appointmentDate");
+        beforePropertyRead("appointmentDate");
+        return appointmentDate;
     }
 
     public void setAppointmentNo(int appointmentNo) {
-        writeProperty("appointmentNo", appointmentNo);
+        beforePropertyWrite("appointmentNo", this.appointmentNo, appointmentNo);
+        this.appointmentNo = appointmentNo;
     }
+
     public int getAppointmentNo() {
-        Object value = readProperty("appointmentNo");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("appointmentNo");
+        return appointmentNo;
     }
 
     public void addToResults(ActivityResult obj) {
         addToManyTarget("results", obj, true);
     }
+
     public void removeFromResults(ActivityResult obj) {
         removeToManyTarget("results", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public Map<String, ActivityResult> getResults() {
         return (Map<String, ActivityResult>)readProperty("results");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "appointmentDate":
+                return this.appointmentDate;
+            case "appointmentNo":
+                return this.appointmentNo;
+            case "results":
+                return this.results;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "appointmentDate":
+                this.appointmentDate = (Date)val;
+                break;
+            case "appointmentNo":
+                this.appointmentNo = (Integer)val;
+                break;
+            case "results":
+                this.results = 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(appointmentDate);
+        out.writeInt(appointmentNo);
+        out.writeObject(results);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        appointmentDate = (Date)in.readObject();
+        appointmentNo = in.readInt();
+        results = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
index 5db7ad9..c713e8f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_activity.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.sql.Date;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ActivityResult extends CayenneDataObject {
+public abstract class _ActivityResult extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,26 +26,102 @@ public abstract class _ActivityResult extends CayenneDataObject {
     public static final Property<Integer> APPOINT_NO = Property.create("appointNo", Integer.class);
     public static final Property<String> FIELD = Property.create("field", String.class);
 
+    protected Date appointDate;
+    protected int appointNo;
+    protected String field;
+
+
     public void setAppointDate(Date appointDate) {
-        writeProperty("appointDate", appointDate);
+        beforePropertyWrite("appointDate", this.appointDate, appointDate);
+        this.appointDate = appointDate;
     }
+
     public Date getAppointDate() {
-        return (Date)readProperty("appointDate");
+        beforePropertyRead("appointDate");
+        return appointDate;
     }
 
     public void setAppointNo(int appointNo) {
-        writeProperty("appointNo", appointNo);
+        beforePropertyWrite("appointNo", this.appointNo, appointNo);
+        this.appointNo = appointNo;
     }
+
     public int getAppointNo() {
-        Object value = readProperty("appointNo");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("appointNo");
+        return appointNo;
     }
 
     public void setField(String field) {
-        writeProperty("field", field);
+        beforePropertyWrite("field", this.field, field);
+        this.field = field;
     }
+
     public String getField() {
-        return (String)readProperty("field");
+        beforePropertyRead("field");
+        return field;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "appointDate":
+                return this.appointDate;
+            case "appointNo":
+                return this.appointNo;
+            case "field":
+                return this.field;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "appointDate":
+                this.appointDate = (Date)val;
+                break;
+            case "appointNo":
+                this.appointNo = (Integer)val;
+                break;
+            case "field":
+                this.field = (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(appointDate);
+        out.writeInt(appointNo);
+        out.writeObject(field);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        appointDate = (Date)in.readObject();
+        appointNo = in.readInt();
+        field = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
index 2bfc434..6c0c80d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_child_master.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_child_master.Master;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.relationships_child_master.Master;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Child extends CayenneDataObject {
+public abstract class _Child extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _Child extends CayenneDataObject {
 
     public static final Property<Master> MASTER = Property.create("master", Master.class);
 
+
+    protected Object master;
+
     public void setMaster(Master master) {
         setToOneTarget("master", master, true);
     }
@@ -26,5 +33,53 @@ public abstract class _Child extends CayenneDataObject {
         return (Master)readProperty("master");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "master":
+                return this.master;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "master":
+                this.master = 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(master);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        master = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
index 387846c..fb90e0b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_child_master.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_child_master.Child;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.relationships_child_master.Child;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Master extends CayenneDataObject {
+public abstract class _Master extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _Master extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<Child>> CHILDREN = Property.create("children", List.class);
 
+    protected String name;
+
+    protected Object children;
+
     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 addToChildren(Child obj) {
         addToManyTarget("children", obj, true);
     }
+
     public void removeFromChildren(Child obj) {
         removeToManyTarget("children", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Child> getChildren() {
         return (List<Child>)readProperty("children");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "children":
+                return this.children;
+            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 "children":
+                this.children = 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(children);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        children = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
index 59420b4..3f455bb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_clob.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_clob.ClobMaster;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.relationships_clob.ClobMaster;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ClobDetail extends CayenneDataObject {
+public abstract class _ClobDetail extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _ClobDetail extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<ClobMaster> MASTER = Property.create("master", ClobMaster.class);
 
+    protected String name;
+
+    protected Object master;
+
     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 setMaster(ClobMaster master) {
@@ -34,5 +45,60 @@ public abstract class _ClobDetail extends CayenneDataObject {
         return (ClobMaster)readProperty("master");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "master":
+                return this.master;
+            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 "master":
+                this.master = 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(master);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        master = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
index da9527a..d88ad8f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_clob.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_clob.ClobDetail;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.relationships_clob.ClobDetail;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ClobMaster extends CayenneDataObject {
+public abstract class _ClobMaster extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _ClobMaster extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<ClobDetail>> DETAILS = Property.create("details", List.class);
 
+    protected String clobColumn;
+    protected String name;
+
+    protected Object details;
+
     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 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 addToDetails(ClobDetail obj) {
         addToManyTarget("details", obj, true);
     }
+
     public void removeFromDetails(ClobDetail obj) {
         removeToManyTarget("details", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ClobDetail> getDetails() {
         return (List<ClobDetail>)readProperty("details");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "clobColumn":
+                return this.clobColumn;
+            case "name":
+                return this.name;
+            case "details":
+                return this.details;
+            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 "name":
+                this.name = (String)val;
+                break;
+            case "details":
+                this.details = 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(name);
+        out.writeObject(details);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        clobColumn = (String)in.readObject();
+        name = (String)in.readObject();
+        details = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
index 4a3a328..c771d5e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_collection_to_many.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Collection;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.relationships_collection_to_many.CollectionToManyTarget;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.relationships_collection_to_many.CollectionToMa
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CollectionToMany extends CayenneDataObject {
+public abstract class _CollectionToMany extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _CollectionToMany extends CayenneDataObject {
 
     public static final Property<Collection<CollectionToManyTarget>> TARGETS = Property.create("targets", Collection.class);
 
+
+    protected Object targets;
+
     public void addToTargets(CollectionToManyTarget obj) {
         addToManyTarget("targets", obj, true);
     }
+
     public void removeFromTargets(CollectionToManyTarget obj) {
         removeToManyTarget("targets", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public Collection<CollectionToManyTarget> getTargets() {
         return (Collection<CollectionToManyTarget>)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_collection_to_many/auto/_CollectionToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
index 4bb3632..6ed5354 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.relationships_collection_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_collection_to_many.CollectionToMany;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.relationships_collection_to_many.CollectionToMa
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CollectionToManyTarget extends CayenneDataObject {
+public abstract class _CollectionToManyTarget extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _CollectionToManyTarget extends CayenneDataObject {
 
     public static final Property<CollectionToMany> COLLECTION_TO_MANY = Property.create("collectionToMany", CollectionToMany.class);
 
+
+    protected Object collectionToMany;
+
     public void setCollectionToMany(CollectionToMany collectionToMany) {
         setToOneTarget("collectionToMany", collectionToMany, true);
     }
@@ -26,5 +33,53 @@ public abstract class _CollectionToManyTarget extends CayenneDataObject {
         return (CollectionToMany)readProperty("collectionToMany");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "collectionToMany":
+                return this.collectionToMany;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "collectionToMany":
+                this.collectionToMany = 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(collectionToMany);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        collectionToMany = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
index 76f1e74..c9d5139 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_delete_rules.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_delete_rules.DeleteRuleFlatB;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleFlatB;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteRuleFlatA extends CayenneDataObject {
+public abstract class _DeleteRuleFlatA extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _DeleteRuleFlatA extends CayenneDataObject {
 
     public static final Property<List<DeleteRuleFlatB>> FLAT_B = Property.create("flatB", List.class);
 
+
+    protected Object flatB;
+
     public void addToFlatB(DeleteRuleFlatB obj) {
         addToManyTarget("flatB", obj, true);
     }
+
     public void removeFromFlatB(DeleteRuleFlatB obj) {
         removeToManyTarget("flatB", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteRuleFlatB> getFlatB() {
         return (List<DeleteRuleFlatB>)readProperty("flatB");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "flatB":
+                return this.flatB;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "flatB":
+                this.flatB = 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(flatB);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        flatB = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
index 2c1cc1b..da50775 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_delete_rules.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_delete_rules.DeleteRuleFlatA;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleFlatA;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteRuleFlatB extends CayenneDataObject {
+public abstract class _DeleteRuleFlatB extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _DeleteRuleFlatB extends CayenneDataObject {
 
     public static final Property<List<DeleteRuleFlatA>> UNTITLED_REL = Property.create("untitledRel", List.class);
 
+
+    protected Object untitledRel;
+
     public void addToUntitledRel(DeleteRuleFlatA obj) {
         addToManyTarget("untitledRel", obj, true);
     }
+
     public void removeFromUntitledRel(DeleteRuleFlatA obj) {
         removeToManyTarget("untitledRel", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteRuleFlatA> getUntitledRel() {
         return (List<DeleteRuleFlatA>)readProperty("untitledRel");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "untitledRel":
+                return this.untitledRel;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "untitledRel":
+                this.untitledRel = 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(untitledRel);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        untitledRel = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
index e5cec94..6bd477f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.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 _DeleteRuleTest1 extends CayenneDataObject {
+public abstract class _DeleteRuleTest1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _DeleteRuleTest1 extends CayenneDataObject {
 
     public static final Property<DeleteRuleTest2> TEST2 = Property.create("test2", DeleteRuleTest2.class);
 
+
+    protected Object test2;
+
     public void setTest2(DeleteRuleTest2 test2) {
         setToOneTarget("test2", test2, true);
     }
@@ -26,5 +33,53 @@ public abstract class _DeleteRuleTest1 extends CayenneDataObject {
         return (DeleteRuleTest2)readProperty("test2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "test2":
+                return this.test2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "test2":
+                this.test2 = 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(test2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        test2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
index c12d858..1a88c8e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.relationships_delete_rules.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_delete_rules.DeleteRuleTest1;
 import org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleTest3;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.relationships_delete_rules.DeleteRuleTest3;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteRuleTest2 extends CayenneDataObject {
+public abstract class _DeleteRuleTest2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,28 +25,90 @@ public abstract class _DeleteRuleTest2 extends CayenneDataObject {
     public static final Property<List<DeleteRuleTest3>> DELETE_RULE_TEST3ARRAY = Property.create("deleteRuleTest3Array", List.class);
     public static final Property<List<DeleteRuleTest1>> TEST1ARRAY = Property.create("test1Array", List.class);
 
+
+    protected Object deleteRuleTest3Array;
+    protected Object test1Array;
+
     public void addToDeleteRuleTest3Array(DeleteRuleTest3 obj) {
         addToManyTarget("deleteRuleTest3Array", obj, true);
     }
+
     public void removeFromDeleteRuleTest3Array(DeleteRuleTest3 obj) {
         removeToManyTarget("deleteRuleTest3Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteRuleTest3> getDeleteRuleTest3Array() {
         return (List<DeleteRuleTest3>)readProperty("deleteRuleTest3Array");
     }
 
-
     public void addToTest1Array(DeleteRuleTest1 obj) {
         addToManyTarget("test1Array", obj, true);
     }
+
     public void removeFromTest1Array(DeleteRuleTest1 obj) {
         removeToManyTarget("test1Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteRuleTest1> getTest1Array() {
         return (List<DeleteRuleTest1>)readProperty("test1Array");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "deleteRuleTest3Array":
+                return this.deleteRuleTest3Array;
+            case "test1Array":
+                return this.test1Array;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "deleteRuleTest3Array":
+                this.deleteRuleTest3Array = val;
+                break;
+            case "test1Array":
+                this.test1Array = 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(deleteRuleTest3Array);
+        out.writeObject(test1Array);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        deleteRuleTest3Array = in.readObject();
+        test1Array = in.readObject();
+    }
 
 }


[10/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
new file mode 100644
index 0000000..860e4af
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -0,0 +1,292 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    entityUtils - class for entity "helper" functions: See org.apache.cayenne.gen.EntityUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName
+##
+###################
+## Create import ##
+###################
+${importUtils.setPackage($superPackageName)}##
+${importUtils.addReservedType("${superPackageName}.${superClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType("java.io.IOException")}##
+${importUtils.addType("java.io.ObjectInputStream")}##
+${importUtils.addType("java.io.ObjectOutputStream")}##
+#if((${object.DeclaredAttributes} && !${object.DeclaredAttributes.isEmpty()}) || (${object.DeclaredRelationships} && !${object.DeclaredRelationships.isEmpty()}))
+${importUtils.addType('org.apache.cayenne.exp.Property')}##
+#end
+#foreach( $attr in ${object.DeclaredAttributes} )
+$importUtils.addType(${attr.Type})##
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+$importUtils.addType(${rel.TargetEntity.ClassName})##
+#if(${rel.CollectionType}) 
+$importUtils.addType(${rel.CollectionType})##
+#end
+#end
+${importUtils.generate()}
+
+/**
+ * Class ${superClassName} was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class ${superClassName} extends ${baseClassName} {
+
+    private static final long serialVersionUID = 1L; 
+
+###########################
+## Create property names ##
+###########################
+#if( $createPropertyNames )
+#foreach( $attr in ${object.DeclaredAttributes} )
+    public static final String ${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY = "${attr.Name}";
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+    public static final String ${stringUtils.capitalizedAsConstant($rel.Name)}_PROPERTY = "${rel.Name}";
+#end
+
+#end
+#if( $object.DbEntity )
+#foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
+    public static final String ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = "${idAttr.Name}";
+#end
+#end
+
+#######################
+## Create Properties ##
+#######################
+#foreach( $attr in ${object.DeclaredAttributes} )
+    #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($attr.Name)} = Property.create("${attr.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ${rel.CollectionType} == "java.util.Map")
+    #set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#else
+    #set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#else
+    #set( $type = "$importUtils.formatJavaType(${rel.TargetEntity.ClassName})" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#end
+
+###################
+## Create Fields ##
+###################
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+    protected $type ${attr.Name};
+#end
+
+#foreach( $rel in ${object.DeclaredRelationships} )
+    protected Object ${rel.Name};
+#end
+
+#########################################################
+## Create attributes and relationships set/get methods ##
+#########################################################
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+##
+## setter
+#if ("true" != "${object.isReadOnly()}")
+    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $name) {
+        beforePropertyWrite("${attr.Name}", this.$name, $name);
+        this.$name = $name;
+    }
+
+#end
+##
+## getter
+#if ( $importUtils.isBoolean(${attr.Type}) )
+	public boolean is${stringUtils.capitalized($attr.Name)}() {
+#else
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+#end
+        beforePropertyRead("${attr.Name}");
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+
+#end
+##
+## Create list add/remove/get methods
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ! $rel.ReadOnly )
+    public void addTo${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) obj) {
+        addToManyTarget("${rel.Name}", obj, true);
+    }
+
+    public void removeFrom${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) obj) {
+        removeToManyTarget("${rel.Name}", obj, true);
+    }
+
+#end
+    @SuppressWarnings("unchecked")
+#if ( ${rel.CollectionType} == "java.util.Map")
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)> get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)>)readProperty("${rel.Name}");
+    }
+#else
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)> get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)>)readProperty("${rel.Name}");
+    }
+#end
+
+#else
+#if ( !${object.isReadOnly()} && !$rel.ReadOnly )
+    public void set${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) $stringUtils.formatVariableName(${rel.name})) {
+        setToOneTarget("${rel.Name}", $stringUtils.formatVariableName(${rel.name}), true);
+    }
+
+#end
+    public $importUtils.formatJavaType(${rel.TargetEntity.ClassName}) get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType(${rel.TargetEntity.ClassName}))readProperty("${rel.Name}");
+    }
+
+#end
+#end
+#############################
+## Create callback methods ##
+#############################
+#foreach($cbname in ${entityUtils.callbackNames})
+protected abstract void ${cbname}();
+
+#end
+###########################################################
+## Create writePropertyDirect/readPropertyDirect methods ##
+###########################################################
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+            case "${attr.Name}":
+                return this.${name};
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+            case "${rel.Name}":
+                return this.$stringUtils.formatVariableName(${rel.name});
+#end
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+#set ( $realType = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+            case "${attr.Name}":
+#if ( $importUtils.isBoolean($realType) )
+                this.${name} = val == null ? false : ($type)val;
+#elseif ($importUtils.isPrimitive($realType))
+                this.${name} = val == null ? 0 : ($type)val;
+#else
+                this.${name} = ($type)val;
+#end
+                break;
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+            case "${rel.Name}":
+                this.$stringUtils.formatVariableName(${rel.name}) = val;
+                break;
+#end
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+##################################
+## Create serialization support ##
+##################################
+    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);
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#if($importUtils.isPrimitive($type))
+        out.write${stringUtils.capitalized($type)}($name);
+#else
+        out.writeObject(${name});
+#end
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+        out.writeObject(${stringUtils.formatVariableName($rel.Name)});
+#end
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#if($importUtils.isPrimitive($type))
+        $name = in.read${stringUtils.capitalized($type)}();
+#else
+        $name = ($type)in.readObject();
+#end
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#set ( $name = "${stringUtils.formatVariableName($rel.Name)}")
+        $name = in.readObject();
+#end
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
index c6e1885..2eaffa6 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
@@ -46,7 +46,7 @@ public class ClassGenerationActionTest {
 
 	@Before
 	public void setUp() throws Exception {
-		this.writers = new ArrayList<StringWriter>(3);
+		this.writers = new ArrayList<>(3);
 		this.action = new ClassGenerationAction() {
 
 			@Override
@@ -79,7 +79,7 @@ public class ClassGenerationActionTest {
 
 		String superclass = generated.get(0);
 		assertTrue(superclass, superclass.contains("package org.example.auto;"));
-		assertTrue(superclass, superclass.contains("import org.apache.cayenne.CayenneDataObject;"));
+		assertTrue(superclass, superclass.contains("import org.apache.cayenne.BaseDataObject;"));
 
 		String subclass = generated.get(1);
 		assertTrue(subclass, subclass.contains("package org.example;"));
@@ -147,18 +147,16 @@ public class ClassGenerationActionTest {
 		String superclass = generated.get(0);
 
 		assertTrue(superclass, superclass.contains("public void setID(int ID)"));
-		assertTrue(superclass, superclass.contains("writeProperty(\"ID\", ID);"));
+		assertTrue(superclass, superclass.contains("this.ID = ID;"));
 
 		assertTrue(superclass, superclass.contains("public int getID()"));
-		assertTrue(superclass, superclass.contains("Object value = readProperty(\"ID\");"));
-		assertTrue(superclass, superclass.contains("return (value != null) ? (Integer) value : 0;"));
+		assertTrue(superclass, superclass.contains("return this.ID;"));
 
 		assertTrue(superclass, superclass.contains("public void setName(char name)"));
-		assertTrue(superclass, superclass.contains("writeProperty(\"name\", name);"));
+		assertTrue(superclass, superclass.contains("this.name = name;"));
 
 		assertTrue(superclass, superclass.contains("public char getName()"));
-		assertTrue(superclass, superclass.contains("Object value = readProperty(\"name\");"));
-		assertTrue(superclass, superclass.contains("return (value != null) ? (Character) value : 0;"));
+		assertTrue(superclass, superclass.contains("return this.name;"));
 
 	}
 
@@ -247,7 +245,7 @@ public class ClassGenerationActionTest {
 
 		action.execute(artifact);
 
-		List<String> strings = new ArrayList<String>(writers.size());
+		List<String> strings = new ArrayList<>(writers.size());
 		for (StringWriter writer : writers) {
 			strings.add(writer.toString());
 		}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
index acc7c69..e57ab05 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
@@ -19,6 +19,7 @@
 package org.apache.cayenne;
 
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -104,4 +105,32 @@ public class CayenneContextPrimitiveIT extends ClientCase {
         assertFalse(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
         assertEquals(8, tTablePrimitives.getInt("INT_COLUMN"));
     }
+
+    @Test
+    public void testCommitEmptyChangesPrimitives() throws Exception {
+
+        ClientTablePrimitives object = context.newObject(ClientTablePrimitives.class);
+
+        context.commitChanges();
+
+        assertFalse(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
+        assertEquals(0, tTablePrimitives.getInt("INT_COLUMN"));
+
+        object.setBooleanColumn(true);
+        object.setIntColumn(8);
+        context.commitChanges();
+
+        assertTrue(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
+        assertEquals(8, tTablePrimitives.getInt("INT_COLUMN"));
+    }
+
+    @Test
+    public void testSelectEmptyPrimitives() throws Exception {
+        tTablePrimitives.insert(1, accessStackAdapter.supportsBoolean() ? true : 1, null);
+
+        ClientTablePrimitives object = ObjectSelect.query(ClientTablePrimitives.class).selectFirst(context);
+
+        assertTrue(object.isBooleanColumn());
+        assertEquals(0, object.getIntColumn());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table1.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table1.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table1.java
index ca49870..3c773f5 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table1.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table1.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table1 extends CayenneDataObject {
+public abstract class _Table1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,34 +24,120 @@ public abstract class _Table1 extends CayenneDataObject {
     public static final Property<Integer> PLAIN_INT = Property.create("plainInt", Integer.class);
     public static final Property<String> PLAIN_STRING = Property.create("plainString", String.class);
 
+    protected int cryptoInt;
+    protected String cryptoString;
+    protected int plainInt;
+    protected String plainString;
+
+
     public void setCryptoInt(int cryptoInt) {
-        writeProperty("cryptoInt", cryptoInt);
+        beforePropertyWrite("cryptoInt", this.cryptoInt, cryptoInt);
+        this.cryptoInt = cryptoInt;
     }
+
     public int getCryptoInt() {
-        Object value = readProperty("cryptoInt");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("cryptoInt");
+        return cryptoInt;
     }
 
     public void setCryptoString(String cryptoString) {
-        writeProperty("cryptoString", cryptoString);
+        beforePropertyWrite("cryptoString", this.cryptoString, cryptoString);
+        this.cryptoString = cryptoString;
     }
+
     public String getCryptoString() {
-        return (String)readProperty("cryptoString");
+        beforePropertyRead("cryptoString");
+        return cryptoString;
     }
 
     public void setPlainInt(int plainInt) {
-        writeProperty("plainInt", plainInt);
+        beforePropertyWrite("plainInt", this.plainInt, plainInt);
+        this.plainInt = plainInt;
     }
+
     public int getPlainInt() {
-        Object value = readProperty("plainInt");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("plainInt");
+        return plainInt;
     }
 
     public void setPlainString(String plainString) {
-        writeProperty("plainString", plainString);
+        beforePropertyWrite("plainString", this.plainString, plainString);
+        this.plainString = plainString;
     }
+
     public String getPlainString() {
-        return (String)readProperty("plainString");
+        beforePropertyRead("plainString");
+        return plainString;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "cryptoInt":
+                return this.cryptoInt;
+            case "cryptoString":
+                return this.cryptoString;
+            case "plainInt":
+                return this.plainInt;
+            case "plainString":
+                return this.plainString;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "cryptoInt":
+                this.cryptoInt = val == null ? 0 : (Integer)val;
+                break;
+            case "cryptoString":
+                this.cryptoString = (String)val;
+                break;
+            case "plainInt":
+                this.plainInt = val == null ? 0 : (Integer)val;
+                break;
+            case "plainString":
+                this.plainString = (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.writeInt(cryptoInt);
+        out.writeObject(cryptoString);
+        out.writeInt(plainInt);
+        out.writeObject(plainString);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        cryptoInt = in.readInt();
+        cryptoString = (String)in.readObject();
+        plainInt = in.readInt();
+        plainString = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
index 3c65795..c10987e 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table2 extends CayenneDataObject {
+public abstract class _Table2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _Table2 extends CayenneDataObject {
     public static final Property<byte[]> CRYPTO_BYTES = Property.create("cryptoBytes", byte[].class);
     public static final Property<byte[]> PLAIN_BYTES = Property.create("plainBytes", byte[].class);
 
+    protected byte[] cryptoBytes;
+    protected byte[] plainBytes;
+
+
     public void setCryptoBytes(byte[] cryptoBytes) {
-        writeProperty("cryptoBytes", cryptoBytes);
+        beforePropertyWrite("cryptoBytes", this.cryptoBytes, cryptoBytes);
+        this.cryptoBytes = cryptoBytes;
     }
+
     public byte[] getCryptoBytes() {
-        return (byte[])readProperty("cryptoBytes");
+        beforePropertyRead("cryptoBytes");
+        return cryptoBytes;
     }
 
     public void setPlainBytes(byte[] plainBytes) {
-        writeProperty("plainBytes", plainBytes);
+        beforePropertyWrite("plainBytes", this.plainBytes, plainBytes);
+        this.plainBytes = plainBytes;
     }
+
     public byte[] getPlainBytes() {
-        return (byte[])readProperty("plainBytes");
+        beforePropertyRead("plainBytes");
+        return plainBytes;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "cryptoBytes":
+                return this.cryptoBytes;
+            case "plainBytes":
+                return this.plainBytes;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "cryptoBytes":
+                this.cryptoBytes = (byte[])val;
+                break;
+            case "plainBytes":
+                this.plainBytes = (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(cryptoBytes);
+        out.writeObject(plainBytes);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        cryptoBytes = (byte[])in.readObject();
+        plainBytes = (byte[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table3.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table3.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table3.java
index 917197c..9e0d027 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table3.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table3.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table3 extends CayenneDataObject {
+public abstract class _Table3 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _Table3 extends CayenneDataObject {
 
     public static final Property<String> CRYPTO_STRING = Property.create("cryptoString", String.class);
 
+    protected String cryptoString;
+
+
     public void setCryptoString(String cryptoString) {
-        writeProperty("cryptoString", cryptoString);
+        beforePropertyWrite("cryptoString", this.cryptoString, cryptoString);
+        this.cryptoString = cryptoString;
     }
+
     public String getCryptoString() {
-        return (String)readProperty("cryptoString");
+        beforePropertyRead("cryptoString");
+        return cryptoString;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "cryptoString":
+                return this.cryptoString;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "cryptoString":
+                this.cryptoString = (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(cryptoString);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        cryptoString = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
index ae30286..5563c63 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table4 extends CayenneDataObject {
+public abstract class _Table4 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,19 +22,84 @@ public abstract class _Table4 extends CayenneDataObject {
     public static final Property<Integer> PLAIN_INT = Property.create("plainInt", Integer.class);
     public static final Property<String> PLAIN_STRING = Property.create("plainString", String.class);
 
+    protected int plainInt;
+    protected String plainString;
+
+
     public void setPlainInt(int plainInt) {
-        writeProperty("plainInt", plainInt);
+        beforePropertyWrite("plainInt", this.plainInt, plainInt);
+        this.plainInt = plainInt;
     }
+
     public int getPlainInt() {
-        Object value = readProperty("plainInt");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("plainInt");
+        return plainInt;
     }
 
     public void setPlainString(String plainString) {
-        writeProperty("plainString", plainString);
+        beforePropertyWrite("plainString", this.plainString, plainString);
+        this.plainString = plainString;
     }
+
     public String getPlainString() {
-        return (String)readProperty("plainString");
+        beforePropertyRead("plainString");
+        return plainString;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "plainInt":
+                return this.plainInt;
+            case "plainString":
+                return this.plainString;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "plainInt":
+                this.plainInt = val == null ? 0 : (Integer)val;
+                break;
+            case "plainString":
+                this.plainString = (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.writeInt(plainInt);
+        out.writeObject(plainString);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        plainInt = in.readInt();
+        plainString = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java
index 3f4127f..44aa168 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table5 extends CayenneDataObject {
+public abstract class _Table5 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,28 +23,102 @@ public abstract class _Table5 extends CayenneDataObject {
     public static final Property<Integer> CRYPTO_INT3 = Property.create("cryptoInt3", Integer.class);
     public static final Property<Integer> CRYPTO_INT4 = Property.create("cryptoInt4", Integer.class);
 
+    protected int cryptoInt1;
+    protected int cryptoInt3;
+    protected int cryptoInt4;
+
+
     public void setCryptoInt1(int cryptoInt1) {
-        writeProperty("cryptoInt1", cryptoInt1);
+        beforePropertyWrite("cryptoInt1", this.cryptoInt1, cryptoInt1);
+        this.cryptoInt1 = cryptoInt1;
     }
+
     public int getCryptoInt1() {
-        Object value = readProperty("cryptoInt1");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("cryptoInt1");
+        return cryptoInt1;
     }
 
     public void setCryptoInt3(int cryptoInt3) {
-        writeProperty("cryptoInt3", cryptoInt3);
+        beforePropertyWrite("cryptoInt3", this.cryptoInt3, cryptoInt3);
+        this.cryptoInt3 = cryptoInt3;
     }
+
     public int getCryptoInt3() {
-        Object value = readProperty("cryptoInt3");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("cryptoInt3");
+        return cryptoInt3;
     }
 
     public void setCryptoInt4(int cryptoInt4) {
-        writeProperty("cryptoInt4", cryptoInt4);
+        beforePropertyWrite("cryptoInt4", this.cryptoInt4, cryptoInt4);
+        this.cryptoInt4 = cryptoInt4;
     }
+
     public int getCryptoInt4() {
-        Object value = readProperty("cryptoInt4");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("cryptoInt4");
+        return cryptoInt4;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "cryptoInt1":
+                return this.cryptoInt1;
+            case "cryptoInt3":
+                return this.cryptoInt3;
+            case "cryptoInt4":
+                return this.cryptoInt4;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "cryptoInt1":
+                this.cryptoInt1 = val == null ? 0 : (Integer)val;
+                break;
+            case "cryptoInt3":
+                this.cryptoInt3 = val == null ? 0 : (Integer)val;
+                break;
+            case "cryptoInt4":
+                this.cryptoInt4 = val == null ? 0 : (Integer)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.writeInt(cryptoInt1);
+        out.writeInt(cryptoInt3);
+        out.writeInt(cryptoInt4);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        cryptoInt1 = in.readInt();
+        cryptoInt3 = in.readInt();
+        cryptoInt4 = in.readInt();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java
index cd5df66..61db882 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.crypto.db.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Table6 extends CayenneDataObject {
+public abstract class _Table6 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,20 +22,84 @@ public abstract class _Table6 extends CayenneDataObject {
     public static final Property<Long> CRYPTO_INT1 = Property.create("cryptoInt1", Long.class);
     public static final Property<Integer> CRYPTO_INT4 = Property.create("cryptoInt4", Integer.class);
 
+    protected long cryptoInt1;
+    protected int cryptoInt4;
+
+
     public void setCryptoInt1(long cryptoInt1) {
-        writeProperty("cryptoInt1", cryptoInt1);
+        beforePropertyWrite("cryptoInt1", this.cryptoInt1, cryptoInt1);
+        this.cryptoInt1 = cryptoInt1;
     }
+
     public long getCryptoInt1() {
-        Object value = readProperty("cryptoInt1");
-        return (value != null) ? (Long) value : 0;
+        beforePropertyRead("cryptoInt1");
+        return cryptoInt1;
     }
 
     public void setCryptoInt4(int cryptoInt4) {
-        writeProperty("cryptoInt4", cryptoInt4);
+        beforePropertyWrite("cryptoInt4", this.cryptoInt4, cryptoInt4);
+        this.cryptoInt4 = cryptoInt4;
     }
+
     public int getCryptoInt4() {
-        Object value = readProperty("cryptoInt4");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("cryptoInt4");
+        return cryptoInt4;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "cryptoInt1":
+                return this.cryptoInt1;
+            case "cryptoInt4":
+                return this.cryptoInt4;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "cryptoInt1":
+                this.cryptoInt1 = val == null ? 0 : (Long)val;
+                break;
+            case "cryptoInt4":
+                this.cryptoInt4 = val == null ? 0 : (Integer)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.writeLong(cryptoInt1);
+        out.writeInt(cryptoInt4);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        cryptoInt1 = in.readLong();
+        cryptoInt4 = in.readInt();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTestEntity.java b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTestEntity.java
index d5db3b9..8b41f9c 100644
--- a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTestEntity.java
+++ b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.java8.db.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.time.LocalDate;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _LocalDateTestEntity extends CayenneDataObject {
+public abstract class _LocalDateTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _LocalDateTestEntity extends CayenneDataObject {
 
     public static final Property<LocalDate> DATE = Property.create("date", LocalDate.class);
 
+    protected LocalDate date;
+
+
     public void setDate(LocalDate date) {
-        writeProperty("date", date);
+        beforePropertyWrite("date", this.date, date);
+        this.date = date;
     }
+
     public LocalDate getDate() {
-        return (LocalDate)readProperty("date");
+        beforePropertyRead("date");
+        return date;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "date":
+                return this.date;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "date":
+                this.date = (LocalDate)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(date);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        date = (LocalDate)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTimeTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTimeTestEntity.java b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTimeTestEntity.java
index 59623a0..b630aad 100644
--- a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTimeTestEntity.java
+++ b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalDateTimeTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.java8.db.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.time.LocalDateTime;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _LocalDateTimeTestEntity extends CayenneDataObject {
+public abstract class _LocalDateTimeTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _LocalDateTimeTestEntity extends CayenneDataObject {
 
     public static final Property<LocalDateTime> TIMESTAMP = Property.create("timestamp", LocalDateTime.class);
 
+    protected LocalDateTime timestamp;
+
+
     public void setTimestamp(LocalDateTime timestamp) {
-        writeProperty("timestamp", timestamp);
+        beforePropertyWrite("timestamp", this.timestamp, timestamp);
+        this.timestamp = timestamp;
     }
+
     public LocalDateTime getTimestamp() {
-        return (LocalDateTime)readProperty("timestamp");
+        beforePropertyRead("timestamp");
+        return timestamp;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "timestamp":
+                return this.timestamp;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "timestamp":
+                this.timestamp = (LocalDateTime)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(timestamp);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        timestamp = (LocalDateTime)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalTimeTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalTimeTestEntity.java b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalTimeTestEntity.java
index 3b2ea88..f1496d3 100644
--- a/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalTimeTestEntity.java
+++ b/cayenne-java8/src/test/java/org/apache/cayenne/java8/db/auto/_LocalTimeTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.java8.db.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.time.LocalTime;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _LocalTimeTestEntity extends CayenneDataObject {
+public abstract class _LocalTimeTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _LocalTimeTestEntity extends CayenneDataObject {
 
     public static final Property<LocalTime> TIME = Property.create("time", LocalTime.class);
 
+    protected LocalTime time;
+
+
     public void setTime(LocalTime time) {
-        writeProperty("time", time);
+        beforePropertyWrite("time", this.time, time);
+        this.time = time;
     }
+
     public LocalTime getTime() {
-        return (LocalTime)readProperty("time");
+        beforePropertyRead("time");
+        return time;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "time":
+                return this.time;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "time":
+                this.time = (LocalTime)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(time);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        time = (LocalTime)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java b/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
new file mode 100644
index 0000000..17447c7
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
@@ -0,0 +1,722 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.reflect.PropertyUtils;
+import org.apache.cayenne.validation.BeanValidationFailure;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+/**
+ * Base implementation of DataObject,
+ * have no assumption about how data is actually stored.
+ *
+ * Two variants are currently supported:
+ * - field based storage, e.g. each entity class will directly define fields to store data
+ * - Map based storage, e.g. values will be stored in general Map (see {@link CayenneDataObject})
+ *
+ * @see CayenneDataObject
+ * @since 4.1
+ */
+public abstract class BaseDataObject extends PersistentObject implements DataObject, Validating {
+
+    private static final long serialVersionUID = 4598677040697008371L;
+
+    protected long snapshotVersion = DEFAULT_VERSION;
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        // return null by default to keep compatibility with pre 4.1 versions
+        return null;
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        throw new IllegalArgumentException("Unknown property: " + propName);
+    }
+
+    protected void beforePropertyRead(String propName) {
+        if(objectContext != null) {
+            // will resolve faults ourselves below as checking class descriptors
+            // for the "lazyFaulting" flag is inefficient. Passing "false" here to
+            // suppress fault processing
+            objectContext.prepareForAccess(this, propName, false);
+        }
+    }
+
+    protected void beforePropertyWrite(String propName, Object oldValue, Object newValue) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, propName, false);
+            objectContext.propertyChanged(this, propName, oldValue, newValue);
+        }
+    }
+
+    @Override
+    public Object readProperty(String propertyName) {
+        beforePropertyRead(propertyName);
+
+        Object object = readPropertyDirectly(propertyName);
+
+        if (object instanceof Fault) {
+            object = ((Fault) object).resolveFault(this, propertyName);
+            writePropertyDirectly(propertyName, object);
+        }
+
+        return object;
+    }
+
+    /**
+     * Returns a value of the property identified by a property path. Supports
+     * reading both mapped and unmapped properties. Unmapped properties are
+     * accessed in a manner consistent with JavaBeans specification.
+     * <p>
+     * Property path (or nested property) is a dot-separated path used to
+     * traverse object relationships until the final object is found. If a null
+     * object found while traversing path, null is returned. If a list is
+     * encountered in the middle of the path, CayenneRuntimeException is thrown.
+     * Unlike {@link #readPropertyDirectly(String)}, this method will resolve an
+     * object if it is HOLLOW.
+     * <p>
+     * Examples:
+     * </p>
+     * <ul>
+     * <li>Read this object property:<br>
+     * <code>String name = (String)artist.readNestedProperty("name");</code><br>
+     * <br>
+     * </li>
+     * <li>Read an object related to this object:<br>
+     * <code>Gallery g = (Gallery)paintingInfo.readNestedProperty("toPainting.toGallery");</code>
+     * <br>
+     * <br>
+     * </li>
+     * <li>Read a property of an object related to this object: <br>
+     * <code>String name = (String)painting.readNestedProperty("toArtist.artistName");</code>
+     * <br>
+     * <br>
+     * </li>
+     * <li>Read to-many relationship list:<br>
+     * <code>List exhibits = (List)painting.readNestedProperty("toGallery.exhibitArray");</code>
+     * <br>
+     * <br>
+     * </li>
+     * <li>Read to-many relationship in the middle of the path:<br>
+     * <code>List&lt;String&gt; names = (List&lt;String&gt;)artist.readNestedProperty("paintingArray.paintingName");</code>
+     * <br>
+     * <br>
+     * </li>
+     * </ul>
+     *
+     * @since 1.0.5
+     */
+    public Object readNestedProperty(String path) {
+
+        if ((null == path) || (0 == path.length())) {
+            throw new IllegalArgumentException("the path must be supplied in order to lookup a nested property");
+        }
+
+        int dotIndex = path.indexOf('.');
+
+        if (0 == dotIndex) {
+            throw new IllegalArgumentException("the path is invalid because it starts with a period character");
+        }
+
+        if (dotIndex == path.length() - 1) {
+            throw new IllegalArgumentException("the path is invalid because it ends with a period character");
+        }
+
+        if (-1 == dotIndex) {
+            return readSimpleProperty(path);
+        }
+
+        String path0 = path.substring(0, dotIndex);
+        String pathRemainder = path.substring(dotIndex + 1);
+
+        // this is copied from the old code where the placement of a plus
+        // character at the end of a segment of a property path would
+        // simply strip out the plus. I am not entirely sure why this is
+        // done. See unit test 'testReadNestedPropertyToManyInMiddle1'.
+
+        if ('+' == path0.charAt(path0.length() - 1)) {
+            path0 = path0.substring(0, path0.length() - 1);
+        }
+
+        Object property = readSimpleProperty(path0);
+
+        if (property == null) {
+            return null;
+        } else if (property instanceof DataObject) {
+            return ((DataObject) property).readNestedProperty(pathRemainder);
+        } else {
+            return Cayenne.readNestedProperty(property, pathRemainder);
+        }
+    }
+
+    Object readSimpleProperty(String property) {
+
+        // side effect - resolves HOLLOW object
+        Object object = readProperty(property);
+
+        // if a null value is returned, there is still a chance to
+        // find a non-persistent property via reflection
+        if (object == null) {
+            object = PropertyUtils.getProperty(this, property);
+        }
+
+        return object;
+    }
+
+    @Override
+    public void writeProperty(String propName, Object val) {
+        Object oldValue = readPropertyDirectly(propName);
+        beforePropertyWrite(propName, oldValue, val);
+
+        writePropertyDirectly(propName, val);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void removeToManyTarget(String relName, DataObject value, boolean setReverse) {
+
+        // Now do the rest of the normal handling (regardless of whether it was
+        // flattened or not)
+        Object holder = readProperty(relName);
+
+        // call 'propertyChanged' AFTER readProperty as readProperty ensures
+        // that this object fault is resolved
+        objectContext.propertyChanged(this, relName, value, null);
+
+        // TODO: andrus 8/20/2007 - can we optimize this somehow, avoiding type checking??
+        if (holder instanceof Collection) {
+            ((Collection<Object>) holder).remove(value);
+        } else if (holder instanceof Map) {
+            ((Map<Object, Object>) holder).remove(getMapKey(relName, value));
+        }
+
+        if (value != null && setReverse) {
+            unsetReverseRelationship(relName, value);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void addToManyTarget(String relName, DataObject value, boolean setReverse) {
+        if (value == null) {
+            throw new NullPointerException("Attempt to add null target DataObject.");
+        }
+
+        willConnect(relName, value);
+
+        // Now do the rest of the normal handling (regardless of whether it was
+        // flattened or not)
+        Object holder = readProperty(relName);
+
+        // call 'propertyChanged' AFTER readProperty as readProperty ensures
+        // that this object fault is resolved
+        objectContext.propertyChanged(this, relName, null, value);
+
+        // TODO: andrus 8/20/2007 - can we optimize this somehow, avoiding type checking??
+        if (holder instanceof Collection) {
+            ((Collection<Object>) holder).add(value);
+        } else if (holder instanceof Map) {
+            ((Map<Object, Object>) holder).put(getMapKey(relName, value), value);
+        }
+
+        if (setReverse) {
+            setReverseRelationship(relName, value);
+        }
+    }
+
+    /**
+     * Sets the relationships to the specified <code>DataObject</code> objects.
+     *
+     * <p>
+     * New relationships will be created with
+     * {@link #addToManyTarget(String, org.apache.cayenne.DataObject, boolean)},
+     * already established relationships stay untouched. Missing relationships
+     * will be removed with
+     * {@link #removeToManyTarget(String, org.apache.cayenne.DataObject, boolean)}
+     * and returnd as List. You may delete them manually.
+     * </p>
+     *
+     * <p>
+     * Notice: Moving an object relationship to another object, is still needing
+     * an manually "unregister" from the first object by
+     * {@link #removeToManyTarget(String, org.apache.cayenne.DataObject, boolean)}
+     * </p>
+     *
+     * @param relName
+     *            name of the relation
+     * @param values
+     *            <code>DataObject</code> objects of this
+     *            <code>Collection</code> are set to the object. No changes will
+     *            be made to the the <code>Collection</code>, a copy is used. It
+     *            is safe to pass a persisted <code>Collection</code> of another
+     *            object.
+     * @param setReverse
+     *            update reverse relationships
+     * @return <code>List&lt;? extends DataObject&gt;</code> of unrelated
+     *         DataObjects. If no relationship was removed an empty List is
+     *         returned.
+     * @throws IllegalArgumentException
+     *             if no relationship could be read by relName, or if the passed
+     *             <code>Collection</code> is null. To clear all relationships
+     *             use an empty <code>Collection</code>
+     * @throws UnsupportedOperationException
+     *             if the relation Collection Type is neither
+     *             <code>java.util.Collection</code> nor
+     *             <code>java.util.Map</code>
+     * @since 4.0
+     */
+    @SuppressWarnings("unchecked")
+    public List<? extends DataObject> setToManyTarget(String relName, Collection<? extends DataObject> values,
+                                                      boolean setReverse) {
+        if (values == null) {
+            throw new IllegalArgumentException("values Collection is null. To clear all relationships use an empty Collection");
+        }
+
+        Object property = readProperty(relName);
+        if(property == null) {
+            throw new IllegalArgumentException("unknown relName " + relName);
+        }
+        Collection<DataObject> old = null;
+        if (property instanceof Map) {
+            old = ((Map) property).values();
+        } else if (property instanceof Collection) {
+            old = (Collection) property;
+        } else {
+            throw new UnsupportedOperationException("setToManyTarget operates only with Map or Collection types");
+        }
+
+        // operate on a copy of passed collection
+        values = new ArrayList<>(values);
+
+        List<DataObject> removedObjects = new ArrayList<>();
+
+        // remove all relationships, which are missing in passed collection
+        Object[] oldValues = old.toArray();
+        for (Object obj : oldValues) {
+            if (!values.contains(obj)) {
+                DataObject obj2 = (DataObject) obj;
+                removeToManyTarget(relName, obj2, setReverse);
+                // collect objects whose relationship was removed
+                removedObjects.add((DataObject) obj2);
+            }
+        }
+
+        // dont add elements which are already present
+        for (Object obj : old) {
+            values.remove(obj);
+        }
+
+        // add new elements
+        for (DataObject obj : values) {
+            addToManyTarget(relName, obj, setReverse);
+        }
+
+        return removedObjects;
+    }
+
+    @Override
+    public void setToOneTarget(String relationshipName, DataObject value, boolean setReverse) {
+
+        willConnect(relationshipName, value);
+
+        Object oldTarget = readProperty(relationshipName);
+        if (oldTarget == value) {
+            return;
+        }
+
+        getObjectContext().propertyChanged(this, relationshipName, oldTarget, value);
+
+        if (setReverse) {
+            // unset old reverse relationship
+            if (oldTarget instanceof DataObject) {
+                unsetReverseRelationship(relationshipName, (DataObject) oldTarget);
+            }
+
+            // set new reverse relationship
+            if (value != null) {
+                setReverseRelationship(relationshipName, value);
+            }
+        }
+
+        // readProperty will call this
+        //objectContext.prepareForAccess(this, relationshipName, false);
+        writePropertyDirectly(relationshipName, value);
+    }
+
+    /**
+     * Called before establishing a relationship with another object. Applies
+     * "persistence by reachability" logic, pulling one of the two objects to a
+     * DataConext of another object in case one of the objects is transient. If
+     * both objects are persistent, and they don't have the same DataContext,
+     * CayenneRuntimeException is thrown.
+     *
+     * @since 1.2
+     */
+    protected void willConnect(String relationshipName, Persistent object) {
+        // first handle most common case - both objects are in the same
+        // ObjectContext or target is null
+        if (object == null || this.getObjectContext() == object.getObjectContext()) {
+            return;
+        } else if (this.getObjectContext() == null && object.getObjectContext() != null) {
+            object.getObjectContext().registerNewObject(this);
+        } else if (this.getObjectContext() != null && object.getObjectContext() == null) {
+            this.getObjectContext().registerNewObject(object);
+        } else {
+            throw new CayenneRuntimeException("Cannot set object as destination of relationship %s"
+                    + " because it is in a different ObjectContext",  relationshipName);
+        }
+    }
+
+    /**
+     * Initializes reverse relationship from object <code>val</code> to this
+     * object.
+     *
+     * @param relName
+     *            name of relationship from this object to <code>val</code>.
+     */
+    protected void setReverseRelationship(String relName, DataObject val) {
+        ObjRelationship rel = objectContext.getEntityResolver().getObjEntity(objectId.getEntityName())
+                .getRelationship(relName);
+        ObjRelationship revRel = rel.getReverseRelationship();
+        if (revRel != null) {
+            if (revRel.isToMany()) {
+                val.addToManyTarget(revRel.getName(), this, false);
+            } else {
+                val.setToOneTarget(revRel.getName(), this, false);
+            }
+        }
+    }
+
+    /**
+     * Removes current object from reverse relationship of object
+     * <code>val</code> to this object.
+     */
+    protected void unsetReverseRelationship(String relName, DataObject val) {
+
+        EntityResolver resolver = objectContext.getEntityResolver();
+        ObjEntity entity = resolver.getObjEntity(objectId.getEntityName());
+
+        if (entity == null) {
+            throw new IllegalStateException("DataObject's entity is unmapped, objectId: " + objectId);
+        }
+
+        ObjRelationship rel = entity.getRelationship(relName);
+        ObjRelationship revRel = rel.getReverseRelationship();
+        if (revRel != null) {
+            if (revRel.isToMany()) {
+                val.removeToManyTarget(revRel.getName(), this, false);
+            } else {
+                val.setToOneTarget(revRel.getName(), null, false);
+            }
+        }
+    }
+
+    @Override
+    public void setPersistenceState(int persistenceState) {
+        this.persistenceState = persistenceState;
+    }
+
+    /**
+     * @since 1.1
+     */
+    @Override
+    public long getSnapshotVersion() {
+        return snapshotVersion;
+    }
+
+    /**
+     * @since 1.1
+     */
+    @Override
+    public void setSnapshotVersion(long snapshotVersion) {
+        this.snapshotVersion = snapshotVersion;
+    }
+
+    /**
+     * Performs property validation of the object, appending any validation
+     * failures to the provided validationResult object. This method is invoked
+     * from "validateFor.." before committing a NEW or MODIFIED object to the
+     * database. Validation includes checking for null values and value sizes.
+     * CayenneDataObject subclasses may override this method, calling super.
+     *
+     * @since 1.1
+     */
+    protected void validateForSave(ValidationResult validationResult) {
+
+        ObjEntity objEntity = getObjectContext().getEntityResolver().getObjEntity(this);
+        if (objEntity == null) {
+            throw new CayenneRuntimeException("No ObjEntity mapping found for DataObject %s", getClass().getName());
+        }
+
+        // validate mandatory attributes
+
+        Map<String, ValidationFailure> failedDbAttributes = null;
+
+        for (ObjAttribute next : objEntity.getAttributes()) {
+
+            // TODO: andrus, 2/20/2007 - handle embedded attribute
+            if (next instanceof EmbeddedAttribute) {
+                continue;
+            }
+
+            DbAttribute dbAttribute = next.getDbAttribute();
+            if (dbAttribute == null) {
+                throw new CayenneRuntimeException("ObjAttribute '%s"
+                        + "' does not have a corresponding DbAttribute", next.getName());
+            }
+
+            // pk may still be generated
+            if (dbAttribute.isPrimaryKey()) {
+                continue;
+            }
+
+            Object value = this.readPropertyDirectly(next.getName());
+            if (dbAttribute.isMandatory()) {
+                ValidationFailure failure = BeanValidationFailure.validateNotNull(this, next.getName(), value);
+
+                if (failure != null) {
+
+                    if (failedDbAttributes == null) {
+                        failedDbAttributes = new HashMap<>();
+                    }
+
+                    failedDbAttributes.put(dbAttribute.getName(), failure);
+                    continue;
+                }
+            }
+
+            // validate length
+            if (value != null && dbAttribute.getMaxLength() > 0) {
+                if (value.getClass().isArray()) {
+                    int len = Array.getLength(value);
+                    if (len > dbAttribute.getMaxLength()) {
+                        String message = "\"" + next.getName() + "\" exceeds maximum allowed length ("
+                                + dbAttribute.getMaxLength() + " bytes): " + len;
+                        validationResult.addFailure(new BeanValidationFailure(this, next.getName(), message));
+                    }
+                } else if (value instanceof CharSequence) {
+                    int len = ((CharSequence) value).length();
+                    if (len > dbAttribute.getMaxLength()) {
+                        String message = "\"" + next.getName() + "\" exceeds maximum allowed length ("
+                                + dbAttribute.getMaxLength() + " chars): " + len;
+                        validationResult.addFailure(new BeanValidationFailure(this, next.getName(), message));
+                    }
+                }
+            }
+        }
+
+        // validate mandatory relationships
+        for (final ObjRelationship relationship : objEntity.getRelationships()) {
+
+            List<DbRelationship> dbRels = relationship.getDbRelationships();
+            if (dbRels.isEmpty()) {
+                continue;
+            }
+
+            // skip db relationships that we can't validate or that can't be invalid here
+            // can't handle paths longer than two db relationships
+            // see ObjRelationship.recalculateReadOnlyValue() for more info
+            if (relationship.isSourceIndependentFromTargetChange()) {
+                continue;
+            }
+
+            // if db relationship is not based on a PK and is based on mandatory
+            // attributes, see if we have a target object set
+            // relationship will be validated only if all db path has mandatory
+            // db relationships
+            boolean validate = true;
+            for (DbRelationship dbRelationship : dbRels) {
+                for (DbJoin join : dbRelationship.getJoins()) {
+                    DbAttribute source = join.getSource();
+                    if (source.isMandatory()) {
+                        // clear attribute failures...
+                        if (failedDbAttributes != null && !failedDbAttributes.isEmpty()) {
+                            failedDbAttributes.remove(source.getName());
+                        }
+                    } else {
+                        // do not validate if the relation is based on
+                        // multiple keys with some that can be nullable.
+                        validate = false;
+                    }
+                }
+            }
+
+            if (validate) {
+                Object value = this.readPropertyDirectly(relationship.getName());
+                ValidationFailure failure = BeanValidationFailure.validateNotNull(this, relationship.getName(), value);
+
+                if (failure != null) {
+                    validationResult.addFailure(failure);
+                }
+            }
+        }
+
+        // deal with previously found attribute failures...
+        if (failedDbAttributes != null && !failedDbAttributes.isEmpty()) {
+            for (ValidationFailure failure : failedDbAttributes.values()) {
+                validationResult.addFailure(failure);
+            }
+        }
+    }
+
+    /**
+     * Calls {@link #validateForSave(ValidationResult)}. CayenneDataObject
+     * subclasses may override it providing validation logic that should be
+     * executed for the newly created objects before saving them.
+     *
+     * @since 1.1
+     */
+    @Override
+    public void validateForInsert(ValidationResult validationResult) {
+        validateForSave(validationResult);
+    }
+
+    /**
+     * Calls {@link #validateForSave(ValidationResult)}. CayenneDataObject
+     * subclasses may override it providing validation logic that should be
+     * executed for the modified objects before saving them.
+     *
+     * @since 1.1
+     */
+    @Override
+    public void validateForUpdate(ValidationResult validationResult) {
+        validateForSave(validationResult);
+    }
+
+    /**
+     * This implementation does nothing. CayenneDataObject subclasses may
+     * override it providing validation logic that should be executed for the
+     * deleted objects before committing them.
+     *
+     * @since 1.1
+     */
+    @Override
+    public void validateForDelete(ValidationResult validationResult) {
+        // does nothing
+    }
+
+    /**
+     * @since 1.2
+     */
+    @Override
+    public void setObjectContext(ObjectContext objectContext) {
+        this.objectContext = objectContext;
+
+        if (objectContext == null) {
+            this.persistenceState = PersistenceState.TRANSIENT;
+        }
+    }
+
+    /**
+     * Serialization support.
+     * Will write down persistenceState and objectId, delegating data serialization down to sub-classes.
+     */
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    /**
+     * Serialization support.
+     * Will read persistenceState and objectId, delegating data serialization down to sub-classes.
+     */
+    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    protected void writeSerialized(ObjectOutputStream out) throws IOException {
+        out.writeInt(persistenceState);
+        out.writeObject(objectId);
+
+        if(persistenceState == PersistenceState.COMMITTED
+                || persistenceState == PersistenceState.HOLLOW) {
+            return;
+        }
+
+        writeState(out);
+    }
+
+    protected void readSerialized(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        this.persistenceState = in.readInt();
+        this.objectId = (ObjectId) in.readObject();
+
+        if(persistenceState == PersistenceState.COMMITTED
+                || persistenceState == PersistenceState.HOLLOW) {
+            persistenceState = PersistenceState.HOLLOW;
+            return;
+        }
+
+        readState(in);
+    }
+
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        // no additional info for base class
+    }
+
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        // no additional info for base class
+    }
+
+    /**
+     * A variation of "toString" method, that may be more efficient in some
+     * cases. For example when printing a list of objects into the same String.
+     */
+    public StringBuffer toStringBuffer(StringBuffer buffer, boolean fullDesc) {
+        String id = (objectId != null) ? objectId.toString() : "<no id>";
+        String state = PersistenceState.persistenceStateName(persistenceState);
+
+        buffer.append('{').append(id).append("; ").append(state).append("; ");
+
+        if (fullDesc) {
+            appendProperties(buffer);
+        }
+
+        buffer.append("}");
+        return buffer;
+    }
+
+    protected void appendProperties(StringBuffer buffer) {
+    }
+
+    @Override
+    public String toString() {
+        return toStringBuffer(new StringBuffer(), true).toString();
+    }
+
+}


[14/18] cayenne git commit: CAY-2330 Field based data objects update test classes to latest cgen templates

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
index 546921d..0ac76c6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
@@ -37,7 +37,7 @@ public abstract class _Qualified1 extends BaseDataObject {
 
     public Boolean getDeleted() {
         beforePropertyRead("deleted");
-        return deleted;
+        return this.deleted;
     }
 
     public void setName(String name) {
@@ -47,7 +47,7 @@ public abstract class _Qualified1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToQualified2s(Qualified2 obj) {
@@ -113,17 +113,17 @@ public abstract class _Qualified1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(deleted);
-        out.writeObject(name);
-        out.writeObject(qualified2s);
+        out.writeObject(this.deleted);
+        out.writeObject(this.name);
+        out.writeObject(this.qualified2s);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        deleted = (Boolean)in.readObject();
-        name = (String)in.readObject();
-        qualified2s = in.readObject();
+        this.deleted = (Boolean)in.readObject();
+        this.name = (String)in.readObject();
+        this.qualified2s = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
index fd82379..77b772d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified2.java
@@ -36,7 +36,7 @@ public abstract class _Qualified2 extends BaseDataObject {
 
     public Boolean getDeleted() {
         beforePropertyRead("deleted");
-        return deleted;
+        return this.deleted;
     }
 
     public void setName(String name) {
@@ -46,7 +46,7 @@ public abstract class _Qualified2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setQualified1(Qualified1 qualified1) {
@@ -107,17 +107,17 @@ public abstract class _Qualified2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(deleted);
-        out.writeObject(name);
-        out.writeObject(qualified1);
+        out.writeObject(this.deleted);
+        out.writeObject(this.name);
+        out.writeObject(this.qualified1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        deleted = (Boolean)in.readObject();
-        name = (String)in.readObject();
-        qualified1 = in.readObject();
+        this.deleted = (Boolean)in.readObject();
+        this.name = (String)in.readObject();
+        this.qualified1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
index cba1592..2ee2364 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_QuoteAdress.java
@@ -36,7 +36,7 @@ public abstract class _QuoteAdress extends BaseDataObject {
 
     public String getCity() {
         beforePropertyRead("city");
-        return city;
+        return this.city;
     }
 
     public void setGroup(String group) {
@@ -46,7 +46,7 @@ public abstract class _QuoteAdress extends BaseDataObject {
 
     public String getGroup() {
         beforePropertyRead("group");
-        return group;
+        return this.group;
     }
 
     public void setPerson_Rel(Quote_Person person_Rel) {
@@ -107,17 +107,17 @@ public abstract class _QuoteAdress extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(city);
-        out.writeObject(group);
-        out.writeObject(person_Rel);
+        out.writeObject(this.city);
+        out.writeObject(this.group);
+        out.writeObject(this.person_Rel);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        city = (String)in.readObject();
-        group = (String)in.readObject();
-        person_Rel = in.readObject();
+        this.city = (String)in.readObject();
+        this.group = (String)in.readObject();
+        this.person_Rel = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
index 0f32540..3fe42e0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/quotemap/auto/_Quote_Person.java
@@ -43,7 +43,7 @@ public abstract class _Quote_Person extends BaseDataObject {
 
     public Date getDAte() {
         beforePropertyRead("dAte");
-        return dAte;
+        return this.dAte;
     }
 
     public void setFULL_name(String fULL_name) {
@@ -53,7 +53,7 @@ public abstract class _Quote_Person extends BaseDataObject {
 
     public String getFULL_name() {
         beforePropertyRead("fULL_name");
-        return fULL_name;
+        return this.fULL_name;
     }
 
     public void setGroup(String group) {
@@ -63,7 +63,7 @@ public abstract class _Quote_Person extends BaseDataObject {
 
     public String getGroup() {
         beforePropertyRead("group");
-        return group;
+        return this.group;
     }
 
     public void setName(String name) {
@@ -73,7 +73,7 @@ public abstract class _Quote_Person extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setSalary(Integer salary) {
@@ -83,7 +83,7 @@ public abstract class _Quote_Person extends BaseDataObject {
 
     public Integer getSalary() {
         beforePropertyRead("salary");
-        return salary;
+        return this.salary;
     }
 
     public void setAddress_Rel(QuoteAdress address_Rel) {
@@ -159,23 +159,23 @@ public abstract class _Quote_Person extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(dAte);
-        out.writeObject(fULL_name);
-        out.writeObject(group);
-        out.writeObject(name);
-        out.writeObject(salary);
-        out.writeObject(address_Rel);
+        out.writeObject(this.dAte);
+        out.writeObject(this.fULL_name);
+        out.writeObject(this.group);
+        out.writeObject(this.name);
+        out.writeObject(this.salary);
+        out.writeObject(this.address_Rel);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        dAte = (Date)in.readObject();
-        fULL_name = (String)in.readObject();
-        group = (String)in.readObject();
-        name = (String)in.readObject();
-        salary = (Integer)in.readObject();
-        address_Rel = in.readObject();
+        this.dAte = (Date)in.readObject();
+        this.fULL_name = (String)in.readObject();
+        this.group = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.salary = (Integer)in.readObject();
+        this.address_Rel = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
index 9a4238d..81a85a0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/reflexive/auto/_Reflexive.java
@@ -37,7 +37,7 @@ public abstract class _Reflexive extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToChildren(Reflexive obj) {
@@ -111,17 +111,17 @@ public abstract class _Reflexive extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(children);
-        out.writeObject(toParent);
+        out.writeObject(this.name);
+        out.writeObject(this.children);
+        out.writeObject(this.toParent);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        children = in.readObject();
-        toParent = in.readObject();
+        this.name = (String)in.readObject();
+        this.children = in.readObject();
+        this.toParent = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
index 33129d9..a7a7ebf 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_FkOfDifferentType.java
@@ -73,13 +73,13 @@ public abstract class _FkOfDifferentType extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(relationshipHelper);
+        out.writeObject(this.relationshipHelper);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        relationshipHelper = in.readObject();
+        this.relationshipHelper = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
index 37b13c0..a14eece 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_MeaningfulFK.java
@@ -34,7 +34,7 @@ public abstract class _MeaningfulFK extends BaseDataObject {
 
     public Integer getRelationshipHelperID() {
         beforePropertyRead("relationshipHelperID");
-        return relationshipHelperID;
+        return this.relationshipHelperID;
     }
 
     public void setToRelationshipHelper(RelationshipHelper toRelationshipHelper) {
@@ -90,15 +90,15 @@ public abstract class _MeaningfulFK extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(relationshipHelperID);
-        out.writeObject(toRelationshipHelper);
+        out.writeObject(this.relationshipHelperID);
+        out.writeObject(this.toRelationshipHelper);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        relationshipHelperID = (Integer)in.readObject();
-        toRelationshipHelper = in.readObject();
+        this.relationshipHelperID = (Integer)in.readObject();
+        this.toRelationshipHelper = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
index 3666855..750527f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_ReflexiveAndToOne.java
@@ -40,7 +40,7 @@ public abstract class _ReflexiveAndToOne extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToChildren(ReflexiveAndToOne obj) {
@@ -127,19 +127,19 @@ public abstract class _ReflexiveAndToOne extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(children);
-        out.writeObject(toHelper);
-        out.writeObject(toParent);
+        out.writeObject(this.name);
+        out.writeObject(this.children);
+        out.writeObject(this.toHelper);
+        out.writeObject(this.toParent);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        children = in.readObject();
-        toHelper = in.readObject();
-        toParent = in.readObject();
+        this.name = (String)in.readObject();
+        this.children = in.readObject();
+        this.toHelper = in.readObject();
+        this.toParent = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
index b36d04d..2e2d51c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships/auto/_RelationshipHelper.java
@@ -41,7 +41,7 @@ public abstract class _RelationshipHelper extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFksOfDifferentType(FkOfDifferentType obj) {
@@ -138,19 +138,19 @@ public abstract class _RelationshipHelper extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(fksOfDifferentType);
-        out.writeObject(meanigfulFKs);
-        out.writeObject(reflexiveAndToOneArray);
+        out.writeObject(this.name);
+        out.writeObject(this.fksOfDifferentType);
+        out.writeObject(this.meanigfulFKs);
+        out.writeObject(this.reflexiveAndToOneArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        fksOfDifferentType = in.readObject();
-        meanigfulFKs = in.readObject();
-        reflexiveAndToOneArray = in.readObject();
+        this.name = (String)in.readObject();
+        this.fksOfDifferentType = in.readObject();
+        this.meanigfulFKs = in.readObject();
+        this.reflexiveAndToOneArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
index 1dbdc84..da9ad3f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_Activity.java
@@ -38,7 +38,7 @@ public abstract class _Activity extends BaseDataObject {
 
     public Date getAppointmentDate() {
         beforePropertyRead("appointmentDate");
-        return appointmentDate;
+        return this.appointmentDate;
     }
 
     public void setAppointmentNo(int appointmentNo) {
@@ -48,7 +48,7 @@ public abstract class _Activity extends BaseDataObject {
 
     public int getAppointmentNo() {
         beforePropertyRead("appointmentNo");
-        return appointmentNo;
+        return this.appointmentNo;
     }
 
     public void addToResults(ActivityResult obj) {
@@ -93,7 +93,7 @@ public abstract class _Activity extends BaseDataObject {
                 this.appointmentDate = (Date)val;
                 break;
             case "appointmentNo":
-                this.appointmentNo = (Integer)val;
+                this.appointmentNo = val == null ? 0 : (Integer)val;
                 break;
             case "results":
                 this.results = val;
@@ -114,17 +114,17 @@ public abstract class _Activity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(appointmentDate);
-        out.writeInt(appointmentNo);
-        out.writeObject(results);
+        out.writeObject(this.appointmentDate);
+        out.writeInt(this.appointmentNo);
+        out.writeObject(this.results);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        appointmentDate = (Date)in.readObject();
-        appointmentNo = in.readInt();
-        results = in.readObject();
+        this.appointmentDate = (Date)in.readObject();
+        this.appointmentNo = in.readInt();
+        this.results = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
index c713e8f..cd5fb62 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_activity/auto/_ActivityResult.java
@@ -38,7 +38,7 @@ public abstract class _ActivityResult extends BaseDataObject {
 
     public Date getAppointDate() {
         beforePropertyRead("appointDate");
-        return appointDate;
+        return this.appointDate;
     }
 
     public void setAppointNo(int appointNo) {
@@ -48,7 +48,7 @@ public abstract class _ActivityResult extends BaseDataObject {
 
     public int getAppointNo() {
         beforePropertyRead("appointNo");
-        return appointNo;
+        return this.appointNo;
     }
 
     public void setField(String field) {
@@ -58,7 +58,7 @@ public abstract class _ActivityResult extends BaseDataObject {
 
     public String getField() {
         beforePropertyRead("field");
-        return field;
+        return this.field;
     }
 
     @Override
@@ -90,7 +90,7 @@ public abstract class _ActivityResult extends BaseDataObject {
                 this.appointDate = (Date)val;
                 break;
             case "appointNo":
-                this.appointNo = (Integer)val;
+                this.appointNo = val == null ? 0 : (Integer)val;
                 break;
             case "field":
                 this.field = (String)val;
@@ -111,17 +111,17 @@ public abstract class _ActivityResult extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(appointDate);
-        out.writeInt(appointNo);
-        out.writeObject(field);
+        out.writeObject(this.appointDate);
+        out.writeInt(this.appointNo);
+        out.writeObject(this.field);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        appointDate = (Date)in.readObject();
-        appointNo = in.readInt();
-        field = (String)in.readObject();
+        this.appointDate = (Date)in.readObject();
+        this.appointNo = in.readInt();
+        this.field = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
index 6c0c80d..fd3be7d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Child.java
@@ -73,13 +73,13 @@ public abstract class _Child extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(master);
+        out.writeObject(this.master);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        master = in.readObject();
+        this.master = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
index fb90e0b..fc412bd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_child_master/auto/_Master.java
@@ -35,7 +35,7 @@ public abstract class _Master extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToChildren(Child obj) {
@@ -96,15 +96,15 @@ public abstract class _Master extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(children);
+        out.writeObject(this.name);
+        out.writeObject(this.children);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        children = in.readObject();
+        this.name = (String)in.readObject();
+        this.children = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
index 3f455bb..7f3efed 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobDetail.java
@@ -34,7 +34,7 @@ public abstract class _ClobDetail extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setMaster(ClobMaster master) {
@@ -90,15 +90,15 @@ public abstract class _ClobDetail extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(master);
+        out.writeObject(this.name);
+        out.writeObject(this.master);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        master = in.readObject();
+        this.name = (String)in.readObject();
+        this.master = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
index d88ad8f..d970afe 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_clob/auto/_ClobMaster.java
@@ -37,7 +37,7 @@ public abstract class _ClobMaster extends BaseDataObject {
 
     public String getClobColumn() {
         beforePropertyRead("clobColumn");
-        return clobColumn;
+        return this.clobColumn;
     }
 
     public void setName(String name) {
@@ -47,7 +47,7 @@ public abstract class _ClobMaster extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToDetails(ClobDetail obj) {
@@ -113,17 +113,17 @@ public abstract class _ClobMaster extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(clobColumn);
-        out.writeObject(name);
-        out.writeObject(details);
+        out.writeObject(this.clobColumn);
+        out.writeObject(this.name);
+        out.writeObject(this.details);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        clobColumn = (String)in.readObject();
-        name = (String)in.readObject();
-        details = in.readObject();
+        this.clobColumn = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.details = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
index c771d5e..6543da7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToMany.java
@@ -79,13 +79,13 @@ public abstract class _CollectionToMany extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(targets);
+        out.writeObject(this.targets);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        targets = in.readObject();
+        this.targets = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
index 6ed5354..653d9d2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_collection_to_many/auto/_CollectionToManyTarget.java
@@ -73,13 +73,13 @@ public abstract class _CollectionToManyTarget extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(collectionToMany);
+        out.writeObject(this.collectionToMany);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        collectionToMany = in.readObject();
+        this.collectionToMany = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
index c9d5139..7d986f3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatA.java
@@ -79,13 +79,13 @@ public abstract class _DeleteRuleFlatA extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(flatB);
+        out.writeObject(this.flatB);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        flatB = in.readObject();
+        this.flatB = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
index da50775..2df6405 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleFlatB.java
@@ -79,13 +79,13 @@ public abstract class _DeleteRuleFlatB extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(untitledRel);
+        out.writeObject(this.untitledRel);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        untitledRel = in.readObject();
+        this.untitledRel = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
index 6bd477f..150a973 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest1.java
@@ -73,13 +73,13 @@ public abstract class _DeleteRuleTest1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(test2);
+        out.writeObject(this.test2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        test2 = in.readObject();
+        this.test2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
index 1a88c8e..12f0254 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/relationships_delete_rules/auto/_DeleteRuleTest2.java
@@ -100,15 +100,15 @@ public abstract class _DeleteRuleTest2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(deleteRuleTest3Array);
-        out.writeObject(test1Array);
+        out.writeObject(this.deleteRuleTest3Array);
+        out.writeObject(this.test1Array);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        deleteRuleTest3Array = in.readObject();
-        test1Array = in.readObject();
+        this.deleteRuleTest3Array = in.readObject();
+        this.test1Array = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 a908ca4..1cd806d 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
@@ -73,13 +73,13 @@ public abstract class _DeleteRuleTest3 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toDeleteRuleTest2);
+        out.writeObject(this.toDeleteRuleTest2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toDeleteRuleTest2 = in.readObject();
+        this.toDeleteRuleTest2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 23b387e..a62f528 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
@@ -99,15 +99,15 @@ public abstract class _FlattenedCircular extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(side1s);
-        out.writeObject(side2s);
+        out.writeObject(this.side1s);
+        out.writeObject(this.side2s);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        side1s = in.readObject();
-        side2s = in.readObject();
+        this.side1s = in.readObject();
+        this.side2s = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 a60aff7..1cde2b6 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
@@ -46,7 +46,7 @@ public abstract class _FlattenedTest1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFt2Array(FlattenedTest2 obj) {
@@ -163,23 +163,23 @@ public abstract class _FlattenedTest1 extends BaseDataObject {
     @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);
+        out.writeObject(this.name);
+        out.writeObject(this.ft2Array);
+        out.writeObject(this.ft3Array);
+        out.writeObject(this.ft3OverComplex);
+        out.writeObject(this.ft4ArrayFor1);
+        out.writeObject(this.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();
+        this.name = (String)in.readObject();
+        this.ft2Array = in.readObject();
+        this.ft3Array = in.readObject();
+        this.ft3OverComplex = in.readObject();
+        this.ft4ArrayFor1 = in.readObject();
+        this.ft5Array = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 5cee2ab..ed8921c 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
@@ -38,7 +38,7 @@ public abstract class _FlattenedTest2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFt3Array(FlattenedTest3 obj) {
@@ -112,17 +112,17 @@ public abstract class _FlattenedTest2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(ft3Array);
-        out.writeObject(toFT1);
+        out.writeObject(this.name);
+        out.writeObject(this.ft3Array);
+        out.writeObject(this.toFT1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        ft3Array = in.readObject();
-        toFT1 = in.readObject();
+        this.name = (String)in.readObject();
+        this.ft3Array = in.readObject();
+        this.toFT1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 ce4fb5c..1de97ac 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
@@ -41,7 +41,7 @@ public abstract class _FlattenedTest3 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFt4Array(FlattenedTest4 obj) {
@@ -124,19 +124,19 @@ public abstract class _FlattenedTest3 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(ft4Array);
-        out.writeObject(toFT1);
-        out.writeObject(toFT2);
+        out.writeObject(this.name);
+        out.writeObject(this.ft4Array);
+        out.writeObject(this.toFT1);
+        out.writeObject(this.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();
+        this.name = (String)in.readObject();
+        this.ft4Array = in.readObject();
+        this.toFT1 = in.readObject();
+        this.toFT2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 725f2b5..7bf8825 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
@@ -34,7 +34,7 @@ public abstract class _FlattenedTest4 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToFT3(FlattenedTest3 toFT3) {
@@ -90,15 +90,15 @@ public abstract class _FlattenedTest4 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toFT3);
+        out.writeObject(this.name);
+        out.writeObject(this.toFT3);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toFT3 = in.readObject();
+        this.name = (String)in.readObject();
+        this.toFT3 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 e6112ab..74f8328 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
@@ -34,7 +34,7 @@ public abstract class _FlattenedTest5 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToFT1(FlattenedTest1 toFT1) {
@@ -90,15 +90,15 @@ public abstract class _FlattenedTest5 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toFT1);
+        out.writeObject(this.name);
+        out.writeObject(this.toFT1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toFT1 = in.readObject();
+        this.name = (String)in.readObject();
+        this.toFT1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 07ba3e7..d17f891 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
@@ -79,13 +79,13 @@ public abstract class _SetToMany extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(targets);
+        out.writeObject(this.targets);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        targets = in.readObject();
+        this.targets = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 dd0d5ca..59b149b 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
@@ -73,13 +73,13 @@ public abstract class _SetToManyTarget extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(setToMany);
+        out.writeObject(this.setToMany);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        setToMany = in.readObject();
+        this.setToMany = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 25c3d34..45fe97f 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
@@ -40,7 +40,7 @@ public abstract class _ToManyFkDep extends BaseDataObject {
 
     public Integer getDepId() {
         beforePropertyRead("depId");
-        return depId;
+        return this.depId;
     }
 
     public void setName(String name) {
@@ -50,7 +50,7 @@ public abstract class _ToManyFkDep extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setRoot(ToManyFkRoot root) {
@@ -124,19 +124,19 @@ public abstract class _ToManyFkDep extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(depId);
-        out.writeObject(name);
-        out.writeObject(root);
-        out.writeObject(root2);
+        out.writeObject(this.depId);
+        out.writeObject(this.name);
+        out.writeObject(this.root);
+        out.writeObject(this.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();
+        this.depId = (Integer)in.readObject();
+        this.name = (String)in.readObject();
+        this.root = in.readObject();
+        this.root2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 496de77..aa0157b 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
@@ -37,7 +37,7 @@ public abstract class _ToManyFkRoot extends BaseDataObject {
 
     public Integer getDepId() {
         beforePropertyRead("depId");
-        return depId;
+        return this.depId;
     }
 
     public void setName(String name) {
@@ -47,7 +47,7 @@ public abstract class _ToManyFkRoot extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToDeps(ToManyFkDep obj) {
@@ -113,17 +113,17 @@ public abstract class _ToManyFkRoot extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(depId);
-        out.writeObject(name);
-        out.writeObject(deps);
+        out.writeObject(this.depId);
+        out.writeObject(this.name);
+        out.writeObject(this.deps);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        depId = (Integer)in.readObject();
-        name = (String)in.readObject();
-        deps = in.readObject();
+        this.depId = (Integer)in.readObject();
+        this.name = (String)in.readObject();
+        this.deps = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 27bebd2..b950ef2 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
@@ -35,7 +35,7 @@ public abstract class _ToManyRoot2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToDeps(ToManyFkDep obj) {
@@ -96,15 +96,15 @@ public abstract class _ToManyRoot2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(deps);
+        out.writeObject(this.name);
+        out.writeObject(this.deps);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        deps = in.readObject();
+        this.name = (String)in.readObject();
+        this.deps = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 3e911ce..5929024 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
@@ -73,13 +73,13 @@ public abstract class _ToOneFK1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toPK);
+        out.writeObject(this.toPK);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toPK = in.readObject();
+        this.toPK = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 1ae24c7..1e98f78 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
@@ -73,13 +73,13 @@ public abstract class _ToOneFK2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toOneToFK);
+        out.writeObject(this.toOneToFK);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toOneToFK = in.readObject();
+        this.toOneToFK = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 fc1de31..f100857 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
@@ -71,7 +71,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Long getBigintColumn() {
         beforePropertyRead("bigintColumn");
-        return bigintColumn;
+        return this.bigintColumn;
     }
 
     public void setBitColumn(Boolean bitColumn) {
@@ -81,7 +81,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Boolean getBitColumn() {
         beforePropertyRead("bitColumn");
-        return bitColumn;
+        return this.bitColumn;
     }
 
     public void setBooleanColumn(Boolean booleanColumn) {
@@ -91,7 +91,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Boolean getBooleanColumn() {
         beforePropertyRead("booleanColumn");
-        return booleanColumn;
+        return this.booleanColumn;
     }
 
     public void setCharColumn(String charColumn) {
@@ -101,7 +101,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getCharColumn() {
         beforePropertyRead("charColumn");
-        return charColumn;
+        return this.charColumn;
     }
 
     public void setDateColumn(Date dateColumn) {
@@ -111,7 +111,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Date getDateColumn() {
         beforePropertyRead("dateColumn");
-        return dateColumn;
+        return this.dateColumn;
     }
 
     public void setDecimalColumn(BigDecimal decimalColumn) {
@@ -121,7 +121,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public BigDecimal getDecimalColumn() {
         beforePropertyRead("decimalColumn");
-        return decimalColumn;
+        return this.decimalColumn;
     }
 
     public void setDoubleColumn(Double doubleColumn) {
@@ -131,7 +131,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Double getDoubleColumn() {
         beforePropertyRead("doubleColumn");
-        return doubleColumn;
+        return this.doubleColumn;
     }
 
     public void setFloatColumn(Float floatColumn) {
@@ -141,7 +141,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Float getFloatColumn() {
         beforePropertyRead("floatColumn");
-        return floatColumn;
+        return this.floatColumn;
     }
 
     public void setIntegerColumn(Integer integerColumn) {
@@ -151,7 +151,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Integer getIntegerColumn() {
         beforePropertyRead("integerColumn");
-        return integerColumn;
+        return this.integerColumn;
     }
 
     public void setLongnvarcharColumn(String longnvarcharColumn) {
@@ -161,7 +161,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getLongnvarcharColumn() {
         beforePropertyRead("longnvarcharColumn");
-        return longnvarcharColumn;
+        return this.longnvarcharColumn;
     }
 
     public void setLongvarcharColumn(String longvarcharColumn) {
@@ -171,7 +171,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getLongvarcharColumn() {
         beforePropertyRead("longvarcharColumn");
-        return longvarcharColumn;
+        return this.longvarcharColumn;
     }
 
     public void setNcharColumn(String ncharColumn) {
@@ -181,7 +181,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getNcharColumn() {
         beforePropertyRead("ncharColumn");
-        return ncharColumn;
+        return this.ncharColumn;
     }
 
     public void setNumericColumn(BigDecimal numericColumn) {
@@ -191,7 +191,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public BigDecimal getNumericColumn() {
         beforePropertyRead("numericColumn");
-        return numericColumn;
+        return this.numericColumn;
     }
 
     public void setNvarcharColumn(String nvarcharColumn) {
@@ -201,7 +201,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getNvarcharColumn() {
         beforePropertyRead("nvarcharColumn");
-        return nvarcharColumn;
+        return this.nvarcharColumn;
     }
 
     public void setRealColumn(Float realColumn) {
@@ -211,7 +211,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Float getRealColumn() {
         beforePropertyRead("realColumn");
-        return realColumn;
+        return this.realColumn;
     }
 
     public void setSmallintColumn(Short smallintColumn) {
@@ -221,7 +221,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Short getSmallintColumn() {
         beforePropertyRead("smallintColumn");
-        return smallintColumn;
+        return this.smallintColumn;
     }
 
     public void setTimeColumn(Date timeColumn) {
@@ -231,7 +231,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Date getTimeColumn() {
         beforePropertyRead("timeColumn");
-        return timeColumn;
+        return this.timeColumn;
     }
 
     public void setTimestampColumn(Date timestampColumn) {
@@ -241,7 +241,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Date getTimestampColumn() {
         beforePropertyRead("timestampColumn");
-        return timestampColumn;
+        return this.timestampColumn;
     }
 
     public void setTinyintColumn(Byte tinyintColumn) {
@@ -251,7 +251,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public Byte getTinyintColumn() {
         beforePropertyRead("tinyintColumn");
-        return tinyintColumn;
+        return this.tinyintColumn;
     }
 
     public void setVarcharColumn(String varcharColumn) {
@@ -261,7 +261,7 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
 
     public String getVarcharColumn() {
         beforePropertyRead("varcharColumn");
-        return varcharColumn;
+        return this.varcharColumn;
     }
 
     @Override
@@ -399,51 +399,51 @@ public abstract class _ReturnTypesMap1 extends CayenneDataObject {
     @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);
+        out.writeObject(this.bigintColumn);
+        out.writeObject(this.bitColumn);
+        out.writeObject(this.booleanColumn);
+        out.writeObject(this.charColumn);
+        out.writeObject(this.dateColumn);
+        out.writeObject(this.decimalColumn);
+        out.writeObject(this.doubleColumn);
+        out.writeObject(this.floatColumn);
+        out.writeObject(this.integerColumn);
+        out.writeObject(this.longnvarcharColumn);
+        out.writeObject(this.longvarcharColumn);
+        out.writeObject(this.ncharColumn);
+        out.writeObject(this.numericColumn);
+        out.writeObject(this.nvarcharColumn);
+        out.writeObject(this.realColumn);
+        out.writeObject(this.smallintColumn);
+        out.writeObject(this.timeColumn);
+        out.writeObject(this.timestampColumn);
+        out.writeObject(this.tinyintColumn);
+        out.writeObject(this.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();
+        this.bigintColumn = (Long)in.readObject();
+        this.bitColumn = (Boolean)in.readObject();
+        this.booleanColumn = (Boolean)in.readObject();
+        this.charColumn = (String)in.readObject();
+        this.dateColumn = (Date)in.readObject();
+        this.decimalColumn = (BigDecimal)in.readObject();
+        this.doubleColumn = (Double)in.readObject();
+        this.floatColumn = (Float)in.readObject();
+        this.integerColumn = (Integer)in.readObject();
+        this.longnvarcharColumn = (String)in.readObject();
+        this.longvarcharColumn = (String)in.readObject();
+        this.ncharColumn = (String)in.readObject();
+        this.numericColumn = (BigDecimal)in.readObject();
+        this.nvarcharColumn = (String)in.readObject();
+        this.realColumn = (Float)in.readObject();
+        this.smallintColumn = (Short)in.readObject();
+        this.timeColumn = (Date)in.readObject();
+        this.timestampColumn = (Date)in.readObject();
+        this.tinyintColumn = (Byte)in.readObject();
+        this.varcharColumn = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 99d82d1..a039a48 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
@@ -37,7 +37,7 @@ public abstract class _ReturnTypesMap2 extends CayenneDataObject {
 
     public byte[] getBinaryColumn() {
         beforePropertyRead("binaryColumn");
-        return binaryColumn;
+        return this.binaryColumn;
     }
 
     public void setBlobColumn(byte[] blobColumn) {
@@ -47,7 +47,7 @@ public abstract class _ReturnTypesMap2 extends CayenneDataObject {
 
     public byte[] getBlobColumn() {
         beforePropertyRead("blobColumn");
-        return blobColumn;
+        return this.blobColumn;
     }
 
     public void setLongvarbinaryColumn(byte[] longvarbinaryColumn) {
@@ -57,7 +57,7 @@ public abstract class _ReturnTypesMap2 extends CayenneDataObject {
 
     public byte[] getLongvarbinaryColumn() {
         beforePropertyRead("longvarbinaryColumn");
-        return longvarbinaryColumn;
+        return this.longvarbinaryColumn;
     }
 
     public void setVarbinaryColumn(byte[] varbinaryColumn) {
@@ -67,7 +67,7 @@ public abstract class _ReturnTypesMap2 extends CayenneDataObject {
 
     public byte[] getVarbinaryColumn() {
         beforePropertyRead("varbinaryColumn");
-        return varbinaryColumn;
+        return this.varbinaryColumn;
     }
 
     @Override
@@ -125,19 +125,19 @@ public abstract class _ReturnTypesMap2 extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(binaryColumn);
-        out.writeObject(blobColumn);
-        out.writeObject(longvarbinaryColumn);
-        out.writeObject(varbinaryColumn);
+        out.writeObject(this.binaryColumn);
+        out.writeObject(this.blobColumn);
+        out.writeObject(this.longvarbinaryColumn);
+        out.writeObject(this.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();
+        this.binaryColumn = (byte[])in.readObject();
+        this.blobColumn = (byte[])in.readObject();
+        this.longvarbinaryColumn = (byte[])in.readObject();
+        this.varbinaryColumn = (byte[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/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 8bff54e..4d189f2 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
@@ -33,7 +33,7 @@ public abstract class _ReturnTypesMapLobs1 extends CayenneDataObject {
 
     public String getClobColumn() {
         beforePropertyRead("clobColumn");
-        return clobColumn;
+        return this.clobColumn;
     }
 
     public void setNclobColumn(String nclobColumn) {
@@ -43,7 +43,7 @@ public abstract class _ReturnTypesMapLobs1 extends CayenneDataObject {
 
     public String getNclobColumn() {
         beforePropertyRead("nclobColumn");
-        return nclobColumn;
+        return this.nclobColumn;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _ReturnTypesMapLobs1 extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(clobColumn);
-        out.writeObject(nclobColumn);
+        out.writeObject(this.clobColumn);
+        out.writeObject(this.nclobColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        clobColumn = (String)in.readObject();
-        nclobColumn = (String)in.readObject();
+        this.clobColumn = (String)in.readObject();
+        this.nclobColumn = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
index fd8c22a..ee87549 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
@@ -33,7 +33,7 @@ public abstract class _SoftDelete extends BaseDataObject {
 
     public Boolean getDeleted() {
         beforePropertyRead("deleted");
-        return deleted;
+        return this.deleted;
     }
 
     public void setName(String name) {
@@ -43,10 +43,10 @@ public abstract class _SoftDelete extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
-protected abstract void onPrePersist();
+    protected abstract void onPrePersist();
 
     @Override
     public Object readPropertyDirectly(String propName) {
@@ -93,15 +93,15 @@ protected abstract void onPrePersist();
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(deleted);
-        out.writeObject(name);
+        out.writeObject(this.deleted);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        deleted = (Boolean)in.readObject();
-        name = (String)in.readObject();
+        this.deleted = (Boolean)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
index 50fcda0..947ed87 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
@@ -33,7 +33,7 @@ public abstract class _TablePrimitives extends BaseDataObject {
 
 	public boolean isBooleanColumn() {
         beforePropertyRead("booleanColumn");
-        return booleanColumn;
+        return this.booleanColumn;
     }
 
     public void setIntColumn(int intColumn) {
@@ -43,7 +43,7 @@ public abstract class _TablePrimitives extends BaseDataObject {
 
     public int getIntColumn() {
         beforePropertyRead("intColumn");
-        return intColumn;
+        return this.intColumn;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _TablePrimitives extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeBoolean(booleanColumn);
-        out.writeInt(intColumn);
+        out.writeBoolean(this.booleanColumn);
+        out.writeInt(this.intColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        booleanColumn = in.readBoolean();
-        intColumn = in.readInt();
+        this.booleanColumn = in.readBoolean();
+        this.intColumn = in.readInt();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
index 479af42..bd43dfb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
@@ -47,19 +47,19 @@ public abstract class _ArtistCallback extends BaseDataObject {
         return this.dateOfBirth;
     }
 
-protected abstract void prePersistEntityObjEntity();
+    protected abstract void prePersistEntityObjEntity();
 
-protected abstract void preRemoveEntityObjEntity();
+    protected abstract void preRemoveEntityObjEntity();
 
-protected abstract void preUpdateEntityObjEntity();
+    protected abstract void preUpdateEntityObjEntity();
 
-protected abstract void postPersistEntityObjEntity();
+    protected abstract void postPersistEntityObjEntity();
 
-protected abstract void postRemoveEntityObjEntity();
+    protected abstract void postRemoveEntityObjEntity();
 
-protected abstract void postUpdateEntityObjEntity();
+    protected abstract void postUpdateEntityObjEntity();
 
-protected abstract void postLoadEntityObjEntity();
+    protected abstract void postLoadEntityObjEntity();
 
     @Override
     public Object readPropertyDirectly(String propName) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
index de58c44..1620b69 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Bag.java
@@ -41,7 +41,7 @@ public abstract class _Bag extends CayenneDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @SuppressWarnings("unchecked")
@@ -122,19 +122,19 @@ public abstract class _Bag extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(balls);
-        out.writeObject(boxes);
-        out.writeObject(things);
+        out.writeObject(this.name);
+        out.writeObject(this.balls);
+        out.writeObject(this.boxes);
+        out.writeObject(this.things);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        balls = in.readObject();
-        boxes = in.readObject();
-        things = in.readObject();
+        this.name = (String)in.readObject();
+        this.balls = in.readObject();
+        this.boxes = in.readObject();
+        this.things = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
index cffdcc9..4114014 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Ball.java
@@ -39,7 +39,7 @@ public abstract class _Ball extends CayenneDataObject {
 
     public Integer getThingVolume() {
         beforePropertyRead("thingVolume");
-        return thingVolume;
+        return this.thingVolume;
     }
 
     public void setThingWeight(Integer thingWeight) {
@@ -49,7 +49,7 @@ public abstract class _Ball extends CayenneDataObject {
 
     public Integer getThingWeight() {
         beforePropertyRead("thingWeight");
-        return thingWeight;
+        return this.thingWeight;
     }
 
     public void setBox(Box box) {
@@ -123,19 +123,19 @@ public abstract class _Ball extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(thingVolume);
-        out.writeObject(thingWeight);
-        out.writeObject(box);
-        out.writeObject(thing);
+        out.writeObject(this.thingVolume);
+        out.writeObject(this.thingWeight);
+        out.writeObject(this.box);
+        out.writeObject(this.thing);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        thingVolume = (Integer)in.readObject();
-        thingWeight = (Integer)in.readObject();
-        box = in.readObject();
-        thing = in.readObject();
+        this.thingVolume = (Integer)in.readObject();
+        this.thingWeight = (Integer)in.readObject();
+        this.box = in.readObject();
+        this.thing = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
index 9a9b09e..af9be5c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Box.java
@@ -44,7 +44,7 @@ public abstract class _Box extends CayenneDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setBag(Bag bag) {
@@ -141,21 +141,21 @@ public abstract class _Box extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(bag);
-        out.writeObject(balls);
-        out.writeObject(boxInfo);
-        out.writeObject(things);
+        out.writeObject(this.name);
+        out.writeObject(this.bag);
+        out.writeObject(this.balls);
+        out.writeObject(this.boxInfo);
+        out.writeObject(this.things);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        bag = in.readObject();
-        balls = in.readObject();
-        boxInfo = in.readObject();
-        things = in.readObject();
+        this.name = (String)in.readObject();
+        this.bag = in.readObject();
+        this.balls = in.readObject();
+        this.boxInfo = in.readObject();
+        this.things = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
index 2a23b29..b96394c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_BoxInfo.java
@@ -34,7 +34,7 @@ public abstract class _BoxInfo extends CayenneDataObject {
 
     public String getColor() {
         beforePropertyRead("color");
-        return color;
+        return this.color;
     }
 
     public void setBox(Box box) {
@@ -90,15 +90,15 @@ public abstract class _BoxInfo extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(color);
-        out.writeObject(box);
+        out.writeObject(this.color);
+        out.writeObject(this.box);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        color = (String)in.readObject();
-        box = in.readObject();
+        this.color = (String)in.readObject();
+        this.box = in.readObject();
     }
 
 }


[08/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
index 821a5f3..8a5e586 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.deleterules.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.deleterules.DeleteRule;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.deleterules.DeleteRule;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteCascade extends CayenneDataObject {
+public abstract class _DeleteCascade extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _DeleteCascade extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<DeleteRule> CASCADE = Property.create("cascade", DeleteRule.class);
 
+    protected String name;
+
+    protected Object cascade;
+
     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 setCascade(DeleteRule cascade) {
@@ -34,5 +45,60 @@ public abstract class _DeleteCascade extends CayenneDataObject {
         return (DeleteRule)readProperty("cascade");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "cascade":
+                return this.cascade;
+            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 "cascade":
+                this.cascade = 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(cascade);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        cascade = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
index 16c2005..20a733e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.deleterules.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.deleterules.DeleteRule;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.deleterules.DeleteRule;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteDeny extends CayenneDataObject {
+public abstract class _DeleteDeny extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _DeleteDeny extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<DeleteRule> DENY = Property.create("deny", DeleteRule.class);
 
+    protected String name;
+
+    protected Object deny;
+
     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 setDeny(DeleteRule deny) {
@@ -34,5 +45,60 @@ public abstract class _DeleteDeny extends CayenneDataObject {
         return (DeleteRule)readProperty("deny");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "deny":
+                return this.deny;
+            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 "deny":
+                this.deny = 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(deny);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        deny = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
index 28f9bef..8695107 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.deleterules.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.deleterules.DeleteRule;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.deleterules.DeleteRule;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteNullify extends CayenneDataObject {
+public abstract class _DeleteNullify extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _DeleteNullify extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<DeleteRule> NULLIFY = Property.create("nullify", DeleteRule.class);
 
+    protected String name;
+
+    protected Object nullify;
+
     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 setNullify(DeleteRule nullify) {
@@ -34,5 +45,60 @@ public abstract class _DeleteNullify extends CayenneDataObject {
         return (DeleteRule)readProperty("nullify");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "nullify":
+                return this.nullify;
+            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 "nullify":
+                this.nullify = 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(nullify);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        nullify = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
index 2f609ea..9ede774 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.deleterules.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.deleterules.DeleteCascade;
 import org.apache.cayenne.testdo.deleterules.DeleteDeny;
@@ -14,7 +17,7 @@ import org.apache.cayenne.testdo.deleterules.DeleteNullify;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DeleteRule extends CayenneDataObject {
+public abstract class _DeleteRule extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -25,47 +28,129 @@ public abstract class _DeleteRule extends CayenneDataObject {
     public static final Property<List<DeleteDeny>> FROM_DENY = Property.create("fromDeny", List.class);
     public static final Property<List<DeleteNullify>> FROM_NULLIFY = Property.create("fromNullify", List.class);
 
+    protected String name;
+
+    protected Object fromCascade;
+    protected Object fromDeny;
+    protected Object fromNullify;
+
     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 addToFromCascade(DeleteCascade obj) {
         addToManyTarget("fromCascade", obj, true);
     }
+
     public void removeFromFromCascade(DeleteCascade obj) {
         removeToManyTarget("fromCascade", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteCascade> getFromCascade() {
         return (List<DeleteCascade>)readProperty("fromCascade");
     }
 
-
     public void addToFromDeny(DeleteDeny obj) {
         addToManyTarget("fromDeny", obj, true);
     }
+
     public void removeFromFromDeny(DeleteDeny obj) {
         removeToManyTarget("fromDeny", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteDeny> getFromDeny() {
         return (List<DeleteDeny>)readProperty("fromDeny");
     }
 
-
     public void addToFromNullify(DeleteNullify obj) {
         addToManyTarget("fromNullify", obj, true);
     }
+
     public void removeFromFromNullify(DeleteNullify obj) {
         removeToManyTarget("fromNullify", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<DeleteNullify> getFromNullify() {
         return (List<DeleteNullify>)readProperty("fromNullify");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "fromCascade":
+                return this.fromCascade;
+            case "fromDeny":
+                return this.fromDeny;
+            case "fromNullify":
+                return this.fromNullify;
+            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 "fromCascade":
+                this.fromCascade = val;
+                break;
+            case "fromDeny":
+                this.fromDeny = val;
+                break;
+            case "fromNullify":
+                this.fromNullify = 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(fromCascade);
+        out.writeObject(fromDeny);
+        out.writeObject(fromNullify);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        fromCascade = in.readObject();
+        fromDeny = in.readObject();
+        fromNullify = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
index de2fa33..272c4f0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.embeddable.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.embeddable.Embeddable1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.embeddable.Embeddable1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _EmbedEntity1 extends CayenneDataObject {
+public abstract class _EmbedEntity1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,25 +24,102 @@ public abstract class _EmbedEntity1 extends CayenneDataObject {
     public static final Property<Embeddable1> EMBEDDED2 = Property.create("embedded2", Embeddable1.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected Embeddable1 embedded1;
+    protected Embeddable1 embedded2;
+    protected String name;
+
+
     public void setEmbedded1(Embeddable1 embedded1) {
-        writeProperty("embedded1", embedded1);
+        beforePropertyWrite("embedded1", this.embedded1, embedded1);
+        this.embedded1 = embedded1;
     }
+
     public Embeddable1 getEmbedded1() {
-        return (Embeddable1)readProperty("embedded1");
+        beforePropertyRead("embedded1");
+        return embedded1;
     }
 
     public void setEmbedded2(Embeddable1 embedded2) {
-        writeProperty("embedded2", embedded2);
+        beforePropertyWrite("embedded2", this.embedded2, embedded2);
+        this.embedded2 = embedded2;
     }
+
     public Embeddable1 getEmbedded2() {
-        return (Embeddable1)readProperty("embedded2");
+        beforePropertyRead("embedded2");
+        return embedded2;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "embedded1":
+                return this.embedded1;
+            case "embedded2":
+                return this.embedded2;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "embedded1":
+                this.embedded1 = (Embeddable1)val;
+                break;
+            case "embedded2":
+                this.embedded2 = (Embeddable1)val;
+                break;
+            case "name":
+                this.name = (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(embedded1);
+        out.writeObject(embedded2);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        embedded1 = (Embeddable1)in.readObject();
+        embedded2 = (Embeddable1)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
index 046cf67..7b99a25 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.enum_test.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.enum_test.Enum1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.enum_test.Enum1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _EnumEntity extends CayenneDataObject {
+public abstract class _EnumEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,11 +22,66 @@ public abstract class _EnumEntity extends CayenneDataObject {
 
     public static final Property<Enum1> ENUM_ATTRIBUTE = Property.create("enumAttribute", Enum1.class);
 
+    protected Enum1 enumAttribute;
+
+
     public void setEnumAttribute(Enum1 enumAttribute) {
-        writeProperty("enumAttribute", enumAttribute);
+        beforePropertyWrite("enumAttribute", this.enumAttribute, enumAttribute);
+        this.enumAttribute = enumAttribute;
     }
+
     public Enum1 getEnumAttribute() {
-        return (Enum1)readProperty("enumAttribute");
+        beforePropertyRead("enumAttribute");
+        return enumAttribute;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "enumAttribute":
+                return this.enumAttribute;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "enumAttribute":
+                this.enumAttribute = (Enum1)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(enumAttribute);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        enumAttribute = (Enum1)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
index bb74881..9f12732 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.extended_type.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.extended_type.StringET1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.extended_type.StringET1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ExtendedTypeEntity extends CayenneDataObject {
+public abstract class _ExtendedTypeEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,11 +22,66 @@ public abstract class _ExtendedTypeEntity extends CayenneDataObject {
 
     public static final Property<StringET1> NAME = Property.create("name", StringET1.class);
 
+    protected StringET1 name;
+
+
     public void setName(StringET1 name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public StringET1 getName() {
-        return (StringET1)readProperty("name");
+        beforePropertyRead("name");
+        return name;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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 = (StringET1)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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (StringET1)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
index 1077a88..9eaad43 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.generated.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.generated.GeneratedColumnCompMaster;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.generated.GeneratedColumnCompMaster;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GeneratedColumnCompKey extends CayenneDataObject {
+public abstract class _GeneratedColumnCompKey extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,11 +25,18 @@ public abstract class _GeneratedColumnCompKey extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<GeneratedColumnCompMaster> TO_MASTER = Property.create("toMaster", GeneratedColumnCompMaster.class);
 
+    protected String name;
+
+    protected Object toMaster;
+
     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 setToMaster(GeneratedColumnCompMaster toMaster) {
@@ -36,5 +47,60 @@ public abstract class _GeneratedColumnCompKey extends CayenneDataObject {
         return (GeneratedColumnCompMaster)readProperty("toMaster");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toMaster":
+                return this.toMaster;
+            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 "toMaster":
+                this.toMaster = 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(toMaster);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toMaster = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
index 053b972..f0bb5c8 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.generated.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.generated.GeneratedColumnCompKey;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.generated.GeneratedColumnCompKey;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GeneratedColumnCompMaster extends CayenneDataObject {
+public abstract class _GeneratedColumnCompMaster extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _GeneratedColumnCompMaster extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<GeneratedColumnCompKey>> TO_DETAIL = Property.create("toDetail", List.class);
 
+    protected String name;
+
+    protected Object toDetail;
+
     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 addToToDetail(GeneratedColumnCompKey obj) {
         addToManyTarget("toDetail", obj, true);
     }
+
     public void removeFromToDetail(GeneratedColumnCompKey obj) {
         removeToManyTarget("toDetail", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<GeneratedColumnCompKey> getToDetail() {
         return (List<GeneratedColumnCompKey>)readProperty("toDetail");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toDetail":
+                return this.toDetail;
+            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 "toDetail":
+                this.toDetail = 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(toDetail);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toDetail = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
index e3693bf..fb8b70d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.generated.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.generated.GeneratedColumnTestEntity;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.generated.GeneratedColumnTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GeneratedColumnDep extends CayenneDataObject {
+public abstract class _GeneratedColumnDep extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _GeneratedColumnDep extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<GeneratedColumnTestEntity> TO_MASTER = Property.create("toMaster", GeneratedColumnTestEntity.class);
 
+    protected String name;
+
+    protected Object toMaster;
+
     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 setToMaster(GeneratedColumnTestEntity toMaster) {
@@ -34,5 +45,60 @@ public abstract class _GeneratedColumnDep extends CayenneDataObject {
         return (GeneratedColumnTestEntity)readProperty("toMaster");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toMaster":
+                return this.toMaster;
+            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 "toMaster":
+                this.toMaster = 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(toMaster);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toMaster = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
index f0cd340..10b1a1a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.generated.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GeneratedColumnTest2 extends CayenneDataObject {
+public abstract class _GeneratedColumnTest2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _GeneratedColumnTest2 extends CayenneDataObject {
 
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String name;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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;
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
index de284e1..7888c4c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.generated.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.generated.GeneratedColumnDep;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.generated.GeneratedColumnDep;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GeneratedColumnTestEntity extends CayenneDataObject {
+public abstract class _GeneratedColumnTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _GeneratedColumnTestEntity extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<GeneratedColumnDep> TO_DEP = Property.create("toDep", GeneratedColumnDep.class);
 
+    protected String name;
+
+    protected Object toDep;
+
     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 setToDep(GeneratedColumnDep toDep) {
@@ -34,5 +45,60 @@ public abstract class _GeneratedColumnTestEntity extends CayenneDataObject {
         return (GeneratedColumnDep)readProperty("toDep");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toDep":
+                return this.toDep;
+            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 "toDep":
+                this.toDep = 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(toDep);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toDep = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
index 8d41cef..1a80442 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.generated.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.CayenneDataObject;
@@ -20,16 +23,69 @@ public abstract class _GeneratedF1 extends CayenneDataObject {
 
     public static final Property<List<GeneratedF2>> F2 = Property.create("f2", List.class);
 
+
+    protected Object f2;
+
     public void addToF2(GeneratedF2 obj) {
         addToManyTarget("f2", obj, true);
     }
+
     public void removeFromF2(GeneratedF2 obj) {
         removeToManyTarget("f2", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<GeneratedF2> getF2() {
         return (List<GeneratedF2>)readProperty("f2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "f2":
+                return this.f2;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "f2":
+                this.f2 = 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(f2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        f2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
index d0ae8cb..0b33d82 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.generated.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.CayenneDataObject;
@@ -20,16 +23,69 @@ public abstract class _GeneratedF2 extends CayenneDataObject {
 
     public static final Property<List<GeneratedF1>> F1 = Property.create("f1", List.class);
 
+
+    protected Object f1;
+
     public void addToF1(GeneratedF1 obj) {
         addToManyTarget("f1", obj, true);
     }
+
     public void removeFromF1(GeneratedF1 obj) {
         removeToManyTarget("f1", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<GeneratedF1> getF1() {
         return (List<GeneratedF1>)readProperty("f1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "f1":
+                return this.f1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "f1":
+                this.f1 = 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(f1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        f1 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
index 009b321..3bbedab 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance.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.inheritance.DirectToSubEntity;
 import org.apache.cayenne.testdo.inheritance.RelatedEntity;
@@ -11,7 +15,7 @@ import org.apache.cayenne.testdo.inheritance.RelatedEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BaseEntity extends CayenneDataObject {
+public abstract class _BaseEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,11 +25,19 @@ public abstract class _BaseEntity extends CayenneDataObject {
     public static final Property<DirectToSubEntity> TO_DIRECT_TO_SUB_ENTITY = Property.create("toDirectToSubEntity", DirectToSubEntity.class);
     public static final Property<RelatedEntity> TO_RELATED_ENTITY = Property.create("toRelatedEntity", RelatedEntity.class);
 
+    protected String entityType;
+
+    protected Object toDirectToSubEntity;
+    protected Object toRelatedEntity;
+
     public void setEntityType(String entityType) {
-        writeProperty("entityType", entityType);
+        beforePropertyWrite("entityType", this.entityType, entityType);
+        this.entityType = entityType;
     }
+
     public String getEntityType() {
-        return (String)readProperty("entityType");
+        beforePropertyRead("entityType");
+        return entityType;
     }
 
     public void setToDirectToSubEntity(DirectToSubEntity toDirectToSubEntity) {
@@ -36,7 +48,6 @@ public abstract class _BaseEntity extends CayenneDataObject {
         return (DirectToSubEntity)readProperty("toDirectToSubEntity");
     }
 
-
     public void setToRelatedEntity(RelatedEntity toRelatedEntity) {
         setToOneTarget("toRelatedEntity", toRelatedEntity, true);
     }
@@ -45,5 +56,67 @@ public abstract class _BaseEntity extends CayenneDataObject {
         return (RelatedEntity)readProperty("toRelatedEntity");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "entityType":
+                return this.entityType;
+            case "toDirectToSubEntity":
+                return this.toDirectToSubEntity;
+            case "toRelatedEntity":
+                return this.toRelatedEntity;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "entityType":
+                this.entityType = (String)val;
+                break;
+            case "toDirectToSubEntity":
+                this.toDirectToSubEntity = val;
+                break;
+            case "toRelatedEntity":
+                this.toRelatedEntity = 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(entityType);
+        out.writeObject(toDirectToSubEntity);
+        out.writeObject(toRelatedEntity);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        entityType = (String)in.readObject();
+        toDirectToSubEntity = in.readObject();
+        toRelatedEntity = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
index e841796..999e686 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance.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.inheritance.SubEntity;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.inheritance.SubEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DirectToSubEntity extends CayenneDataObject {
+public abstract class _DirectToSubEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _DirectToSubEntity extends CayenneDataObject {
 
     public static final Property<List<SubEntity>> SUB_ENTITIES = Property.create("subEntities", List.class);
 
+
+    protected Object subEntities;
+
     public void addToSubEntities(SubEntity obj) {
         addToManyTarget("subEntities", obj, true);
     }
+
     public void removeFromSubEntities(SubEntity obj) {
         removeToManyTarget("subEntities", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<SubEntity> getSubEntities() {
         return (List<SubEntity>)readProperty("subEntities");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "subEntities":
+                return this.subEntities;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "subEntities":
+                this.subEntities = 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(subEntities);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        subEntities = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
index 6a2a911..47f0dea 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance.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.inheritance.BaseEntity;
 import org.apache.cayenne.testdo.inheritance.SubEntity;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.inheritance.SubEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _RelatedEntity extends CayenneDataObject {
+public abstract class _RelatedEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,28 +25,90 @@ public abstract class _RelatedEntity extends CayenneDataObject {
     public static final Property<List<BaseEntity>> BASE_ENTITIES = Property.create("baseEntities", List.class);
     public static final Property<List<SubEntity>> SUB_ENTITIES = Property.create("subEntities", List.class);
 
+
+    protected Object baseEntities;
+    protected Object subEntities;
+
     public void addToBaseEntities(BaseEntity obj) {
         addToManyTarget("baseEntities", obj, true);
     }
+
     public void removeFromBaseEntities(BaseEntity obj) {
         removeToManyTarget("baseEntities", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<BaseEntity> getBaseEntities() {
         return (List<BaseEntity>)readProperty("baseEntities");
     }
 
-
     public void addToSubEntities(SubEntity obj) {
         addToManyTarget("subEntities", obj, true);
     }
+
     public void removeFromSubEntities(SubEntity obj) {
         removeToManyTarget("subEntities", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<SubEntity> getSubEntities() {
         return (List<SubEntity>)readProperty("subEntities");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "baseEntities":
+                return this.baseEntities;
+            case "subEntities":
+                return this.subEntities;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "baseEntities":
+                this.baseEntities = val;
+                break;
+            case "subEntities":
+                this.subEntities = 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(baseEntities);
+        out.writeObject(subEntities);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        baseEntities = in.readObject();
+        subEntities = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_SubEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_SubEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_SubEntity.java
index 29ec798..a8b0e61 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_SubEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_SubEntity.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.testdo.inheritance.BaseEntity;
 
 /**
@@ -15,4 +19,48 @@ public abstract class _SubEntity extends BaseEntity {
     public static final String BASE_ENTITY_ID_PK_COLUMN = "BASE_ENTITY_ID";
 
 
+
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
index 4a23081..61a2296 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.inheritance_flat.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.List;
 
 import org.apache.cayenne.exp.Property;
@@ -22,18 +25,23 @@ public abstract class _Group extends User {
     public static final Property<List<Role>> GROUP_MEMBERS = Property.create("groupMembers", List.class);
     public static final Property<GroupProperties> GROUP_PROPERTIES = Property.create("groupProperties", GroupProperties.class);
 
+
+    protected Object groupMembers;
+    protected Object groupProperties;
+
     public void addToGroupMembers(Role obj) {
         addToManyTarget("groupMembers", obj, true);
     }
+
     public void removeFromGroupMembers(Role obj) {
         removeToManyTarget("groupMembers", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Role> getGroupMembers() {
         return (List<Role>)readProperty("groupMembers");
     }
 
-
     public void setGroupProperties(GroupProperties groupProperties) {
         setToOneTarget("groupProperties", groupProperties, true);
     }
@@ -42,5 +50,60 @@ public abstract class _Group extends User {
         return (GroupProperties)readProperty("groupProperties");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "groupMembers":
+                return this.groupMembers;
+            case "groupProperties":
+                return this.groupProperties;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "groupMembers":
+                this.groupMembers = val;
+                break;
+            case "groupProperties":
+                this.groupProperties = 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(groupMembers);
+        out.writeObject(groupProperties);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        groupMembers = in.readObject();
+        groupProperties = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
index 5e4a5e6..8542516 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_flat.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.inheritance_flat.Group;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.inheritance_flat.Group;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _GroupProperties extends CayenneDataObject {
+public abstract class _GroupProperties extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _GroupProperties extends CayenneDataObject {
     public static final Property<Long> ID = Property.create("id", Long.class);
     public static final Property<Group> GROUP = Property.create("group", Group.class);
 
+    protected String description;
+    protected Long id;
+
+    protected Object group;
+
     public void setDescription(String description) {
-        writeProperty("description", description);
+        beforePropertyWrite("description", this.description, description);
+        this.description = description;
     }
+
     public String getDescription() {
-        return (String)readProperty("description");
+        beforePropertyRead("description");
+        return description;
     }
 
     public void setId(Long id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public Long getId() {
-        return (Long)readProperty("id");
+        beforePropertyRead("id");
+        return id;
     }
 
     public void setGroup(Group group) {
@@ -42,5 +57,67 @@ public abstract class _GroupProperties extends CayenneDataObject {
         return (Group)readProperty("group");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "description":
+                return this.description;
+            case "id":
+                return this.id;
+            case "group":
+                return this.group;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "description":
+                this.description = (String)val;
+                break;
+            case "id":
+                this.id = (Long)val;
+                break;
+            case "group":
+                this.group = 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(description);
+        out.writeObject(id);
+        out.writeObject(group);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        description = (String)in.readObject();
+        id = (Long)in.readObject();
+        group = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
index a9e98d8..772d63c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.inheritance_flat.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.inheritance_flat.Group;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.inheritance_flat.Group;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Role extends CayenneDataObject {
+public abstract class _Role extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,43 +26,127 @@ public abstract class _Role extends CayenneDataObject {
     public static final Property<Integer> TYPE = Property.create("type", Integer.class);
     public static final Property<List<Group>> ROLE_GROUPS = Property.create("roleGroups", List.class);
 
+    protected long id;
+    protected String name;
+    protected int type;
+
+    protected Object roleGroups;
+
     public void setId(long id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public long getId() {
-        Object value = readProperty("id");
-        return (value != null) ? (Long) value : 0;
+        beforePropertyRead("id");
+        return id;
     }
 
     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 setType(int type) {
-        writeProperty("type", type);
+        beforePropertyWrite("type", this.type, type);
+        this.type = type;
     }
+
     public int getType() {
-        Object value = readProperty("type");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("type");
+        return type;
     }
 
     public void addToRoleGroups(Group obj) {
         addToManyTarget("roleGroups", obj, true);
     }
+
     public void removeFromRoleGroups(Group obj) {
         removeToManyTarget("roleGroups", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Group> getRoleGroups() {
         return (List<Group>)readProperty("roleGroups");
     }
 
+protected abstract void onPostPersist();
+
+protected abstract void onPostUpdate();
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "id":
+                return this.id;
+            case "name":
+                return this.name;
+            case "type":
+                return this.type;
+            case "roleGroups":
+                return this.roleGroups;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "id":
+                this.id = (Long)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "type":
+                this.type = (Integer)val;
+                break;
+            case "roleGroups":
+                this.roleGroups = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
 
-    protected abstract void onPostPersist();
+    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        readSerialized(in);
+    }
 
-    protected abstract void onPostUpdate();
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
+        out.writeLong(id);
+        out.writeObject(name);
+        out.writeInt(type);
+        out.writeObject(roleGroups);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        id = in.readLong();
+        name = (String)in.readObject();
+        type = in.readInt();
+        roleGroups = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
index 90509cb..6a0b8d2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_flat.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_flat.Role;
 import org.apache.cayenne.testdo.inheritance_flat.UserProperties;
@@ -18,6 +22,9 @@ public abstract class _User extends Role {
 
     public static final Property<UserProperties> USER_PROPERTIES = Property.create("userProperties", UserProperties.class);
 
+
+    protected Object userProperties;
+
     public void setUserProperties(UserProperties userProperties) {
         setToOneTarget("userProperties", userProperties, true);
     }
@@ -26,5 +33,53 @@ public abstract class _User extends Role {
         return (UserProperties)readProperty("userProperties");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "userProperties":
+                return this.userProperties;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "userProperties":
+                this.userProperties = 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(userProperties);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        userProperties = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
index 983ff46..61777ba 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.inheritance_flat.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.inheritance_flat.User;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.inheritance_flat.User;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _UserProperties extends CayenneDataObject {
+public abstract class _UserProperties extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _UserProperties extends CayenneDataObject {
     public static final Property<String> NICKNAME = Property.create("nickname", String.class);
     public static final Property<User> USER = Property.create("user", User.class);
 
+    protected Long id;
+    protected String nickname;
+
+    protected Object user;
+
     public void setId(Long id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public Long getId() {
-        return (Long)readProperty("id");
+        beforePropertyRead("id");
+        return id;
     }
 
     public void setNickname(String nickname) {
-        writeProperty("nickname", nickname);
+        beforePropertyWrite("nickname", this.nickname, nickname);
+        this.nickname = nickname;
     }
+
     public String getNickname() {
-        return (String)readProperty("nickname");
+        beforePropertyRead("nickname");
+        return nickname;
     }
 
     public void setUser(User user) {
@@ -42,5 +57,67 @@ public abstract class _UserProperties extends CayenneDataObject {
         return (User)readProperty("user");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "id":
+                return this.id;
+            case "nickname":
+                return this.nickname;
+            case "user":
+                return this.user;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "id":
+                this.id = (Long)val;
+                break;
+            case "nickname":
+                this.nickname = (String)val;
+                break;
+            case "user":
+                this.user = 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(id);
+        out.writeObject(nickname);
+        out.writeObject(user);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        id = (Long)in.readObject();
+        nickname = (String)in.readObject();
+        user = in.readObject();
+    }
 
 }


[02/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
index b2ce235..fd8c22a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/soft_delete/auto/_SoftDelete.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.soft_delete.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SoftDelete extends CayenneDataObject {
+public abstract class _SoftDelete extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,20 +22,86 @@ public abstract class _SoftDelete extends CayenneDataObject {
     public static final Property<Boolean> DELETED = Property.create("deleted", Boolean.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected Boolean deleted;
+    protected String name;
+
+
     public void setDeleted(Boolean deleted) {
-        writeProperty("deleted", deleted);
+        beforePropertyWrite("deleted", this.deleted, deleted);
+        this.deleted = deleted;
     }
+
     public Boolean getDeleted() {
-        return (Boolean)readProperty("deleted");
+        beforePropertyRead("deleted");
+        return deleted;
     }
 
     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;
     }
 
-    protected abstract void onPrePersist();
+protected abstract void onPrePersist();
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "deleted":
+                return this.deleted;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "deleted":
+                this.deleted = (Boolean)val;
+                break;
+            case "name":
+                this.name = (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(deleted);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        deleted = (Boolean)in.readObject();
+        name = (String)in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
index 2f660af..50fcda0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/table_primitives/auto/_TablePrimitives.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.table_primitives.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _TablePrimitives extends CayenneDataObject {
+public abstract class _TablePrimitives extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,20 +22,84 @@ public abstract class _TablePrimitives extends CayenneDataObject {
     public static final Property<Boolean> BOOLEAN_COLUMN = Property.create("booleanColumn", Boolean.class);
     public static final Property<Integer> INT_COLUMN = Property.create("intColumn", Integer.class);
 
+    protected boolean booleanColumn;
+    protected int intColumn;
+
+
     public void setBooleanColumn(boolean booleanColumn) {
-        writeProperty("booleanColumn", booleanColumn);
+        beforePropertyWrite("booleanColumn", this.booleanColumn, booleanColumn);
+        this.booleanColumn = booleanColumn;
     }
+
 	public boolean isBooleanColumn() {
-        Boolean value = (Boolean)readProperty("booleanColumn");
-        return (value != null) ? value.booleanValue() : false;
+        beforePropertyRead("booleanColumn");
+        return booleanColumn;
     }
 
     public void setIntColumn(int intColumn) {
-        writeProperty("intColumn", intColumn);
+        beforePropertyWrite("intColumn", this.intColumn, intColumn);
+        this.intColumn = intColumn;
     }
+
     public int getIntColumn() {
-        Object value = readProperty("intColumn");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("intColumn");
+        return intColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "booleanColumn":
+                return this.booleanColumn;
+            case "intColumn":
+                return this.intColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "booleanColumn":
+                this.booleanColumn = val == null ? false : (Boolean)val;
+                break;
+            case "intColumn":
+                this.intColumn = val == null ? 0 : (Integer)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.writeBoolean(booleanColumn);
+        out.writeInt(intColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        booleanColumn = in.readBoolean();
+        intColumn = in.readInt();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
index bcd5a10..7d5ab3a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.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.testmap.ArtGroup;
 import org.apache.cayenne.testdo.testmap.Artist;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.testmap.Artist;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ArtGroup extends CayenneDataObject {
+public abstract class _ArtGroup extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -24,37 +27,48 @@ public abstract class _ArtGroup extends CayenneDataObject {
     public static final Property<List<ArtGroup>> CHILD_GROUPS_ARRAY = Property.create("childGroupsArray", List.class);
     public static final Property<ArtGroup> TO_PARENT_GROUP = Property.create("toParentGroup", ArtGroup.class);
 
+    protected String name;
+
+    protected Object artistArray;
+    protected Object childGroupsArray;
+    protected Object toParentGroup;
+
     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 addToArtistArray(Artist obj) {
         addToManyTarget("artistArray", obj, true);
     }
+
     public void removeFromArtistArray(Artist obj) {
         removeToManyTarget("artistArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Artist> getArtistArray() {
         return (List<Artist>)readProperty("artistArray");
     }
 
-
     public void addToChildGroupsArray(ArtGroup obj) {
         addToManyTarget("childGroupsArray", obj, true);
     }
+
     public void removeFromChildGroupsArray(ArtGroup obj) {
         removeToManyTarget("childGroupsArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ArtGroup> getChildGroupsArray() {
         return (List<ArtGroup>)readProperty("childGroupsArray");
     }
 
-
     public void setToParentGroup(ArtGroup toParentGroup) {
         setToOneTarget("toParentGroup", toParentGroup, true);
     }
@@ -63,5 +77,74 @@ public abstract class _ArtGroup extends CayenneDataObject {
         return (ArtGroup)readProperty("toParentGroup");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "artistArray":
+                return this.artistArray;
+            case "childGroupsArray":
+                return this.childGroupsArray;
+            case "toParentGroup":
+                return this.toParentGroup;
+            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 "artistArray":
+                this.artistArray = val;
+                break;
+            case "childGroupsArray":
+                this.childGroupsArray = val;
+                break;
+            case "toParentGroup":
+                this.toParentGroup = 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(artistArray);
+        out.writeObject(childGroupsArray);
+        out.writeObject(toParentGroup);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        artistArray = in.readObject();
+        childGroupsArray = in.readObject();
+        toParentGroup = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
index 854e6fd..e14eaf5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
@@ -1,9 +1,12 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Date;
 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.testmap.ArtGroup;
 import org.apache.cayenne.testdo.testmap.ArtistExhibit;
@@ -15,7 +18,7 @@ import org.apache.cayenne.testdo.testmap.Painting;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Artist extends CayenneDataObject {
+public abstract class _Artist extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -27,54 +30,147 @@ public abstract class _Artist extends CayenneDataObject {
     public static final Property<List<ArtGroup>> GROUP_ARRAY = Property.create("groupArray", List.class);
     public static final Property<List<Painting>> PAINTING_ARRAY = Property.create("paintingArray", List.class);
 
+    protected String artistName;
+    protected Date dateOfBirth;
+
+    protected Object artistExhibitArray;
+    protected Object groupArray;
+    protected Object paintingArray;
+
     public void setArtistName(String artistName) {
-        writeProperty("artistName", artistName);
+        beforePropertyWrite("artistName", this.artistName, artistName);
+        this.artistName = artistName;
     }
+
     public String getArtistName() {
-        return (String)readProperty("artistName");
+        beforePropertyRead("artistName");
+        return artistName;
     }
 
     public void setDateOfBirth(Date dateOfBirth) {
-        writeProperty("dateOfBirth", dateOfBirth);
+        beforePropertyWrite("dateOfBirth", this.dateOfBirth, dateOfBirth);
+        this.dateOfBirth = dateOfBirth;
     }
+
     public Date getDateOfBirth() {
-        return (Date)readProperty("dateOfBirth");
+        beforePropertyRead("dateOfBirth");
+        return dateOfBirth;
     }
 
     public void addToArtistExhibitArray(ArtistExhibit obj) {
         addToManyTarget("artistExhibitArray", obj, true);
     }
+
     public void removeFromArtistExhibitArray(ArtistExhibit obj) {
         removeToManyTarget("artistExhibitArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ArtistExhibit> getArtistExhibitArray() {
         return (List<ArtistExhibit>)readProperty("artistExhibitArray");
     }
 
-
     public void addToGroupArray(ArtGroup obj) {
         addToManyTarget("groupArray", obj, true);
     }
+
     public void removeFromGroupArray(ArtGroup obj) {
         removeToManyTarget("groupArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ArtGroup> getGroupArray() {
         return (List<ArtGroup>)readProperty("groupArray");
     }
 
-
     public void addToPaintingArray(Painting obj) {
         addToManyTarget("paintingArray", obj, true);
     }
+
     public void removeFromPaintingArray(Painting obj) {
         removeToManyTarget("paintingArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Painting> getPaintingArray() {
         return (List<Painting>)readProperty("paintingArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "artistName":
+                return this.artistName;
+            case "dateOfBirth":
+                return this.dateOfBirth;
+            case "artistExhibitArray":
+                return this.artistExhibitArray;
+            case "groupArray":
+                return this.groupArray;
+            case "paintingArray":
+                return this.paintingArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "artistName":
+                this.artistName = (String)val;
+                break;
+            case "dateOfBirth":
+                this.dateOfBirth = (Date)val;
+                break;
+            case "artistExhibitArray":
+                this.artistExhibitArray = val;
+                break;
+            case "groupArray":
+                this.groupArray = val;
+                break;
+            case "paintingArray":
+                this.paintingArray = 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(artistName);
+        out.writeObject(dateOfBirth);
+        out.writeObject(artistExhibitArray);
+        out.writeObject(groupArray);
+        out.writeObject(paintingArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        artistName = (String)in.readObject();
+        dateOfBirth = (Date)in.readObject();
+        artistExhibitArray = in.readObject();
+        groupArray = in.readObject();
+        paintingArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
index 14caad5..c050e37 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Date;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ArtistCallback extends CayenneDataObject {
+public abstract class _ArtistCallback extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,32 +23,98 @@ public abstract class _ArtistCallback extends CayenneDataObject {
     public static final Property<String> ARTIST_NAME = Property.create("artistName", String.class);
     public static final Property<Date> DATE_OF_BIRTH = Property.create("dateOfBirth", Date.class);
 
+    protected String artistName;
+    protected Date dateOfBirth;
+
+
     public void setArtistName(String artistName) {
-        writeProperty("artistName", artistName);
+        beforePropertyWrite("artistName", this.artistName, artistName);
+        this.artistName = artistName;
     }
+
     public String getArtistName() {
-        return (String)readProperty("artistName");
+        beforePropertyRead("artistName");
+        return artistName;
     }
 
     public void setDateOfBirth(Date dateOfBirth) {
-        writeProperty("dateOfBirth", dateOfBirth);
+        beforePropertyWrite("dateOfBirth", this.dateOfBirth, dateOfBirth);
+        this.dateOfBirth = dateOfBirth;
     }
+
     public Date getDateOfBirth() {
-        return (Date)readProperty("dateOfBirth");
+        beforePropertyRead("dateOfBirth");
+        return dateOfBirth;
     }
 
-    protected abstract void prePersistEntityObjEntity();
+protected abstract void prePersistEntityObjEntity();
+
+protected abstract void preRemoveEntityObjEntity();
 
-    protected abstract void preRemoveEntityObjEntity();
+protected abstract void preUpdateEntityObjEntity();
 
-    protected abstract void preUpdateEntityObjEntity();
+protected abstract void postPersistEntityObjEntity();
 
-    protected abstract void postPersistEntityObjEntity();
+protected abstract void postRemoveEntityObjEntity();
 
-    protected abstract void postRemoveEntityObjEntity();
+protected abstract void postUpdateEntityObjEntity();
 
-    protected abstract void postUpdateEntityObjEntity();
+protected abstract void postLoadEntityObjEntity();
 
-    protected abstract void postLoadEntityObjEntity();
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "artistName":
+                return this.artistName;
+            case "dateOfBirth":
+                return this.dateOfBirth;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "artistName":
+                this.artistName = (String)val;
+                break;
+            case "dateOfBirth":
+                this.dateOfBirth = (Date)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(artistName);
+        out.writeObject(dateOfBirth);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        artistName = (String)in.readObject();
+        dateOfBirth = (Date)in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
index 73a528a..6e5be90 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.testmap.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.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Exhibit;
@@ -11,7 +15,7 @@ import org.apache.cayenne.testdo.testmap.Exhibit;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ArtistExhibit extends CayenneDataObject {
+public abstract class _ArtistExhibit extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,6 +25,10 @@ public abstract class _ArtistExhibit extends CayenneDataObject {
     public static final Property<Artist> TO_ARTIST = Property.create("toArtist", Artist.class);
     public static final Property<Exhibit> TO_EXHIBIT = Property.create("toExhibit", Exhibit.class);
 
+
+    protected Object toArtist;
+    protected Object toExhibit;
+
     public void setToArtist(Artist toArtist) {
         setToOneTarget("toArtist", toArtist, true);
     }
@@ -29,7 +37,6 @@ public abstract class _ArtistExhibit extends CayenneDataObject {
         return (Artist)readProperty("toArtist");
     }
 
-
     public void setToExhibit(Exhibit toExhibit) {
         setToOneTarget("toExhibit", toExhibit, true);
     }
@@ -38,5 +45,60 @@ public abstract class _ArtistExhibit extends CayenneDataObject {
         return (Exhibit)readProperty("toExhibit");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "toArtist":
+                return this.toArtist;
+            case "toExhibit":
+                return this.toExhibit;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "toArtist":
+                this.toArtist = val;
+                break;
+            case "toExhibit":
+                this.toExhibit = 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(toArtist);
+        out.writeObject(toExhibit);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        toArtist = in.readObject();
+        toExhibit = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
index 3263470..ddf4c00 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Gallery;
@@ -14,7 +17,7 @@ import org.apache.cayenne.testdo.testmap.PaintingInfo;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CompoundPainting extends CayenneDataObject {
+public abstract class _CompoundPainting extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -29,39 +32,64 @@ public abstract class _CompoundPainting extends CayenneDataObject {
     public static final Property<Gallery> TO_GALLERY = Property.create("toGallery", Gallery.class);
     public static final Property<PaintingInfo> TO_PAINTING_INFO = Property.create("toPaintingInfo", PaintingInfo.class);
 
+    protected String artistName;
+    protected BigDecimal estimatedPrice;
+    protected String galleryName;
+    protected String paintingTitle;
+    protected String textReview;
+
+    protected Object toArtist;
+    protected Object toGallery;
+    protected Object toPaintingInfo;
+
     public void setArtistName(String artistName) {
-        writeProperty("artistName", artistName);
+        beforePropertyWrite("artistName", this.artistName, artistName);
+        this.artistName = artistName;
     }
+
     public String getArtistName() {
-        return (String)readProperty("artistName");
+        beforePropertyRead("artistName");
+        return artistName;
     }
 
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
-        writeProperty("estimatedPrice", estimatedPrice);
+        beforePropertyWrite("estimatedPrice", this.estimatedPrice, estimatedPrice);
+        this.estimatedPrice = estimatedPrice;
     }
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public void setGalleryName(String galleryName) {
-        writeProperty("galleryName", galleryName);
+        beforePropertyWrite("galleryName", this.galleryName, galleryName);
+        this.galleryName = galleryName;
     }
+
     public String getGalleryName() {
-        return (String)readProperty("galleryName");
+        beforePropertyRead("galleryName");
+        return galleryName;
     }
 
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
     public void setTextReview(String textReview) {
-        writeProperty("textReview", textReview);
+        beforePropertyWrite("textReview", this.textReview, textReview);
+        this.textReview = textReview;
     }
+
     public String getTextReview() {
-        return (String)readProperty("textReview");
+        beforePropertyRead("textReview");
+        return textReview;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -72,7 +100,6 @@ public abstract class _CompoundPainting extends CayenneDataObject {
         return (Artist)readProperty("toArtist");
     }
 
-
     public void setToGallery(Gallery toGallery) {
         setToOneTarget("toGallery", toGallery, true);
     }
@@ -81,7 +108,6 @@ public abstract class _CompoundPainting extends CayenneDataObject {
         return (Gallery)readProperty("toGallery");
     }
 
-
     public void setToPaintingInfo(PaintingInfo toPaintingInfo) {
         setToOneTarget("toPaintingInfo", toPaintingInfo, true);
     }
@@ -90,5 +116,102 @@ public abstract class _CompoundPainting extends CayenneDataObject {
         return (PaintingInfo)readProperty("toPaintingInfo");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "artistName":
+                return this.artistName;
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "galleryName":
+                return this.galleryName;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "textReview":
+                return this.textReview;
+            case "toArtist":
+                return this.toArtist;
+            case "toGallery":
+                return this.toGallery;
+            case "toPaintingInfo":
+                return this.toPaintingInfo;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "artistName":
+                this.artistName = (String)val;
+                break;
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "galleryName":
+                this.galleryName = (String)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "textReview":
+                this.textReview = (String)val;
+                break;
+            case "toArtist":
+                this.toArtist = val;
+                break;
+            case "toGallery":
+                this.toGallery = val;
+                break;
+            case "toPaintingInfo":
+                this.toPaintingInfo = 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(artistName);
+        out.writeObject(estimatedPrice);
+        out.writeObject(galleryName);
+        out.writeObject(paintingTitle);
+        out.writeObject(textReview);
+        out.writeObject(toArtist);
+        out.writeObject(toGallery);
+        out.writeObject(toPaintingInfo);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        artistName = (String)in.readObject();
+        estimatedPrice = (BigDecimal)in.readObject();
+        galleryName = (String)in.readObject();
+        paintingTitle = (String)in.readObject();
+        textReview = (String)in.readObject();
+        toArtist = in.readObject();
+        toGallery = in.readObject();
+        toPaintingInfo = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
index 62825dd..fd372f1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Gallery;
@@ -15,7 +18,7 @@ import org.apache.cayenne.testdo.testmap.ROArtist;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
+public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -32,46 +35,76 @@ public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
     public static final Property<Gallery> TO_GALLERY = Property.create("toGallery", Gallery.class);
     public static final Property<PaintingInfo> TO_PAINTING_INFO = Property.create("toPaintingInfo", PaintingInfo.class);
 
+    protected String artistLongName;
+    protected BigDecimal estimatedPrice;
+    protected String galleryLongName;
+    protected String paintingDescription;
+    protected String paintingTitle;
+    protected String textLongReview;
+
+    protected Object toArtist;
+    protected Object toArtist1;
+    protected Object toGallery;
+    protected Object toPaintingInfo;
+
     public void setArtistLongName(String artistLongName) {
-        writeProperty("artistLongName", artistLongName);
+        beforePropertyWrite("artistLongName", this.artistLongName, artistLongName);
+        this.artistLongName = artistLongName;
     }
+
     public String getArtistLongName() {
-        return (String)readProperty("artistLongName");
+        beforePropertyRead("artistLongName");
+        return artistLongName;
     }
 
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
-        writeProperty("estimatedPrice", estimatedPrice);
+        beforePropertyWrite("estimatedPrice", this.estimatedPrice, estimatedPrice);
+        this.estimatedPrice = estimatedPrice;
     }
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public void setGalleryLongName(String galleryLongName) {
-        writeProperty("galleryLongName", galleryLongName);
+        beforePropertyWrite("galleryLongName", this.galleryLongName, galleryLongName);
+        this.galleryLongName = galleryLongName;
     }
+
     public String getGalleryLongName() {
-        return (String)readProperty("galleryLongName");
+        beforePropertyRead("galleryLongName");
+        return galleryLongName;
     }
 
     public void setPaintingDescription(String paintingDescription) {
-        writeProperty("paintingDescription", paintingDescription);
+        beforePropertyWrite("paintingDescription", this.paintingDescription, paintingDescription);
+        this.paintingDescription = paintingDescription;
     }
+
     public String getPaintingDescription() {
-        return (String)readProperty("paintingDescription");
+        beforePropertyRead("paintingDescription");
+        return paintingDescription;
     }
 
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
     public void setTextLongReview(String textLongReview) {
-        writeProperty("textLongReview", textLongReview);
+        beforePropertyWrite("textLongReview", this.textLongReview, textLongReview);
+        this.textLongReview = textLongReview;
     }
+
     public String getTextLongReview() {
-        return (String)readProperty("textLongReview");
+        beforePropertyRead("textLongReview");
+        return textLongReview;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -82,7 +115,6 @@ public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
         return (Artist)readProperty("toArtist");
     }
 
-
     public void setToArtist1(ROArtist toArtist1) {
         setToOneTarget("toArtist1", toArtist1, true);
     }
@@ -91,7 +123,6 @@ public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
         return (ROArtist)readProperty("toArtist1");
     }
 
-
     public void setToGallery(Gallery toGallery) {
         setToOneTarget("toGallery", toGallery, true);
     }
@@ -100,7 +131,6 @@ public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
         return (Gallery)readProperty("toGallery");
     }
 
-
     public void setToPaintingInfo(PaintingInfo toPaintingInfo) {
         setToOneTarget("toPaintingInfo", toPaintingInfo, true);
     }
@@ -109,5 +139,116 @@ public abstract class _CompoundPaintingLongNames extends CayenneDataObject {
         return (PaintingInfo)readProperty("toPaintingInfo");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "artistLongName":
+                return this.artistLongName;
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "galleryLongName":
+                return this.galleryLongName;
+            case "paintingDescription":
+                return this.paintingDescription;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "textLongReview":
+                return this.textLongReview;
+            case "toArtist":
+                return this.toArtist;
+            case "toArtist1":
+                return this.toArtist1;
+            case "toGallery":
+                return this.toGallery;
+            case "toPaintingInfo":
+                return this.toPaintingInfo;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "artistLongName":
+                this.artistLongName = (String)val;
+                break;
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "galleryLongName":
+                this.galleryLongName = (String)val;
+                break;
+            case "paintingDescription":
+                this.paintingDescription = (String)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "textLongReview":
+                this.textLongReview = (String)val;
+                break;
+            case "toArtist":
+                this.toArtist = val;
+                break;
+            case "toArtist1":
+                this.toArtist1 = val;
+                break;
+            case "toGallery":
+                this.toGallery = val;
+                break;
+            case "toPaintingInfo":
+                this.toPaintingInfo = 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(artistLongName);
+        out.writeObject(estimatedPrice);
+        out.writeObject(galleryLongName);
+        out.writeObject(paintingDescription);
+        out.writeObject(paintingTitle);
+        out.writeObject(textLongReview);
+        out.writeObject(toArtist);
+        out.writeObject(toArtist1);
+        out.writeObject(toGallery);
+        out.writeObject(toPaintingInfo);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        artistLongName = (String)in.readObject();
+        estimatedPrice = (BigDecimal)in.readObject();
+        galleryLongName = (String)in.readObject();
+        paintingDescription = (String)in.readObject();
+        paintingTitle = (String)in.readObject();
+        textLongReview = (String)in.readObject();
+        toArtist = in.readObject();
+        toArtist1 = in.readObject();
+        toGallery = in.readObject();
+        toPaintingInfo = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
index 00a8b29..e77fc16 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
@@ -1,9 +1,12 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Date;
 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.testmap.ArtistExhibit;
 import org.apache.cayenne.testdo.testmap.Gallery;
@@ -14,7 +17,7 @@ import org.apache.cayenne.testdo.testmap.Gallery;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Exhibit extends CayenneDataObject {
+public abstract class _Exhibit extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -25,32 +28,45 @@ public abstract class _Exhibit extends CayenneDataObject {
     public static final Property<List<ArtistExhibit>> ARTIST_EXHIBIT_ARRAY = Property.create("artistExhibitArray", List.class);
     public static final Property<Gallery> TO_GALLERY = Property.create("toGallery", Gallery.class);
 
+    protected Date closingDate;
+    protected Date openingDate;
+
+    protected Object artistExhibitArray;
+    protected Object toGallery;
+
     public void setClosingDate(Date closingDate) {
-        writeProperty("closingDate", closingDate);
+        beforePropertyWrite("closingDate", this.closingDate, closingDate);
+        this.closingDate = closingDate;
     }
+
     public Date getClosingDate() {
-        return (Date)readProperty("closingDate");
+        beforePropertyRead("closingDate");
+        return closingDate;
     }
 
     public void setOpeningDate(Date openingDate) {
-        writeProperty("openingDate", openingDate);
+        beforePropertyWrite("openingDate", this.openingDate, openingDate);
+        this.openingDate = openingDate;
     }
+
     public Date getOpeningDate() {
-        return (Date)readProperty("openingDate");
+        beforePropertyRead("openingDate");
+        return openingDate;
     }
 
     public void addToArtistExhibitArray(ArtistExhibit obj) {
         addToManyTarget("artistExhibitArray", obj, true);
     }
+
     public void removeFromArtistExhibitArray(ArtistExhibit obj) {
         removeToManyTarget("artistExhibitArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ArtistExhibit> getArtistExhibitArray() {
         return (List<ArtistExhibit>)readProperty("artistExhibitArray");
     }
 
-
     public void setToGallery(Gallery toGallery) {
         setToOneTarget("toGallery", toGallery, true);
     }
@@ -59,5 +75,74 @@ public abstract class _Exhibit extends CayenneDataObject {
         return (Gallery)readProperty("toGallery");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "closingDate":
+                return this.closingDate;
+            case "openingDate":
+                return this.openingDate;
+            case "artistExhibitArray":
+                return this.artistExhibitArray;
+            case "toGallery":
+                return this.toGallery;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "closingDate":
+                this.closingDate = (Date)val;
+                break;
+            case "openingDate":
+                this.openingDate = (Date)val;
+                break;
+            case "artistExhibitArray":
+                this.artistExhibitArray = val;
+                break;
+            case "toGallery":
+                this.toGallery = 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(closingDate);
+        out.writeObject(openingDate);
+        out.writeObject(artistExhibitArray);
+        out.writeObject(toGallery);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        closingDate = (Date)in.readObject();
+        openingDate = (Date)in.readObject();
+        artistExhibitArray = in.readObject();
+        toGallery = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
index 73bf5a2..f462a9b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.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.testmap.Exhibit;
 import org.apache.cayenne.testdo.testmap.Painting;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.testmap.Painting;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Gallery extends CayenneDataObject {
+public abstract class _Gallery extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,35 +26,108 @@ public abstract class _Gallery extends CayenneDataObject {
     public static final Property<List<Exhibit>> EXHIBIT_ARRAY = Property.create("exhibitArray", List.class);
     public static final Property<List<Painting>> PAINTING_ARRAY = Property.create("paintingArray", List.class);
 
+    protected String galleryName;
+
+    protected Object exhibitArray;
+    protected Object paintingArray;
+
     public void setGalleryName(String galleryName) {
-        writeProperty("galleryName", galleryName);
+        beforePropertyWrite("galleryName", this.galleryName, galleryName);
+        this.galleryName = galleryName;
     }
+
     public String getGalleryName() {
-        return (String)readProperty("galleryName");
+        beforePropertyRead("galleryName");
+        return galleryName;
     }
 
     public void addToExhibitArray(Exhibit obj) {
         addToManyTarget("exhibitArray", obj, true);
     }
+
     public void removeFromExhibitArray(Exhibit obj) {
         removeToManyTarget("exhibitArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Exhibit> getExhibitArray() {
         return (List<Exhibit>)readProperty("exhibitArray");
     }
 
-
     public void addToPaintingArray(Painting obj) {
         addToManyTarget("paintingArray", obj, true);
     }
+
     public void removeFromPaintingArray(Painting obj) {
         removeToManyTarget("paintingArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Painting> getPaintingArray() {
         return (List<Painting>)readProperty("paintingArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "galleryName":
+                return this.galleryName;
+            case "exhibitArray":
+                return this.exhibitArray;
+            case "paintingArray":
+                return this.paintingArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "galleryName":
+                this.galleryName = (String)val;
+                break;
+            case "exhibitArray":
+                this.exhibitArray = val;
+                break;
+            case "paintingArray":
+                this.paintingArray = 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(galleryName);
+        out.writeObject(exhibitArray);
+        out.writeObject(paintingArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        galleryName = (String)in.readObject();
+        exhibitArray = in.readObject();
+        paintingArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
index 77ff7bf..274a141 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.testmap.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulGeneratedColumnTestEntity extends CayenneDataObject {
+public abstract class _MeaningfulGeneratedColumnTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _MeaningfulGeneratedColumnTestEntity extends CayenneDataOb
     public static final Property<Integer> GENERATED_COLUMN = Property.create("generatedColumn", Integer.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected Integer generatedColumn;
+    protected String name;
+
+
     public void setGeneratedColumn(Integer generatedColumn) {
-        writeProperty("generatedColumn", generatedColumn);
+        beforePropertyWrite("generatedColumn", this.generatedColumn, generatedColumn);
+        this.generatedColumn = generatedColumn;
     }
+
     public Integer getGeneratedColumn() {
-        return (Integer)readProperty("generatedColumn");
+        beforePropertyRead("generatedColumn");
+        return generatedColumn;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "generatedColumn":
+                return this.generatedColumn;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "generatedColumn":
+                this.generatedColumn = (Integer)val;
+                break;
+            case "name":
+                this.name = (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(generatedColumn);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        generatedColumn = (Integer)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
index 4e371f7..9f84715 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.testmap.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _NullTestEntity extends CayenneDataObject {
+public abstract class _NullTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _NullTestEntity extends CayenneDataObject {
 
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String name;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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;
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
index a0c1810..b44e76c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
@@ -1,5 +1,8 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
 import org.apache.cayenne.exp.Property;
@@ -27,25 +30,42 @@ public abstract class _Painting extends ArtDataObject {
     public static final Property<Gallery> TO_GALLERY = Property.create("toGallery", Gallery.class);
     public static final Property<PaintingInfo> TO_PAINTING_INFO = Property.create("toPaintingInfo", PaintingInfo.class);
 
+    protected BigDecimal estimatedPrice;
+    protected String paintingDescription;
+    protected String paintingTitle;
+
+    protected Object toArtist;
+    protected Object toGallery;
+    protected Object toPaintingInfo;
+
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
-        writeProperty("estimatedPrice", estimatedPrice);
+        beforePropertyWrite("estimatedPrice", this.estimatedPrice, estimatedPrice);
+        this.estimatedPrice = estimatedPrice;
     }
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public void setPaintingDescription(String paintingDescription) {
-        writeProperty("paintingDescription", paintingDescription);
+        beforePropertyWrite("paintingDescription", this.paintingDescription, paintingDescription);
+        this.paintingDescription = paintingDescription;
     }
+
     public String getPaintingDescription() {
-        return (String)readProperty("paintingDescription");
+        beforePropertyRead("paintingDescription");
+        return paintingDescription;
     }
 
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -56,7 +76,6 @@ public abstract class _Painting extends ArtDataObject {
         return (Artist)readProperty("toArtist");
     }
 
-
     public void setToGallery(Gallery toGallery) {
         setToOneTarget("toGallery", toGallery, true);
     }
@@ -65,7 +84,6 @@ public abstract class _Painting extends ArtDataObject {
         return (Gallery)readProperty("toGallery");
     }
 
-
     public void setToPaintingInfo(PaintingInfo toPaintingInfo) {
         setToOneTarget("toPaintingInfo", toPaintingInfo, true);
     }
@@ -74,5 +92,88 @@ public abstract class _Painting extends ArtDataObject {
         return (PaintingInfo)readProperty("toPaintingInfo");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "paintingDescription":
+                return this.paintingDescription;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "toArtist":
+                return this.toArtist;
+            case "toGallery":
+                return this.toGallery;
+            case "toPaintingInfo":
+                return this.toPaintingInfo;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "paintingDescription":
+                this.paintingDescription = (String)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "toArtist":
+                this.toArtist = val;
+                break;
+            case "toGallery":
+                this.toGallery = val;
+                break;
+            case "toPaintingInfo":
+                this.toPaintingInfo = 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(estimatedPrice);
+        out.writeObject(paintingDescription);
+        out.writeObject(paintingTitle);
+        out.writeObject(toArtist);
+        out.writeObject(toGallery);
+        out.writeObject(toPaintingInfo);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        estimatedPrice = (BigDecimal)in.readObject();
+        paintingDescription = (String)in.readObject();
+        paintingTitle = (String)in.readObject();
+        toArtist = in.readObject();
+        toGallery = in.readObject();
+        toPaintingInfo = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
index 797581d..baa0ad9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.testmap.Artist;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.testmap.Artist;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Painting1 extends CayenneDataObject {
+public abstract class _Painting1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,18 +25,29 @@ public abstract class _Painting1 extends CayenneDataObject {
     public static final Property<String> PAINTING_TITLE = Property.create("paintingTitle", String.class);
     public static final Property<Artist> TO_ARTIST = Property.create("toArtist", Artist.class);
 
+    protected BigDecimal estimatedPrice;
+    protected String paintingTitle;
+
+    protected Object toArtist;
+
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
-        writeProperty("estimatedPrice", estimatedPrice);
+        beforePropertyWrite("estimatedPrice", this.estimatedPrice, estimatedPrice);
+        this.estimatedPrice = estimatedPrice;
     }
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public void setPaintingTitle(String paintingTitle) {
-        writeProperty("paintingTitle", paintingTitle);
+        beforePropertyWrite("paintingTitle", this.paintingTitle, paintingTitle);
+        this.paintingTitle = paintingTitle;
     }
+
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -44,5 +58,67 @@ public abstract class _Painting1 extends CayenneDataObject {
         return (Artist)readProperty("toArtist");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "toArtist":
+                return this.toArtist;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "toArtist":
+                this.toArtist = 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(estimatedPrice);
+        out.writeObject(paintingTitle);
+        out.writeObject(toArtist);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        estimatedPrice = (BigDecimal)in.readObject();
+        paintingTitle = (String)in.readObject();
+        toArtist = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
index 81930b6..4fe1805 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.testmap.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.testmap.Painting;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.testmap.Painting;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _PaintingInfo extends CayenneDataObject {
+public abstract class _PaintingInfo extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _PaintingInfo extends CayenneDataObject {
     public static final Property<String> TEXT_REVIEW = Property.create("textReview", String.class);
     public static final Property<Painting> PAINTING = Property.create("painting", Painting.class);
 
+    protected byte[] imageBlob;
+    protected String textReview;
+
+    protected Object painting;
+
     public void setImageBlob(byte[] imageBlob) {
-        writeProperty("imageBlob", imageBlob);
+        beforePropertyWrite("imageBlob", this.imageBlob, imageBlob);
+        this.imageBlob = imageBlob;
     }
+
     public byte[] getImageBlob() {
-        return (byte[])readProperty("imageBlob");
+        beforePropertyRead("imageBlob");
+        return imageBlob;
     }
 
     public void setTextReview(String textReview) {
-        writeProperty("textReview", textReview);
+        beforePropertyWrite("textReview", this.textReview, textReview);
+        this.textReview = textReview;
     }
+
     public String getTextReview() {
-        return (String)readProperty("textReview");
+        beforePropertyRead("textReview");
+        return textReview;
     }
 
     public void setPainting(Painting painting) {
@@ -42,5 +57,67 @@ public abstract class _PaintingInfo extends CayenneDataObject {
         return (Painting)readProperty("painting");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "imageBlob":
+                return this.imageBlob;
+            case "textReview":
+                return this.textReview;
+            case "painting":
+                return this.painting;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "imageBlob":
+                this.imageBlob = (byte[])val;
+                break;
+            case "textReview":
+                this.textReview = (String)val;
+                break;
+            case "painting":
+                this.painting = 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(imageBlob);
+        out.writeObject(textReview);
+        out.writeObject(painting);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        imageBlob = (byte[])in.readObject();
+        textReview = (String)in.readObject();
+        painting = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
index 40a307d..d4640fe 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
@@ -1,9 +1,12 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.sql.Date;
 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.testmap.Painting;
 
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.testmap.Painting;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ROArtist extends CayenneDataObject {
+public abstract class _ROArtist extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,24 +26,95 @@ public abstract class _ROArtist extends CayenneDataObject {
     public static final Property<Date> DATE_OF_BIRTH = Property.create("dateOfBirth", Date.class);
     public static final Property<List<Painting>> PAINTING_ARRAY = Property.create("paintingArray", List.class);
 
+    protected String artistName;
+    protected Date dateOfBirth;
+
+    protected Object paintingArray;
+
     public String getArtistName() {
-        return (String)readProperty("artistName");
+        beforePropertyRead("artistName");
+        return artistName;
     }
 
     public Date getDateOfBirth() {
-        return (Date)readProperty("dateOfBirth");
+        beforePropertyRead("dateOfBirth");
+        return dateOfBirth;
     }
 
     public void addToPaintingArray(Painting obj) {
         addToManyTarget("paintingArray", obj, true);
     }
+
     public void removeFromPaintingArray(Painting obj) {
         removeToManyTarget("paintingArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Painting> getPaintingArray() {
         return (List<Painting>)readProperty("paintingArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "artistName":
+                return this.artistName;
+            case "dateOfBirth":
+                return this.dateOfBirth;
+            case "paintingArray":
+                return this.paintingArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "artistName":
+                this.artistName = (String)val;
+                break;
+            case "dateOfBirth":
+                this.dateOfBirth = (Date)val;
+                break;
+            case "paintingArray":
+                this.paintingArray = 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(artistName);
+        out.writeObject(dateOfBirth);
+        out.writeObject(paintingArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        artistName = (String)in.readObject();
+        dateOfBirth = (Date)in.readObject();
+        paintingArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
index b0b4d95..84a95e7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.testmap.Artist;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.testmap.Artist;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ROPainting extends CayenneDataObject {
+public abstract class _ROPainting extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,18 +25,86 @@ public abstract class _ROPainting extends CayenneDataObject {
     public static final Property<String> PAINTING_TITLE = Property.create("paintingTitle", String.class);
     public static final Property<Artist> TO_ARTIST = Property.create("toArtist", Artist.class);
 
+    protected BigDecimal estimatedPrice;
+    protected String paintingTitle;
+
+    protected Object toArtist;
+
     public BigDecimal getEstimatedPrice() {
-        return (BigDecimal)readProperty("estimatedPrice");
+        beforePropertyRead("estimatedPrice");
+        return estimatedPrice;
     }
 
     public String getPaintingTitle() {
-        return (String)readProperty("paintingTitle");
+        beforePropertyRead("paintingTitle");
+        return paintingTitle;
     }
 
-
     public Artist getToArtist() {
         return (Artist)readProperty("toArtist");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "estimatedPrice":
+                return this.estimatedPrice;
+            case "paintingTitle":
+                return this.paintingTitle;
+            case "toArtist":
+                return this.toArtist;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "estimatedPrice":
+                this.estimatedPrice = (BigDecimal)val;
+                break;
+            case "paintingTitle":
+                this.paintingTitle = (String)val;
+                break;
+            case "toArtist":
+                this.toArtist = 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(estimatedPrice);
+        out.writeObject(paintingTitle);
+        out.writeObject(toArtist);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        estimatedPrice = (BigDecimal)in.readObject();
+        paintingTitle = (String)in.readObject();
+        toArtist = in.readObject();
+    }
 
 }


[05/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
index 8e14471..21b0e92 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.mt.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.mt.MtTable2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.mt.MtTable2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MtTable1 extends CayenneDataObject {
+public abstract class _MtTable1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _MtTable1 extends CayenneDataObject {
     public static final Property<String> SERVER_ATTRIBUTE1 = Property.create("serverAttribute1", String.class);
     public static final Property<List<MtTable2>> TABLE2ARRAY = Property.create("table2Array", List.class);
 
+    protected String globalAttribute1;
+    protected String serverAttribute1;
+
+    protected Object table2Array;
+
     public void setGlobalAttribute1(String globalAttribute1) {
-        writeProperty("globalAttribute1", globalAttribute1);
+        beforePropertyWrite("globalAttribute1", this.globalAttribute1, globalAttribute1);
+        this.globalAttribute1 = globalAttribute1;
     }
+
     public String getGlobalAttribute1() {
-        return (String)readProperty("globalAttribute1");
+        beforePropertyRead("globalAttribute1");
+        return globalAttribute1;
     }
 
     public void setServerAttribute1(String serverAttribute1) {
-        writeProperty("serverAttribute1", serverAttribute1);
+        beforePropertyWrite("serverAttribute1", this.serverAttribute1, serverAttribute1);
+        this.serverAttribute1 = serverAttribute1;
     }
+
     public String getServerAttribute1() {
-        return (String)readProperty("serverAttribute1");
+        beforePropertyRead("serverAttribute1");
+        return serverAttribute1;
     }
 
     public void addToTable2Array(MtTable2 obj) {
         addToManyTarget("table2Array", obj, true);
     }
+
     public void removeFromTable2Array(MtTable2 obj) {
         removeToManyTarget("table2Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MtTable2> getTable2Array() {
         return (List<MtTable2>)readProperty("table2Array");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "globalAttribute1":
+                return this.globalAttribute1;
+            case "serverAttribute1":
+                return this.serverAttribute1;
+            case "table2Array":
+                return this.table2Array;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "globalAttribute1":
+                this.globalAttribute1 = (String)val;
+                break;
+            case "serverAttribute1":
+                this.serverAttribute1 = (String)val;
+                break;
+            case "table2Array":
+                this.table2Array = 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(globalAttribute1);
+        out.writeObject(serverAttribute1);
+        out.writeObject(table2Array);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        globalAttribute1 = (String)in.readObject();
+        serverAttribute1 = (String)in.readObject();
+        table2Array = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
index 54e5146..ae178eb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.mt.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.mt.MtTable1;
 
@@ -17,11 +21,66 @@ public abstract class _MtTable1Subclass1 extends MtTable1 {
 
     public static final Property<String> SUBCLASS1ATTRIBUTE1 = Property.create("subclass1Attribute1", String.class);
 
+    protected String subclass1Attribute1;
+
+
     public void setSubclass1Attribute1(String subclass1Attribute1) {
-        writeProperty("subclass1Attribute1", subclass1Attribute1);
+        beforePropertyWrite("subclass1Attribute1", this.subclass1Attribute1, subclass1Attribute1);
+        this.subclass1Attribute1 = subclass1Attribute1;
     }
+
     public String getSubclass1Attribute1() {
-        return (String)readProperty("subclass1Attribute1");
+        beforePropertyRead("subclass1Attribute1");
+        return subclass1Attribute1;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "subclass1Attribute1":
+                return this.subclass1Attribute1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "subclass1Attribute1":
+                this.subclass1Attribute1 = (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(subclass1Attribute1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        subclass1Attribute1 = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
index 7d64910..da985cc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.mt.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.mt.MtTable1;
 
@@ -17,11 +21,66 @@ public abstract class _MtTable1Subclass2 extends MtTable1 {
 
     public static final Property<String> SUBCLASS2ATTRIBUTE1 = Property.create("subclass2Attribute1", String.class);
 
+    protected String subclass2Attribute1;
+
+
     public void setSubclass2Attribute1(String subclass2Attribute1) {
-        writeProperty("subclass2Attribute1", subclass2Attribute1);
+        beforePropertyWrite("subclass2Attribute1", this.subclass2Attribute1, subclass2Attribute1);
+        this.subclass2Attribute1 = subclass2Attribute1;
     }
+
     public String getSubclass2Attribute1() {
-        return (String)readProperty("subclass2Attribute1");
+        beforePropertyRead("subclass2Attribute1");
+        return subclass2Attribute1;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "subclass2Attribute1":
+                return this.subclass2Attribute1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "subclass2Attribute1":
+                this.subclass2Attribute1 = (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(subclass2Attribute1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        subclass2Attribute1 = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
index c03999f..42160e8 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.mt.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.mt.MtTable1;
 import org.apache.cayenne.testdo.mt.MtTable3;
@@ -11,7 +15,7 @@ import org.apache.cayenne.testdo.mt.MtTable3;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MtTable2 extends CayenneDataObject {
+public abstract class _MtTable2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,11 +25,19 @@ public abstract class _MtTable2 extends CayenneDataObject {
     public static final Property<MtTable1> TABLE1 = Property.create("table1", MtTable1.class);
     public static final Property<MtTable3> TABLE3 = Property.create("table3", MtTable3.class);
 
+    protected String globalAttribute;
+
+    protected Object table1;
+    protected Object table3;
+
     public void setGlobalAttribute(String globalAttribute) {
-        writeProperty("globalAttribute", globalAttribute);
+        beforePropertyWrite("globalAttribute", this.globalAttribute, globalAttribute);
+        this.globalAttribute = globalAttribute;
     }
+
     public String getGlobalAttribute() {
-        return (String)readProperty("globalAttribute");
+        beforePropertyRead("globalAttribute");
+        return globalAttribute;
     }
 
     public void setTable1(MtTable1 table1) {
@@ -36,7 +48,6 @@ public abstract class _MtTable2 extends CayenneDataObject {
         return (MtTable1)readProperty("table1");
     }
 
-
     public void setTable3(MtTable3 table3) {
         setToOneTarget("table3", table3, true);
     }
@@ -45,5 +56,67 @@ public abstract class _MtTable2 extends CayenneDataObject {
         return (MtTable3)readProperty("table3");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "globalAttribute":
+                return this.globalAttribute;
+            case "table1":
+                return this.table1;
+            case "table3":
+                return this.table3;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "globalAttribute":
+                this.globalAttribute = (String)val;
+                break;
+            case "table1":
+                this.table1 = val;
+                break;
+            case "table3":
+                this.table3 = 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(globalAttribute);
+        out.writeObject(table1);
+        out.writeObject(table3);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        globalAttribute = (String)in.readObject();
+        table1 = in.readObject();
+        table3 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
index af3177c..9b38704 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.mt.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.mt.MtTable2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.mt.MtTable2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MtTable3 extends CayenneDataObject {
+public abstract class _MtTable3 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,37 +26,123 @@ public abstract class _MtTable3 extends CayenneDataObject {
     public static final Property<Integer> INT_COLUMN = Property.create("intColumn", Integer.class);
     public static final Property<List<MtTable2>> TABLE2ARRAY = Property.create("table2Array", List.class);
 
+    protected byte[] binaryColumn;
+    protected String charColumn;
+    protected Integer intColumn;
+
+    protected Object table2Array;
+
     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 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 setIntColumn(Integer intColumn) {
-        writeProperty("intColumn", intColumn);
+        beforePropertyWrite("intColumn", this.intColumn, intColumn);
+        this.intColumn = intColumn;
     }
+
     public Integer getIntColumn() {
-        return (Integer)readProperty("intColumn");
+        beforePropertyRead("intColumn");
+        return intColumn;
     }
 
     public void addToTable2Array(MtTable2 obj) {
         addToManyTarget("table2Array", obj, true);
     }
+
     public void removeFromTable2Array(MtTable2 obj) {
         removeToManyTarget("table2Array", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MtTable2> getTable2Array() {
         return (List<MtTable2>)readProperty("table2Array");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "binaryColumn":
+                return this.binaryColumn;
+            case "charColumn":
+                return this.charColumn;
+            case "intColumn":
+                return this.intColumn;
+            case "table2Array":
+                return this.table2Array;
+            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 "charColumn":
+                this.charColumn = (String)val;
+                break;
+            case "intColumn":
+                this.intColumn = (Integer)val;
+                break;
+            case "table2Array":
+                this.table2Array = 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(charColumn);
+        out.writeObject(intColumn);
+        out.writeObject(table2Array);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        binaryColumn = (byte[])in.readObject();
+        charColumn = (String)in.readObject();
+        intColumn = (Integer)in.readObject();
+        table2Array = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
index 7a8809d..d8b4a0b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.mt.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.mt.MtTable5;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.mt.MtTable5;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MtTable4 extends CayenneDataObject {
+public abstract class _MtTable4 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _MtTable4 extends CayenneDataObject {
 
     public static final Property<List<MtTable5>> TABLE5S = Property.create("table5s", List.class);
 
+
+    protected Object table5s;
+
     public void addToTable5s(MtTable5 obj) {
         addToManyTarget("table5s", obj, true);
     }
+
     public void removeFromTable5s(MtTable5 obj) {
         removeToManyTarget("table5s", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MtTable5> getTable5s() {
         return (List<MtTable5>)readProperty("table5s");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "table5s":
+                return this.table5s;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "table5s":
+                this.table5s = 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(table5s);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        table5s = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
index f9d308d..cbcebff 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.mt.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.mt.MtTable4;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.mt.MtTable4;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MtTable5 extends CayenneDataObject {
+public abstract class _MtTable5 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _MtTable5 extends CayenneDataObject {
 
     public static final Property<List<MtTable4>> TABLE4S = Property.create("table4s", List.class);
 
+
+    protected Object table4s;
+
     public void addToTable4s(MtTable4 obj) {
         addToManyTarget("table4s", obj, true);
     }
+
     public void removeFromTable4s(MtTable4 obj) {
         removeToManyTarget("table4s", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MtTable4> getTable4s() {
         return (List<MtTable4>)readProperty("table4s");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "table4s":
+                return this.table4s;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "table4s":
+                this.table4s = 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(table4s);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        table4s = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
index b239f13..72d3963 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.no_pk.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;
 
 /**
@@ -9,18 +13,73 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _NoPkTestEntity extends CayenneDataObject {
+public abstract class _NoPkTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
 
     public static final Property<Integer> ATTRIBUTE1 = Property.create("attribute1", Integer.class);
 
+    protected Integer attribute1;
+
+
     public void setAttribute1(Integer attribute1) {
-        writeProperty("attribute1", attribute1);
+        beforePropertyWrite("attribute1", this.attribute1, attribute1);
+        this.attribute1 = attribute1;
     }
+
     public Integer getAttribute1() {
-        return (Integer)readProperty("attribute1");
+        beforePropertyRead("attribute1");
+        return attribute1;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "attribute1":
+                return this.attribute1;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "attribute1":
+                this.attribute1 = (Integer)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(attribute1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        attribute1 = (Integer)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
index b1af171..07fa1a0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.numeric_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BigDecimalEntity extends CayenneDataObject {
+public abstract class _BigDecimalEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _BigDecimalEntity extends CayenneDataObject {
 
     public static final Property<BigDecimal> BIG_DECIMAL_FIELD = Property.create("bigDecimalField", BigDecimal.class);
 
+    protected BigDecimal bigDecimalField;
+
+
     public void setBigDecimalField(BigDecimal bigDecimalField) {
-        writeProperty("bigDecimalField", bigDecimalField);
+        beforePropertyWrite("bigDecimalField", this.bigDecimalField, bigDecimalField);
+        this.bigDecimalField = bigDecimalField;
     }
+
     public BigDecimal getBigDecimalField() {
-        return (BigDecimal)readProperty("bigDecimalField");
+        beforePropertyRead("bigDecimalField");
+        return bigDecimalField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "bigDecimalField":
+                return this.bigDecimalField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "bigDecimalField":
+                this.bigDecimalField = (BigDecimal)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(bigDecimalField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        bigDecimalField = (BigDecimal)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
index 565b104..ef841d1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.numeric_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigInteger;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BigIntegerEntity extends CayenneDataObject {
+public abstract class _BigIntegerEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _BigIntegerEntity extends CayenneDataObject {
 
     public static final Property<BigInteger> BIG_INTEGER_FIELD = Property.create("bigIntegerField", BigInteger.class);
 
+    protected BigInteger bigIntegerField;
+
+
     public void setBigIntegerField(BigInteger bigIntegerField) {
-        writeProperty("bigIntegerField", bigIntegerField);
+        beforePropertyWrite("bigIntegerField", this.bigIntegerField, bigIntegerField);
+        this.bigIntegerField = bigIntegerField;
     }
+
     public BigInteger getBigIntegerField() {
-        return (BigInteger)readProperty("bigIntegerField");
+        beforePropertyRead("bigIntegerField");
+        return bigIntegerField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "bigIntegerField":
+                return this.bigIntegerField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "bigIntegerField":
+                this.bigIntegerField = (BigInteger)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(bigIntegerField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        bigIntegerField = (BigInteger)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
index 9a4212e..2fcc59c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BitNumberTestEntity extends CayenneDataObject {
+public abstract class _BitNumberTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _BitNumberTestEntity extends CayenneDataObject {
 
     public static final Property<Integer> BIT_COLUMN = Property.create("bitColumn", Integer.class);
 
+    protected Integer bitColumn;
+
+
     public void setBitColumn(Integer bitColumn) {
-        writeProperty("bitColumn", bitColumn);
+        beforePropertyWrite("bitColumn", this.bitColumn, bitColumn);
+        this.bitColumn = bitColumn;
     }
+
     public Integer getBitColumn() {
-        return (Integer)readProperty("bitColumn");
+        beforePropertyRead("bitColumn");
+        return bitColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "bitColumn":
+                return this.bitColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "bitColumn":
+                this.bitColumn = (Integer)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(bitColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        bitColumn = (Integer)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
index d81296b..59337dd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BitTestEntity extends CayenneDataObject {
+public abstract class _BitTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _BitTestEntity extends CayenneDataObject {
 
     public static final Property<Boolean> BIT_COLUMN = Property.create("bitColumn", Boolean.class);
 
+    protected Boolean bitColumn;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "bitColumn":
+                return this.bitColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "bitColumn":
+                this.bitColumn = (Boolean)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(bitColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        bitColumn = (Boolean)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
index 2382e16..5a1b340 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BooleanTestEntity extends CayenneDataObject {
+public abstract class _BooleanTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _BooleanTestEntity extends CayenneDataObject {
 
     public static final Property<Boolean> BOOLEAN_COLUMN = Property.create("booleanColumn", Boolean.class);
 
+    protected Boolean booleanColumn;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "booleanColumn":
+                return this.booleanColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "booleanColumn":
+                this.booleanColumn = (Boolean)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(booleanColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        booleanColumn = (Boolean)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
index 965e61a..816493c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DecimalPKTest1 extends CayenneDataObject {
+public abstract class _DecimalPKTest1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _DecimalPKTest1 extends CayenneDataObject {
     public static final Property<Double> DECIMAL_PK = Property.create("decimalPK", Double.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected Double decimalPK;
+    protected String name;
+
+
     public void setDecimalPK(Double decimalPK) {
-        writeProperty("decimalPK", decimalPK);
+        beforePropertyWrite("decimalPK", this.decimalPK, decimalPK);
+        this.decimalPK = decimalPK;
     }
+
     public Double getDecimalPK() {
-        return (Double)readProperty("decimalPK");
+        beforePropertyRead("decimalPK");
+        return decimalPK;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "decimalPK":
+                return this.decimalPK;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "decimalPK":
+                this.decimalPK = (Double)val;
+                break;
+            case "name":
+                this.name = (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(decimalPK);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        decimalPK = (Double)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
index 22f5f93..7f6cc44 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.numeric_types.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DecimalPKTestEntity extends CayenneDataObject {
+public abstract class _DecimalPKTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +23,84 @@ public abstract class _DecimalPKTestEntity extends CayenneDataObject {
     public static final Property<BigDecimal> DECIMAL_PK = Property.create("decimalPK", BigDecimal.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected BigDecimal decimalPK;
+    protected String name;
+
+
     public void setDecimalPK(BigDecimal decimalPK) {
-        writeProperty("decimalPK", decimalPK);
+        beforePropertyWrite("decimalPK", this.decimalPK, decimalPK);
+        this.decimalPK = decimalPK;
     }
+
     public BigDecimal getDecimalPK() {
-        return (BigDecimal)readProperty("decimalPK");
+        beforePropertyRead("decimalPK");
+        return decimalPK;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "decimalPK":
+                return this.decimalPK;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "decimalPK":
+                this.decimalPK = (BigDecimal)val;
+                break;
+            case "name":
+                this.name = (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(decimalPK);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        decimalPK = (BigDecimal)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
index 2322948..9eb37ad 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _LongEntity extends CayenneDataObject {
+public abstract class _LongEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _LongEntity extends CayenneDataObject {
 
     public static final Property<Long> LONG_FIELD = Property.create("longField", Long.class);
 
+    protected Long longField;
+
+
     public void setLongField(Long longField) {
-        writeProperty("longField", longField);
+        beforePropertyWrite("longField", this.longField, longField);
+        this.longField = longField;
     }
+
     public Long getLongField() {
-        return (Long)readProperty("longField");
+        beforePropertyRead("longField");
+        return longField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "longField":
+                return this.longField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "longField":
+                this.longField = (Long)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(longField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        longField = (Long)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
index caa8225..fa9d208 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SmallintTestEntity extends CayenneDataObject {
+public abstract class _SmallintTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _SmallintTestEntity extends CayenneDataObject {
 
     public static final Property<Short> SMALLINT_COL = Property.create("smallintCol", Short.class);
 
+    protected Short smallintCol;
+
+
     public void setSmallintCol(Short smallintCol) {
-        writeProperty("smallintCol", smallintCol);
+        beforePropertyWrite("smallintCol", this.smallintCol, smallintCol);
+        this.smallintCol = smallintCol;
     }
+
     public Short getSmallintCol() {
-        return (Short)readProperty("smallintCol");
+        beforePropertyRead("smallintCol");
+        return smallintCol;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "smallintCol":
+                return this.smallintCol;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "smallintCol":
+                this.smallintCol = (Short)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(smallintCol);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        smallintCol = (Short)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
index f1829fd..da57ad8 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.numeric_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _TinyintTestEntity extends CayenneDataObject {
+public abstract class _TinyintTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _TinyintTestEntity extends CayenneDataObject {
 
     public static final Property<Byte> TINYINT_COL = Property.create("tinyintCol", Byte.class);
 
+    protected Byte tinyintCol;
+
+
     public void setTinyintCol(Byte tinyintCol) {
-        writeProperty("tinyintCol", tinyintCol);
+        beforePropertyWrite("tinyintCol", this.tinyintCol, tinyintCol);
+        this.tinyintCol = tinyintCol;
     }
+
     public Byte getTinyintCol() {
-        return (Byte)readProperty("tinyintCol");
+        beforePropertyRead("tinyintCol");
+        return tinyintCol;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "tinyintCol":
+                return this.tinyintCol;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "tinyintCol":
+                this.tinyintCol = (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(tinyintCol);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        tinyintCol = (Byte)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable1.java
index 8f2b5f2..2a503dd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable1.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.oneway.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 
 /**
  * Class _OnewayTable1 was generated by Cayenne.
@@ -8,11 +12,55 @@ import org.apache.cayenne.CayenneDataObject;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _OnewayTable1 extends CayenneDataObject {
+public abstract class _OnewayTable1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
     public static final String ID_PK_COLUMN = "ID";
 
 
+
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
index 9bfc2fb..52aceba 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.oneway.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.oneway.OnewayTable1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.oneway.OnewayTable1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _OnewayTable2 extends CayenneDataObject {
+public abstract class _OnewayTable2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _OnewayTable2 extends CayenneDataObject {
     public static final Property<Integer> ID = Property.create("id", Integer.class);
     public static final Property<OnewayTable1> TO_ONE_ONE_WAY_DB = Property.create("toOneOneWayDb", OnewayTable1.class);
 
+    protected Integer id;
+
+    protected Object toOneOneWayDb;
+
     public void setId(Integer id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public Integer getId() {
-        return (Integer)readProperty("id");
+        beforePropertyRead("id");
+        return id;
     }
 
     public void setToOneOneWayDb(OnewayTable1 toOneOneWayDb) {
@@ -34,5 +45,60 @@ public abstract class _OnewayTable2 extends CayenneDataObject {
         return (OnewayTable1)readProperty("toOneOneWayDb");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "id":
+                return this.id;
+            case "toOneOneWayDb":
+                return this.toOneOneWayDb;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "id":
+                this.id = (Integer)val;
+                break;
+            case "toOneOneWayDb":
+                this.toOneOneWayDb = 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(id);
+        out.writeObject(toOneOneWayDb);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        id = (Integer)in.readObject();
+        toOneOneWayDb = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
index ff6dd56..7c18626 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.oneway.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.oneway.OnewayTable4;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.oneway.OnewayTable4;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _OnewayTable3 extends CayenneDataObject {
+public abstract class _OnewayTable3 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _OnewayTable3 extends CayenneDataObject {
 
     public static final Property<List<OnewayTable4>> TO_MANY_ONE_WAY_DB = Property.create("toManyOneWayDb", List.class);
 
+
+    protected Object toManyOneWayDb;
+
     public void addToToManyOneWayDb(OnewayTable4 obj) {
         addToManyTarget("toManyOneWayDb", obj, true);
     }
+
     public void removeFromToManyOneWayDb(OnewayTable4 obj) {
         removeToManyTarget("toManyOneWayDb", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<OnewayTable4> getToManyOneWayDb() {
         return (List<OnewayTable4>)readProperty("toManyOneWayDb");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "toManyOneWayDb":
+                return this.toManyOneWayDb;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "toManyOneWayDb":
+                this.toManyOneWayDb = 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(toManyOneWayDb);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        toManyOneWayDb = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable4.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable4.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable4.java
index 1f0ca75..388cbdf 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable4.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable4.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.oneway.auto;
 
-import org.apache.cayenne.CayenneDataObject;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
 
 /**
  * Class _OnewayTable4 was generated by Cayenne.
@@ -8,11 +12,55 @@ import org.apache.cayenne.CayenneDataObject;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _OnewayTable4 extends CayenneDataObject {
+public abstract class _OnewayTable4 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
     public static final String ID_PK_COLUMN = "ID";
 
 
+
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
index 66edc80..2150ddb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.primitive.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _PrimitivesTestEntity extends CayenneDataObject {
+public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,20 +22,84 @@ public abstract class _PrimitivesTestEntity extends CayenneDataObject {
     public static final Property<Boolean> BOOLEAN_COLUMN = Property.create("booleanColumn", Boolean.class);
     public static final Property<Integer> INT_COLUMN = Property.create("intColumn", Integer.class);
 
+    protected boolean booleanColumn;
+    protected int intColumn;
+
+
     public void setBooleanColumn(boolean booleanColumn) {
-        writeProperty("booleanColumn", booleanColumn);
+        beforePropertyWrite("booleanColumn", this.booleanColumn, booleanColumn);
+        this.booleanColumn = booleanColumn;
     }
+
 	public boolean isBooleanColumn() {
-        Boolean value = (Boolean)readProperty("booleanColumn");
-        return (value != null) ? value.booleanValue() : false;
+        beforePropertyRead("booleanColumn");
+        return booleanColumn;
     }
 
     public void setIntColumn(int intColumn) {
-        writeProperty("intColumn", intColumn);
+        beforePropertyWrite("intColumn", this.intColumn, intColumn);
+        this.intColumn = intColumn;
     }
+
     public int getIntColumn() {
-        Object value = readProperty("intColumn");
-        return (value != null) ? (Integer) value : 0;
+        beforePropertyRead("intColumn");
+        return intColumn;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "booleanColumn":
+                return this.booleanColumn;
+            case "intColumn":
+                return this.intColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "booleanColumn":
+                this.booleanColumn = (Boolean)val;
+                break;
+            case "intColumn":
+                this.intColumn = (Integer)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.writeBoolean(booleanColumn);
+        out.writeInt(intColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        booleanColumn = in.readBoolean();
+        intColumn = in.readInt();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
index 89bddae..546921d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/qualified/auto/_Qualified1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.qualified.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.qualified.Qualified2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.qualified.Qualified2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Qualified1 extends CayenneDataObject {
+public abstract class _Qualified1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _Qualified1 extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<Qualified2>> QUALIFIED2S = Property.create("qualified2s", List.class);
 
+    protected Boolean deleted;
+    protected String name;
+
+    protected Object qualified2s;
+
     public void setDeleted(Boolean deleted) {
-        writeProperty("deleted", deleted);
+        beforePropertyWrite("deleted", this.deleted, deleted);
+        this.deleted = deleted;
     }
+
     public Boolean getDeleted() {
-        return (Boolean)readProperty("deleted");
+        beforePropertyRead("deleted");
+        return deleted;
     }
 
     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 addToQualified2s(Qualified2 obj) {
         addToManyTarget("qualified2s", obj, true);
     }
+
     public void removeFromQualified2s(Qualified2 obj) {
         removeToManyTarget("qualified2s", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Qualified2> getQualified2s() {
         return (List<Qualified2>)readProperty("qualified2s");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "deleted":
+                return this.deleted;
+            case "name":
+                return this.name;
+            case "qualified2s":
+                return this.qualified2s;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "deleted":
+                this.deleted = (Boolean)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "qualified2s":
+                this.qualified2s = 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(deleted);
+        out.writeObject(name);
+        out.writeObject(qualified2s);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        deleted = (Boolean)in.readObject();
+        name = (String)in.readObject();
+        qualified2s = in.readObject();
+    }
 
 }


[12/18] cayenne git commit: CAY-2330 Field based data objects singleclass template fix + minor superclass cleanup

Posted by nt...@apache.org.
CAY-2330 Field based data objects
  singleclass template fix + minor superclass cleanup


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/4d315fbf
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/4d315fbf
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/4d315fbf

Branch: refs/heads/master
Commit: 4d315fbf7d08c63baa6997af0888fee689aac37d
Parents: 544aae0
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Jul 5 18:06:11 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Jul 5 18:06:11 2017 +0300

----------------------------------------------------------------------
 .../resources/templates/v4_1/singleclass.vm     | 56 +++++++-------------
 .../main/resources/templates/v4_1/superclass.vm | 16 +++---
 .../cayenne/testdo/testmap/auto/_ArtGroup.java  | 18 +++----
 .../cayenne/testdo/testmap/auto/_Artist.java    | 24 ++++-----
 .../testdo/testmap/auto/_ArtistCallback.java    | 12 ++---
 .../testdo/testmap/auto/_ArtistExhibit.java     |  8 +--
 .../testdo/testmap/auto/_CompoundPainting.java  | 42 +++++++--------
 .../auto/_CompoundPaintingLongNames.java        | 52 +++++++++---------
 .../cayenne/testdo/testmap/auto/_Exhibit.java   | 20 +++----
 .../cayenne/testdo/testmap/auto/_Gallery.java   | 14 ++---
 .../_MeaningfulGeneratedColumnTestEntity.java   | 12 ++---
 .../testdo/testmap/auto/_NullTestEntity.java    |  6 +--
 .../cayenne/testdo/testmap/auto/_Painting.java  | 30 +++++------
 .../cayenne/testdo/testmap/auto/_Painting1.java | 16 +++---
 .../testdo/testmap/auto/_PaintingInfo.java      | 16 +++---
 .../cayenne/testdo/testmap/auto/_ROArtist.java  | 16 +++---
 .../testdo/testmap/auto/_ROPainting.java        | 16 +++---
 .../testmap/auto/_RWCompoundPainting.java       | 18 +++----
 .../testdo/testmap/auto/_SubPainting.java       |  6 +--
 19 files changed, 189 insertions(+), 209 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
index f310717..5c674dc 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -102,10 +102,11 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 ###################
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
-protected $type ${attr.Name};
+    protected $type ${attr.Name};
 #end
+
 #foreach( $rel in ${object.DeclaredRelationships} )
-protected Object ${rel.Name};
+    protected Object ${rel.Name};
 #end
 
 #########################################################
@@ -117,11 +118,7 @@ protected Object ${rel.Name};
 ## setter
 #if ("true" != "${object.isReadOnly()}")
     public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "${attr.Type}", false);
-            objectContext.propertyChanged(this, "${attr.Type}", this.$name, $name);
-        }
-
+        beforePropertyWrite("${attr.Name}", this.$name, $name);
         this.$name = $name;
     }
 
@@ -133,11 +130,8 @@ protected Object ${rel.Name};
 #else
     public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
 #end
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "${attr.Name}", false);
-        }
-
-        return $stringUtils.formatVariableName(${attr.Name});
+        beforePropertyRead("${attr.Name}");
+        return this.$stringUtils.formatVariableName(${attr.Name});
     }
 
 #end
@@ -183,7 +177,6 @@ protected Object ${rel.Name};
 ## Create callback methods ##
 #############################
 #foreach($cbname in ${entityUtils.callbackNames})
-    @Override
     protected void ${cbname}() {
         //TODO: implement ${cbname}
     }
@@ -248,51 +241,38 @@ protected Object ${rel.Name};
         readSerialized(in);
     }
 
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        out.writeInt(persistenceState);
-        out.writeObject(objectId);
-
-        if(persistenceState == PersistenceState.COMMITTED
-                || persistenceState == PersistenceState.HOLLOW) {
-            return;
-        }
-
+    @Override
+    protected void writeState(ObjectOutputStream out) throws IOException {
+        super.writeState(out);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
 #set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 #if($importUtils.isPrimitive($type))
-        out.write${stringUtils.capitalized($type)}($name);
+        out.write${stringUtils.capitalized($type)}(this.$name);
 #else
-        out.writeObject(${name});
+        out.writeObject(this.${name});
 #end
 #end
 #foreach( $rel in ${object.DeclaredRelationships} )
-        out.writeObject(${stringUtils.formatVariableName($rel.Name)});
+        out.writeObject(this.${stringUtils.formatVariableName($rel.Name)});
 #end
     }
 
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        this.persistenceState = in.readInt();
-        this.objectId = (ObjectId) in.readObject();
-
-        if(persistenceState == PersistenceState.COMMITTED
-                || persistenceState == PersistenceState.HOLLOW) {
-            persistenceState = PersistenceState.HOLLOW;
-            return;
-        }
-
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
 #set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 #if($importUtils.isPrimitive($type))
-        $name = in.read${stringUtils.capitalized($type)}();
+        this.$name = in.read${stringUtils.capitalized($type)}();
 #else
-        $name = ($type)in.readObject();
+        this.$name = ($type)in.readObject();
 #end
 #end
 #foreach( $rel in ${object.DeclaredRelationships} )
 #set ( $name = "${stringUtils.formatVariableName($rel.Name)}")
-        $name = in.readObject();
+        this.$name = in.readObject();
 #end
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
index 860e4af..90bdfe2 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -139,7 +139,7 @@ public abstract class ${superClassName} extends ${baseClassName} {
     public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
 #end
         beforePropertyRead("${attr.Name}");
-        return $stringUtils.formatVariableName(${attr.Name});
+        return this.$stringUtils.formatVariableName(${attr.Name});
     }
 
 #end
@@ -185,7 +185,7 @@ public abstract class ${superClassName} extends ${baseClassName} {
 ## Create callback methods ##
 #############################
 #foreach($cbname in ${entityUtils.callbackNames})
-protected abstract void ${cbname}();
+    protected abstract void ${cbname}();
 
 #end
 ###########################################################
@@ -261,13 +261,13 @@ protected abstract void ${cbname}();
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
 #set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 #if($importUtils.isPrimitive($type))
-        out.write${stringUtils.capitalized($type)}($name);
+        out.write${stringUtils.capitalized($type)}(this.$name);
 #else
-        out.writeObject(${name});
+        out.writeObject(this.${name});
 #end
 #end
 #foreach( $rel in ${object.DeclaredRelationships} )
-        out.writeObject(${stringUtils.formatVariableName($rel.Name)});
+        out.writeObject(this.${stringUtils.formatVariableName($rel.Name)});
 #end
     }
 
@@ -278,14 +278,14 @@ protected abstract void ${cbname}();
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
 #set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 #if($importUtils.isPrimitive($type))
-        $name = in.read${stringUtils.capitalized($type)}();
+        this.$name = in.read${stringUtils.capitalized($type)}();
 #else
-        $name = ($type)in.readObject();
+        this.$name = ($type)in.readObject();
 #end
 #end
 #foreach( $rel in ${object.DeclaredRelationships} )
 #set ( $name = "${stringUtils.formatVariableName($rel.Name)}")
-        $name = in.readObject();
+        this.$name = in.readObject();
 #end
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
index 7d5ab3a..a7d48bd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtGroup.java
@@ -40,7 +40,7 @@ public abstract class _ArtGroup extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToArtistArray(Artist obj) {
@@ -132,19 +132,19 @@ public abstract class _ArtGroup extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(artistArray);
-        out.writeObject(childGroupsArray);
-        out.writeObject(toParentGroup);
+        out.writeObject(this.name);
+        out.writeObject(this.artistArray);
+        out.writeObject(this.childGroupsArray);
+        out.writeObject(this.toParentGroup);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        artistArray = in.readObject();
-        childGroupsArray = in.readObject();
-        toParentGroup = in.readObject();
+        this.name = (String)in.readObject();
+        this.artistArray = in.readObject();
+        this.childGroupsArray = in.readObject();
+        this.toParentGroup = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
index e14eaf5..26578d0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
@@ -44,7 +44,7 @@ public abstract class _Artist extends BaseDataObject {
 
     public String getArtistName() {
         beforePropertyRead("artistName");
-        return artistName;
+        return this.artistName;
     }
 
     public void setDateOfBirth(Date dateOfBirth) {
@@ -54,7 +54,7 @@ public abstract class _Artist extends BaseDataObject {
 
     public Date getDateOfBirth() {
         beforePropertyRead("dateOfBirth");
-        return dateOfBirth;
+        return this.dateOfBirth;
     }
 
     public void addToArtistExhibitArray(ArtistExhibit obj) {
@@ -156,21 +156,21 @@ public abstract class _Artist extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(artistName);
-        out.writeObject(dateOfBirth);
-        out.writeObject(artistExhibitArray);
-        out.writeObject(groupArray);
-        out.writeObject(paintingArray);
+        out.writeObject(this.artistName);
+        out.writeObject(this.dateOfBirth);
+        out.writeObject(this.artistExhibitArray);
+        out.writeObject(this.groupArray);
+        out.writeObject(this.paintingArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        artistName = (String)in.readObject();
-        dateOfBirth = (Date)in.readObject();
-        artistExhibitArray = in.readObject();
-        groupArray = in.readObject();
-        paintingArray = in.readObject();
+        this.artistName = (String)in.readObject();
+        this.dateOfBirth = (Date)in.readObject();
+        this.artistExhibitArray = in.readObject();
+        this.groupArray = in.readObject();
+        this.paintingArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
index c050e37..479af42 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistCallback.java
@@ -34,7 +34,7 @@ public abstract class _ArtistCallback extends BaseDataObject {
 
     public String getArtistName() {
         beforePropertyRead("artistName");
-        return artistName;
+        return this.artistName;
     }
 
     public void setDateOfBirth(Date dateOfBirth) {
@@ -44,7 +44,7 @@ public abstract class _ArtistCallback extends BaseDataObject {
 
     public Date getDateOfBirth() {
         beforePropertyRead("dateOfBirth");
-        return dateOfBirth;
+        return this.dateOfBirth;
     }
 
 protected abstract void prePersistEntityObjEntity();
@@ -106,15 +106,15 @@ protected abstract void postLoadEntityObjEntity();
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(artistName);
-        out.writeObject(dateOfBirth);
+        out.writeObject(this.artistName);
+        out.writeObject(this.dateOfBirth);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        artistName = (String)in.readObject();
-        dateOfBirth = (Date)in.readObject();
+        this.artistName = (String)in.readObject();
+        this.dateOfBirth = (Date)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
index 6e5be90..9cafea0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ArtistExhibit.java
@@ -90,15 +90,15 @@ public abstract class _ArtistExhibit extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toArtist);
-        out.writeObject(toExhibit);
+        out.writeObject(this.toArtist);
+        out.writeObject(this.toExhibit);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toArtist = in.readObject();
-        toExhibit = in.readObject();
+        this.toArtist = in.readObject();
+        this.toExhibit = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
index ddf4c00..aeba15d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPainting.java
@@ -49,7 +49,7 @@ public abstract class _CompoundPainting extends BaseDataObject {
 
     public String getArtistName() {
         beforePropertyRead("artistName");
-        return artistName;
+        return this.artistName;
     }
 
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
@@ -59,7 +59,7 @@ public abstract class _CompoundPainting extends BaseDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public void setGalleryName(String galleryName) {
@@ -69,7 +69,7 @@ public abstract class _CompoundPainting extends BaseDataObject {
 
     public String getGalleryName() {
         beforePropertyRead("galleryName");
-        return galleryName;
+        return this.galleryName;
     }
 
     public void setPaintingTitle(String paintingTitle) {
@@ -79,7 +79,7 @@ public abstract class _CompoundPainting extends BaseDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public void setTextReview(String textReview) {
@@ -89,7 +89,7 @@ public abstract class _CompoundPainting extends BaseDataObject {
 
     public String getTextReview() {
         beforePropertyRead("textReview");
-        return textReview;
+        return this.textReview;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -191,27 +191,27 @@ public abstract class _CompoundPainting extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(artistName);
-        out.writeObject(estimatedPrice);
-        out.writeObject(galleryName);
-        out.writeObject(paintingTitle);
-        out.writeObject(textReview);
-        out.writeObject(toArtist);
-        out.writeObject(toGallery);
-        out.writeObject(toPaintingInfo);
+        out.writeObject(this.artistName);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.galleryName);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.textReview);
+        out.writeObject(this.toArtist);
+        out.writeObject(this.toGallery);
+        out.writeObject(this.toPaintingInfo);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        artistName = (String)in.readObject();
-        estimatedPrice = (BigDecimal)in.readObject();
-        galleryName = (String)in.readObject();
-        paintingTitle = (String)in.readObject();
-        textReview = (String)in.readObject();
-        toArtist = in.readObject();
-        toGallery = in.readObject();
-        toPaintingInfo = in.readObject();
+        this.artistName = (String)in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.galleryName = (String)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.textReview = (String)in.readObject();
+        this.toArtist = in.readObject();
+        this.toGallery = in.readObject();
+        this.toPaintingInfo = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
index fd372f1..347f274 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_CompoundPaintingLongNames.java
@@ -54,7 +54,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public String getArtistLongName() {
         beforePropertyRead("artistLongName");
-        return artistLongName;
+        return this.artistLongName;
     }
 
     public void setEstimatedPrice(BigDecimal estimatedPrice) {
@@ -64,7 +64,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public void setGalleryLongName(String galleryLongName) {
@@ -74,7 +74,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public String getGalleryLongName() {
         beforePropertyRead("galleryLongName");
-        return galleryLongName;
+        return this.galleryLongName;
     }
 
     public void setPaintingDescription(String paintingDescription) {
@@ -84,7 +84,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public String getPaintingDescription() {
         beforePropertyRead("paintingDescription");
-        return paintingDescription;
+        return this.paintingDescription;
     }
 
     public void setPaintingTitle(String paintingTitle) {
@@ -94,7 +94,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public void setTextLongReview(String textLongReview) {
@@ -104,7 +104,7 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
 
     public String getTextLongReview() {
         beforePropertyRead("textLongReview");
-        return textLongReview;
+        return this.textLongReview;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -224,31 +224,31 @@ public abstract class _CompoundPaintingLongNames extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(artistLongName);
-        out.writeObject(estimatedPrice);
-        out.writeObject(galleryLongName);
-        out.writeObject(paintingDescription);
-        out.writeObject(paintingTitle);
-        out.writeObject(textLongReview);
-        out.writeObject(toArtist);
-        out.writeObject(toArtist1);
-        out.writeObject(toGallery);
-        out.writeObject(toPaintingInfo);
+        out.writeObject(this.artistLongName);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.galleryLongName);
+        out.writeObject(this.paintingDescription);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.textLongReview);
+        out.writeObject(this.toArtist);
+        out.writeObject(this.toArtist1);
+        out.writeObject(this.toGallery);
+        out.writeObject(this.toPaintingInfo);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        artistLongName = (String)in.readObject();
-        estimatedPrice = (BigDecimal)in.readObject();
-        galleryLongName = (String)in.readObject();
-        paintingDescription = (String)in.readObject();
-        paintingTitle = (String)in.readObject();
-        textLongReview = (String)in.readObject();
-        toArtist = in.readObject();
-        toArtist1 = in.readObject();
-        toGallery = in.readObject();
-        toPaintingInfo = in.readObject();
+        this.artistLongName = (String)in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.galleryLongName = (String)in.readObject();
+        this.paintingDescription = (String)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.textLongReview = (String)in.readObject();
+        this.toArtist = in.readObject();
+        this.toArtist1 = in.readObject();
+        this.toGallery = in.readObject();
+        this.toPaintingInfo = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
index e77fc16..c30d628 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Exhibit.java
@@ -41,7 +41,7 @@ public abstract class _Exhibit extends BaseDataObject {
 
     public Date getClosingDate() {
         beforePropertyRead("closingDate");
-        return closingDate;
+        return this.closingDate;
     }
 
     public void setOpeningDate(Date openingDate) {
@@ -51,7 +51,7 @@ public abstract class _Exhibit extends BaseDataObject {
 
     public Date getOpeningDate() {
         beforePropertyRead("openingDate");
-        return openingDate;
+        return this.openingDate;
     }
 
     public void addToArtistExhibitArray(ArtistExhibit obj) {
@@ -130,19 +130,19 @@ public abstract class _Exhibit extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(closingDate);
-        out.writeObject(openingDate);
-        out.writeObject(artistExhibitArray);
-        out.writeObject(toGallery);
+        out.writeObject(this.closingDate);
+        out.writeObject(this.openingDate);
+        out.writeObject(this.artistExhibitArray);
+        out.writeObject(this.toGallery);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        closingDate = (Date)in.readObject();
-        openingDate = (Date)in.readObject();
-        artistExhibitArray = in.readObject();
-        toGallery = in.readObject();
+        this.closingDate = (Date)in.readObject();
+        this.openingDate = (Date)in.readObject();
+        this.artistExhibitArray = in.readObject();
+        this.toGallery = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
index f462a9b..917be12 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Gallery.java
@@ -38,7 +38,7 @@ public abstract class _Gallery extends BaseDataObject {
 
     public String getGalleryName() {
         beforePropertyRead("galleryName");
-        return galleryName;
+        return this.galleryName;
     }
 
     public void addToExhibitArray(Exhibit obj) {
@@ -117,17 +117,17 @@ public abstract class _Gallery extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(galleryName);
-        out.writeObject(exhibitArray);
-        out.writeObject(paintingArray);
+        out.writeObject(this.galleryName);
+        out.writeObject(this.exhibitArray);
+        out.writeObject(this.paintingArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        galleryName = (String)in.readObject();
-        exhibitArray = in.readObject();
-        paintingArray = in.readObject();
+        this.galleryName = (String)in.readObject();
+        this.exhibitArray = in.readObject();
+        this.paintingArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
index 274a141..0485a68 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_MeaningfulGeneratedColumnTestEntity.java
@@ -33,7 +33,7 @@ public abstract class _MeaningfulGeneratedColumnTestEntity extends BaseDataObjec
 
     public Integer getGeneratedColumn() {
         beforePropertyRead("generatedColumn");
-        return generatedColumn;
+        return this.generatedColumn;
     }
 
     public void setName(String name) {
@@ -43,7 +43,7 @@ public abstract class _MeaningfulGeneratedColumnTestEntity extends BaseDataObjec
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _MeaningfulGeneratedColumnTestEntity extends BaseDataObjec
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(generatedColumn);
-        out.writeObject(name);
+        out.writeObject(this.generatedColumn);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        generatedColumn = (Integer)in.readObject();
-        name = (String)in.readObject();
+        this.generatedColumn = (Integer)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
index 9f84715..1fb3363 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_NullTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _NullTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _NullTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
index b44e76c..613e239 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting.java
@@ -45,7 +45,7 @@ public abstract class _Painting extends ArtDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public void setPaintingDescription(String paintingDescription) {
@@ -55,7 +55,7 @@ public abstract class _Painting extends ArtDataObject {
 
     public String getPaintingDescription() {
         beforePropertyRead("paintingDescription");
-        return paintingDescription;
+        return this.paintingDescription;
     }
 
     public void setPaintingTitle(String paintingTitle) {
@@ -65,7 +65,7 @@ public abstract class _Painting extends ArtDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -157,23 +157,23 @@ public abstract class _Painting extends ArtDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(estimatedPrice);
-        out.writeObject(paintingDescription);
-        out.writeObject(paintingTitle);
-        out.writeObject(toArtist);
-        out.writeObject(toGallery);
-        out.writeObject(toPaintingInfo);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.paintingDescription);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.toArtist);
+        out.writeObject(this.toGallery);
+        out.writeObject(this.toPaintingInfo);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        estimatedPrice = (BigDecimal)in.readObject();
-        paintingDescription = (String)in.readObject();
-        paintingTitle = (String)in.readObject();
-        toArtist = in.readObject();
-        toGallery = in.readObject();
-        toPaintingInfo = in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.paintingDescription = (String)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.toArtist = in.readObject();
+        this.toGallery = in.readObject();
+        this.toPaintingInfo = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
index baa0ad9..626992f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Painting1.java
@@ -37,7 +37,7 @@ public abstract class _Painting1 extends BaseDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public void setPaintingTitle(String paintingTitle) {
@@ -47,7 +47,7 @@ public abstract class _Painting1 extends BaseDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public void setToArtist(Artist toArtist) {
@@ -108,17 +108,17 @@ public abstract class _Painting1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(estimatedPrice);
-        out.writeObject(paintingTitle);
-        out.writeObject(toArtist);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.toArtist);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        estimatedPrice = (BigDecimal)in.readObject();
-        paintingTitle = (String)in.readObject();
-        toArtist = in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.toArtist = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
index 4fe1805..e565d38 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_PaintingInfo.java
@@ -36,7 +36,7 @@ public abstract class _PaintingInfo extends BaseDataObject {
 
     public byte[] getImageBlob() {
         beforePropertyRead("imageBlob");
-        return imageBlob;
+        return this.imageBlob;
     }
 
     public void setTextReview(String textReview) {
@@ -46,7 +46,7 @@ public abstract class _PaintingInfo extends BaseDataObject {
 
     public String getTextReview() {
         beforePropertyRead("textReview");
-        return textReview;
+        return this.textReview;
     }
 
     public void setPainting(Painting painting) {
@@ -107,17 +107,17 @@ public abstract class _PaintingInfo extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(imageBlob);
-        out.writeObject(textReview);
-        out.writeObject(painting);
+        out.writeObject(this.imageBlob);
+        out.writeObject(this.textReview);
+        out.writeObject(this.painting);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        imageBlob = (byte[])in.readObject();
-        textReview = (String)in.readObject();
-        painting = in.readObject();
+        this.imageBlob = (byte[])in.readObject();
+        this.textReview = (String)in.readObject();
+        this.painting = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
index d4640fe..732e254 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROArtist.java
@@ -33,12 +33,12 @@ public abstract class _ROArtist extends BaseDataObject {
 
     public String getArtistName() {
         beforePropertyRead("artistName");
-        return artistName;
+        return this.artistName;
     }
 
     public Date getDateOfBirth() {
         beforePropertyRead("dateOfBirth");
-        return dateOfBirth;
+        return this.dateOfBirth;
     }
 
     public void addToPaintingArray(Painting obj) {
@@ -104,17 +104,17 @@ public abstract class _ROArtist extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(artistName);
-        out.writeObject(dateOfBirth);
-        out.writeObject(paintingArray);
+        out.writeObject(this.artistName);
+        out.writeObject(this.dateOfBirth);
+        out.writeObject(this.paintingArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        artistName = (String)in.readObject();
-        dateOfBirth = (Date)in.readObject();
-        paintingArray = in.readObject();
+        this.artistName = (String)in.readObject();
+        this.dateOfBirth = (Date)in.readObject();
+        this.paintingArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
index 84a95e7..85b444c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_ROPainting.java
@@ -32,12 +32,12 @@ public abstract class _ROPainting extends BaseDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public Artist getToArtist() {
@@ -94,17 +94,17 @@ public abstract class _ROPainting extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(estimatedPrice);
-        out.writeObject(paintingTitle);
-        out.writeObject(toArtist);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.toArtist);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        estimatedPrice = (BigDecimal)in.readObject();
-        paintingTitle = (String)in.readObject();
-        toArtist = in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.toArtist = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
index 2a01c13..c4bfe1e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_RWCompoundPainting.java
@@ -36,7 +36,7 @@ public abstract class _RWCompoundPainting extends BaseDataObject {
 
     public BigDecimal getEstimatedPrice() {
         beforePropertyRead("estimatedPrice");
-        return estimatedPrice;
+        return this.estimatedPrice;
     }
 
     public void setPaintingTitle(String paintingTitle) {
@@ -46,7 +46,7 @@ public abstract class _RWCompoundPainting extends BaseDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     public void setTextReview(String textReview) {
@@ -56,7 +56,7 @@ public abstract class _RWCompoundPainting extends BaseDataObject {
 
     public String getTextReview() {
         beforePropertyRead("textReview");
-        return textReview;
+        return this.textReview;
     }
 
     @Override
@@ -109,17 +109,17 @@ public abstract class _RWCompoundPainting extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(estimatedPrice);
-        out.writeObject(paintingTitle);
-        out.writeObject(textReview);
+        out.writeObject(this.estimatedPrice);
+        out.writeObject(this.paintingTitle);
+        out.writeObject(this.textReview);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        estimatedPrice = (BigDecimal)in.readObject();
-        paintingTitle = (String)in.readObject();
-        textReview = (String)in.readObject();
+        this.estimatedPrice = (BigDecimal)in.readObject();
+        this.paintingTitle = (String)in.readObject();
+        this.textReview = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d315fbf/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
index 44f0d97..db4c4dd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_SubPainting.java
@@ -31,7 +31,7 @@ public abstract class _SubPainting extends BaseDataObject {
 
     public String getPaintingTitle() {
         beforePropertyRead("paintingTitle");
-        return paintingTitle;
+        return this.paintingTitle;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _SubPainting extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(paintingTitle);
+        out.writeObject(this.paintingTitle);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        paintingTitle = (String)in.readObject();
+        this.paintingTitle = (String)in.readObject();
     }
 
 }


[11/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
CAY-2330 Field based data objects


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/544aae08
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/544aae08
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/544aae08

Branch: refs/heads/master
Commit: 544aae0866e8fb1712f07f00794ea3263a4c95b5
Parents: f7ef3e4
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Jul 5 16:08:04 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Jul 5 16:08:04 2017 +0300

----------------------------------------------------------------------
 ...eGeneratorTaskCrossMapRelationshipsTest.java |   2 +-
 .../cayenne/tools/CayenneGeneratorTaskTest.java |  12 +-
 .../cayenne/gen/ClassGenerationAction.java      |   2 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |   4 +-
 .../org/apache/cayenne/gen/ImportUtils.java     |   9 +
 .../v4_1/client-datamap-singleclass.vm          |  98 +++
 .../templates/v4_1/client-datamap-subclass.vm   |  47 ++
 .../templates/v4_1/client-datamap-superclass.vm |  87 +++
 .../resources/templates/v4_1/client-subclass.vm |  57 ++
 .../templates/v4_1/client-superclass.vm         | 248 +++++++
 .../templates/v4_1/datamap-singleclass.vm       | 100 +++
 .../templates/v4_1/datamap-subclass.vm          |  47 ++
 .../templates/v4_1/datamap-superclass.vm        |  91 +++
 .../templates/v4_1/embeddable-singleclass.vm    | 106 +++
 .../templates/v4_1/embeddable-subclass.vm       |  45 ++
 .../templates/v4_1/embeddable-superclass.vm     | 112 +++
 .../resources/templates/v4_1/singleclass.vm     | 298 ++++++++
 .../main/resources/templates/v4_1/subclass.vm   |  47 ++
 .../main/resources/templates/v4_1/superclass.vm | 292 ++++++++
 .../cayenne/gen/ClassGenerationActionTest.java  |  16 +-
 .../cayenne/CayenneContextPrimitiveIT.java      |  29 +
 .../apache/cayenne/crypto/db/auto/_Table1.java  | 114 ++-
 .../apache/cayenne/crypto/db/auto/_Table2.java  |  82 ++-
 .../apache/cayenne/crypto/db/auto/_Table3.java  |  67 +-
 .../apache/cayenne/crypto/db/auto/_Table4.java  |  83 ++-
 .../apache/cayenne/crypto/db/auto/_Table5.java  | 100 ++-
 .../apache/cayenne/crypto/db/auto/_Table6.java  |  84 ++-
 .../java8/db/auto/_LocalDateTestEntity.java     |  66 +-
 .../java8/db/auto/_LocalDateTimeTestEntity.java |  66 +-
 .../java8/db/auto/_LocalTimeTestEntity.java     |  66 +-
 .../java/org/apache/cayenne/BaseDataObject.java | 722 +++++++++++++++++++
 .../org/apache/cayenne/CayenneDataObject.java   | 664 +----------------
 .../cayenne/access/DataContextExtrasIT.java     |  25 +-
 .../access/DataContextPrefetchExtrasIT.java     |  10 +-
 .../array_type/auto/_ArrayTestEntity.java       |  67 +-
 .../testdo/binary_pk/auto/_BinaryPKTest1.java   |  75 +-
 .../testdo/binary_pk/auto/_BinaryPKTest2.java   |  74 +-
 .../cayenne/testdo/cay_2032/auto/_Team.java     |  60 +-
 .../cayenne/testdo/cay_2032/auto/_User.java     |  75 +-
 .../testdo/compound/auto/_CharFkTestEntity.java |  74 +-
 .../testdo/compound/auto/_CharPkTestEntity.java |  90 ++-
 .../compound/auto/_CompoundFkTestEntity.java    |  74 +-
 .../compound/auto/_CompoundPkTestEntity.java    | 105 ++-
 .../testdo/date_time/auto/_CalendarEntity.java  |  66 +-
 .../testdo/date_time/auto/_DateTestEntity.java  |  96 ++-
 .../cayenne/testdo/db1/auto/_CrossdbM1E1.java   |  86 ++-
 .../cayenne/testdo/db2/auto/_CrossdbM2E1.java   |  75 +-
 .../cayenne/testdo/db2/auto/_CrossdbM2E2.java   |  83 ++-
 .../testdo/deleterules/auto/_DeleteCascade.java |  74 +-
 .../testdo/deleterules/auto/_DeleteDeny.java    |  74 +-
 .../testdo/deleterules/auto/_DeleteNullify.java |  74 +-
 .../testdo/deleterules/auto/_DeleteRule.java    |  97 ++-
 .../testdo/embeddable/auto/_EmbedEntity1.java   |  97 ++-
 .../testdo/enum_test/auto/_EnumEntity.java      |  67 +-
 .../extended_type/auto/_ExtendedTypeEntity.java |  67 +-
 .../generated/auto/_GeneratedColumnCompKey.java |  74 +-
 .../auto/_GeneratedColumnCompMaster.java        |  75 +-
 .../generated/auto/_GeneratedColumnDep.java     |  74 +-
 .../generated/auto/_GeneratedColumnTest2.java   |  67 +-
 .../auto/_GeneratedColumnTestEntity.java        |  74 +-
 .../testdo/generated/auto/_GeneratedF1.java     |  56 ++
 .../testdo/generated/auto/_GeneratedF2.java     |  56 ++
 .../testdo/inheritance/auto/_BaseEntity.java    |  83 ++-
 .../inheritance/auto/_DirectToSubEntity.java    |  60 +-
 .../testdo/inheritance/auto/_RelatedEntity.java |  71 +-
 .../testdo/inheritance/auto/_SubEntity.java     |  48 ++
 .../testdo/inheritance_flat/auto/_Group.java    |  65 +-
 .../inheritance_flat/auto/_GroupProperties.java |  89 ++-
 .../testdo/inheritance_flat/auto/_Role.java     | 111 ++-
 .../testdo/inheritance_flat/auto/_User.java     |  55 ++
 .../inheritance_flat/auto/_UserProperties.java  |  89 ++-
 .../auto/_AbstractPerson.java                   |  90 ++-
 .../inheritance_people/auto/_Address.java       |  74 +-
 .../inheritance_people/auto/_ClientCompany.java |  75 +-
 .../auto/_CustomerRepresentative.java           |  70 +-
 .../inheritance_people/auto/_Department.java    |  84 ++-
 .../inheritance_people/auto/_Employee.java      |  80 +-
 .../inheritance_people/auto/_Manager.java       |  56 ++
 .../inheritance_people/auto/_PersonNotes.java   |  74 +-
 .../inheritance_vertical/auto/_Iv1Root.java     |  82 ++-
 .../inheritance_vertical/auto/_Iv1Sub1.java     |  63 +-
 .../inheritance_vertical/auto/_Iv2Root.java     |  67 +-
 .../inheritance_vertical/auto/_Iv2Sub1.java     |  55 ++
 .../testdo/inheritance_vertical/auto/_Iv2X.java |  52 +-
 .../inheritance_vertical/auto/_IvAbstract.java  |  67 +-
 .../inheritance_vertical/auto/_IvBase.java      |  82 ++-
 .../auto/_IvBaseWithLock.java                   | 103 ++-
 .../inheritance_vertical/auto/_IvConcrete.java  |  80 +-
 .../inheritance_vertical/auto/_IvImpl.java      |  94 ++-
 .../auto/_IvImplWithLock.java                   |  95 ++-
 .../inheritance_vertical/auto/_IvOther.java     |  97 ++-
 .../inheritance_vertical/auto/_IvRoot.java      |  82 ++-
 .../inheritance_vertical/auto/_IvSub1.java      |  63 +-
 .../inheritance_vertical/auto/_IvSub1Sub1.java  |  63 +-
 .../inheritance_vertical/auto/_IvSub2.java      |  78 +-
 .../inheritance_vertical/auto/_IvSub3.java      |  56 +-
 .../auto/_Lifecycle.java                        |  67 +-
 .../testdo/lifecycles/auto/_Lifecycles.java     |  67 +-
 .../testdo/lob/auto/_BlobTestEntity.java        |  67 +-
 .../testdo/lob/auto/_ClobTestEntity.java        |  75 +-
 .../testdo/lob/auto/_ClobTestRelation.java      |  89 ++-
 .../testdo/lob/auto/_NClobTestEntity.java       |  67 +-
 .../testdo/locking/auto/_LockingHelper.java     |  74 +-
 .../locking/auto/_RelLockingTestEntity.java     |  84 ++-
 .../locking/auto/_SimpleLockingTestEntity.java  |  82 ++-
 .../testdo/map_to_many/auto/_IdMapToMany.java   |  60 +-
 .../map_to_many/auto/_IdMapToManyTarget.java    |  59 +-
 .../testdo/map_to_many/auto/_MapToMany.java     |  60 +-
 .../map_to_many/auto/_MapToManyTarget.java      |  74 +-
 .../meaningful_pk/auto/_MeaningfulPKDep.java    |  74 +-
 .../meaningful_pk/auto/_MeaningfulPKTest1.java  |  90 ++-
 .../meaningful_pk/auto/_MeaningfulPk.java       |  67 +-
 .../testdo/misc_types/auto/_ArraysEntity.java   | 112 ++-
 .../misc_types/auto/_CharacterEntity.java       |  67 +-
 .../misc_types/auto/_SerializableEntity.java    |  67 +-
 .../auto/_MixedPersistenceStrategy.java         |  90 ++-
 .../auto/_MixedPersistenceStrategy2.java        |  74 +-
 .../cayenne/testdo/mt/auto/_MtTable1.java       |  90 ++-
 .../testdo/mt/auto/_MtTable1Subclass1.java      |  63 +-
 .../testdo/mt/auto/_MtTable1Subclass2.java      |  63 +-
 .../cayenne/testdo/mt/auto/_MtTable2.java       |  83 ++-
 .../cayenne/testdo/mt/auto/_MtTable3.java       | 105 ++-
 .../cayenne/testdo/mt/auto/_MtTable4.java       |  60 +-
 .../cayenne/testdo/mt/auto/_MtTable5.java       |  60 +-
 .../testdo/no_pk/auto/_NoPkTestEntity.java      |  67 +-
 .../numeric_types/auto/_BigDecimalEntity.java   |  66 +-
 .../numeric_types/auto/_BigIntegerEntity.java   |  66 +-
 .../auto/_BitNumberTestEntity.java              |  67 +-
 .../numeric_types/auto/_BitTestEntity.java      |  67 +-
 .../numeric_types/auto/_BooleanTestEntity.java  |  67 +-
 .../numeric_types/auto/_DecimalPKTest1.java     |  82 ++-
 .../auto/_DecimalPKTestEntity.java              |  81 ++-
 .../testdo/numeric_types/auto/_LongEntity.java  |  67 +-
 .../numeric_types/auto/_SmallintTestEntity.java |  67 +-
 .../numeric_types/auto/_TinyintTestEntity.java  |  67 +-
 .../testdo/oneway/auto/_OnewayTable1.java       |  52 +-
 .../testdo/oneway/auto/_OnewayTable2.java       |  74 +-
 .../testdo/oneway/auto/_OnewayTable3.java       |  60 +-
 .../testdo/oneway/auto/_OnewayTable4.java       |  52 +-
 .../primitive/auto/_PrimitivesTestEntity.java   |  84 ++-
 .../testdo/qualified/auto/_Qualified1.java      |  90 ++-
 .../testdo/qualified/auto/_Qualified2.java      |  89 ++-
 .../testdo/quotemap/auto/_QuoteAdress.java      |  89 ++-
 .../testdo/quotemap/auto/_Quote_Person.java     | 133 +++-
 .../testdo/reflexive/auto/_Reflexive.java       |  84 ++-
 .../relationships/auto/_FkOfDifferentType.java  |  59 +-
 .../relationships/auto/_MeaningfulFK.java       |  74 +-
 .../relationships/auto/_ReflexiveAndToOne.java  |  93 ++-
 .../relationships/auto/_RelationshipHelper.java |  97 ++-
 .../relationships_activity/auto/_Activity.java  |  91 ++-
 .../auto/_ActivityResult.java                   |  97 ++-
 .../relationships_child_master/auto/_Child.java |  59 +-
 .../auto/_Master.java                           |  75 +-
 .../relationships_clob/auto/_ClobDetail.java    |  74 +-
 .../relationships_clob/auto/_ClobMaster.java    |  90 ++-
 .../auto/_CollectionToMany.java                 |  60 +-
 .../auto/_CollectionToManyTarget.java           |  59 +-
 .../auto/_DeleteRuleFlatA.java                  |  60 +-
 .../auto/_DeleteRuleFlatB.java                  |  60 +-
 .../auto/_DeleteRuleTest1.java                  |  59 +-
 .../auto/_DeleteRuleTest2.java                  |  71 +-
 .../auto/_DeleteRuleTest3.java                  |  59 +-
 .../auto/_FlattenedCircular.java                |  71 +-
 .../auto/_FlattenedTest1.java                   | 115 ++-
 .../auto/_FlattenedTest2.java                   |  84 ++-
 .../auto/_FlattenedTest3.java                   |  94 ++-
 .../auto/_FlattenedTest4.java                   |  74 +-
 .../auto/_FlattenedTest5.java                   |  74 +-
 .../auto/_SetToMany.java                        |  60 +-
 .../auto/_SetToManyTarget.java                  |  59 +-
 .../auto/_ToManyFkDep.java                      |  98 ++-
 .../auto/_ToManyFkRoot.java                     |  90 ++-
 .../auto/_ToManyRoot2.java                      |  75 +-
 .../relationships_to_one_fk/auto/_ToOneFK1.java |  59 +-
 .../relationships_to_one_fk/auto/_ToOneFK2.java |  59 +-
 .../return_types/auto/_ReturnTypesMap1.java     | 347 ++++++++-
 .../return_types/auto/_ReturnTypesMap2.java     | 108 ++-
 .../return_types/auto/_ReturnTypesMapLobs1.java |  78 +-
 .../testdo/soft_delete/auto/_SoftDelete.java    |  84 ++-
 .../table_primitives/auto/_TablePrimitives.java |  84 ++-
 .../cayenne/testdo/testmap/auto/_ArtGroup.java  |  95 ++-
 .../cayenne/testdo/testmap/auto/_Artist.java    | 112 ++-
 .../testdo/testmap/auto/_ArtistCallback.java    |  95 ++-
 .../testdo/testmap/auto/_ArtistExhibit.java     |  68 +-
 .../testdo/testmap/auto/_CompoundPainting.java  | 151 +++-
 .../auto/_CompoundPaintingLongNames.java        | 175 ++++-
 .../cayenne/testdo/testmap/auto/_Exhibit.java   |  99 ++-
 .../cayenne/testdo/testmap/auto/_Gallery.java   |  86 ++-
 .../_MeaningfulGeneratedColumnTestEntity.java   |  82 ++-
 .../testdo/testmap/auto/_NullTestEntity.java    |  67 +-
 .../cayenne/testdo/testmap/auto/_Painting.java  | 117 ++-
 .../cayenne/testdo/testmap/auto/_Painting1.java |  88 ++-
 .../testdo/testmap/auto/_PaintingInfo.java      |  89 ++-
 .../cayenne/testdo/testmap/auto/_ROArtist.java  |  82 ++-
 .../testdo/testmap/auto/_ROPainting.java        |  81 ++-
 .../testmap/auto/_RWCompoundPainting.java       |  96 ++-
 .../testdo/testmap/auto/_SubPainting.java       |  67 +-
 .../apache/cayenne/testdo/things/auto/_Bag.java |  89 ++-
 .../cayenne/testdo/things/auto/_Ball.java       |  94 ++-
 .../apache/cayenne/testdo/things/auto/_Box.java |  98 ++-
 .../cayenne/testdo/things/auto/_BoxInfo.java    |  70 +-
 .../cayenne/testdo/things/auto/_Thing.java      |  93 ++-
 .../cayenne/testdo/toone/auto/_TooneDep.java    |  59 +-
 .../cayenne/testdo/toone/auto/_TooneMaster.java |  59 +-
 .../auto/_Customer.java                         |  75 +-
 .../auto/_Product.java                          |  97 ++-
 .../cayenne/testdo/uuid/auto/_UuidPkEntity.java |  66 +-
 .../testdo/uuid/auto/_UuidTestEntity.java       |  66 +-
 .../testdo/weighted_sort/auto/_SortDep.java     |  59 +-
 .../testdo/weighted_sort/auto/_SortRoot.java    |  60 +-
 .../src/test/resources/testmap.map.xml          |   2 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 docs/doc/src/main/resources/UPGRADE.txt         |   8 +
 .../tools/CayenneGeneratorIntegrationTest.java  |  12 +-
 214 files changed, 16224 insertions(+), 1622 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskCrossMapRelationshipsTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskCrossMapRelationshipsTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskCrossMapRelationshipsTest.java
index 40877b8..4d3783c 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskCrossMapRelationshipsTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskCrossMapRelationshipsTest.java
@@ -92,7 +92,7 @@ public class CayenneGeneratorTaskCrossMapRelationshipsTest {
 
 		File _a = new File(destDir, convertPath("org/apache/cayenne/testdo/cgen2/auto/_MyArtGroup.java"));
 		assertTrue(_a.exists());
-		assertContents(_a, "_MyArtGroup", "org.apache.cayenne.testdo.cgen2.auto", "CayenneDataObject");
+		assertContents(_a, "_MyArtGroup", "org.apache.cayenne.testdo.cgen2.auto", "BaseDataObject");
 		assertContents(_a, "import org.apache.cayenne.testdo.testmap.ArtGroup;");
 		assertContents(_a, " ArtGroup getToParentGroup()");
 		assertContents(_a, "setToParentGroup(ArtGroup toParentGroup)");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskTest.java
index f6f616b..1879cfd 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CayenneGeneratorTaskTest.java
@@ -116,7 +116,7 @@ public class CayenneGeneratorTaskTest {
 		// check results
 		File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
 		assertTrue(a.isFile());
-		assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+		assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
 
 		File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/_Artist.java"));
 		assertFalse(_a.exists());
@@ -141,7 +141,7 @@ public class CayenneGeneratorTaskTest {
 		// check results
 		File a = new File(mapDir, convertPath("Artist.java"));
 		assertTrue(a.exists());
-		assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+		assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
 
 		File _a = new File(mapDir, convertPath("_Artist.java"));
 		assertFalse(_a.exists());
@@ -176,7 +176,7 @@ public class CayenneGeneratorTaskTest {
 
 		File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/auto/_Artist.java"));
 		assertTrue(_a.exists());
-		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
 	}
 
 	/** Test pairs generation in the same directory. */
@@ -202,7 +202,7 @@ public class CayenneGeneratorTaskTest {
 
 		File _a = new File(mapDir, convertPath("_Artist.java"));
 		assertTrue(_a.exists());
-		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
+		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "BaseDataObject");
 
 		File pkga = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
 		assertFalse(pkga.exists());
@@ -235,7 +235,7 @@ public class CayenneGeneratorTaskTest {
 
 		File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/superart/_Artist.java"));
 		assertTrue(_a.exists());
-		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap.superart", "CayenneDataObject");
+		assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap.superart", "BaseDataObject");
 	}
 
 	@Test
@@ -261,7 +261,7 @@ public class CayenneGeneratorTaskTest {
 
 		File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java"));
 		assertTrue(_a.exists());
-		assertContents(_a, "_EmbedEntity1", "org.apache.cayenne.testdo.embeddable.auto", "CayenneDataObject");
+		assertContents(_a, "_EmbedEntity1", "org.apache.cayenne.testdo.embeddable.auto", "BaseDataObject");
 
 		// check embeddable results
 		File e = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/Embeddable1.java"));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index 8d08c52..19e8d83 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -43,7 +43,7 @@ import java.util.Map;
 import java.util.Properties;
 
 public class ClassGenerationAction {
-	static final String TEMPLATES_DIR_NAME = "templates/v1_2/";
+	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
 
 	public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "singleclass.vm";
 	public static final String SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "subclass.vm";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
index 394304f..930b131 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.gen;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.velocity.VelocityContext;
 
@@ -47,7 +47,7 @@ public class EntityArtifact implements Artifact {
     public String getQualifiedBaseClassName() {
         return (entity.getSuperClassName() != null)
                 ? entity.getSuperClassName()
-                : CayenneDataObject.class.getName();
+                : BaseDataObject.class.getName();
     }
 
     public String getQualifiedClassName() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
index af40499..f178b76 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
@@ -194,6 +194,15 @@ public class ImportUtils {
 	}
 
 	/**
+	 * @since 4.1
+	 * @param type name
+	 * @return is given type primitive
+	 */
+	public boolean isPrimitive(String type) {
+		return classesForPrimitives.containsKey(type);
+	}
+
+	/**
 	 * Generate package and list of import statements based on the registered
 	 * types.
 	 */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-singleclass.vm
new file mode 100644
index 0000000..a72fd39
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-singleclass.vm
@@ -0,0 +1,98 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.DataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
+#foreach( $selectQuery in ${object.SelectQueries})
+${importUtils.addType(${selectQuery.Root.ClassName})}
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}
+#end
+#end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
+${importUtils.generate()}
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class ${subClassName} {
+#if( ${object.hasQueryNames()})
+#foreach( $qname in ${object.QueryNames})
+
+    public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+#end
+#end
+
+    private static ${subClassName} instance;
+
+    private ${subClassName}() {}
+
+    public static ${subClassName} getInstance() {
+        if (instance == null) {
+            instance = new ${subClassName}();
+        }
+        return instance;
+    }
+
+#foreach( $selectQuery in ${object.SelectQueries})
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
+
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
+    }
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-subclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-subclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-subclass.vm
new file mode 100644
index 0000000..f5e0474
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-subclass.vm
@@ -0,0 +1,47 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.dataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${superPackageName}.${superClassName}")}##
+${importUtils.generate()}
+
+public class ${subClassName} extends ${superClassName} {
+
+    private static ${subClassName} instance;
+
+    private ${subClassName}() {}
+
+    public static ${subClassName} getInstance() {
+        if(instance == null) {
+            instance = new ${subClassName}();
+        }
+
+        return instance;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-superclass.vm
new file mode 100644
index 0000000..3c63a19
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/client-datamap-superclass.vm
@@ -0,0 +1,87 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.DataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName
+##
+${importUtils.setPackage($superPackageName)}##
+#if(${superPackageName})${importUtils.addReservedType("${superPackageName}.${superClassName}")}#end##
+#if(${basePackageName})${importUtils.addType("${basePackageName}.${baseClassName}")}#end##
+#if( ${object.hasSelectQueries()} )
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
+#foreach( $selectQuery in ${object.SelectQueries})
+${importUtils.addType(${selectQuery.Root.ClientClassName})}##
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
+#end    
+#end
+#end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
+${importUtils.generate()}
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class ${superClassName} {
+#if( ${object.hasQueryNames()})
+#foreach( $qname in ${object.QueryNames})
+
+    public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+#end
+#end
+
+#foreach( $selectQuery in ${object.SelectQueries})
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
+
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
+    }
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/client-subclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/client-subclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/client-subclass.vm
new file mode 100644
index 0000000..d28de85
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/client-subclass.vm
@@ -0,0 +1,57 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##  A default Cayenne template for a client-side subclass in a generated subclass/superclass pair.
+## 
+##  Terminology:
+##  Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##  Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    entityUtils - class for entity "helper" functions: See org.apache.cayenne.gen.EntityUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${$subPackageName}.${subClassName}")}##
+${importUtils.addType("${superPackageName}.${superClassName}")}##
+${importUtils.generate()}
+
+/**
+ * A persistent class mapped as "${object.name}" Cayenne entity.
+ */
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${subClassName} extends ${superClassName} {
+
+     private static final long serialVersionUID = 1L; 
+     
+##callback methods
+#foreach( $cbname in ${entityUtils.callbackNames})
+    @Override
+    protected void ${cbname}() {
+        //TODO: Implement ${cbname}
+    }
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/client-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/client-superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/client-superclass.vm
new file mode 100644
index 0000000..f8c9cbe
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/client-superclass.vm
@@ -0,0 +1,248 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.PersistentObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    entityUtils - class for entity "helper" functions: See org.apache.cayenne.gen.EntityUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName
+##
+##
+${importUtils.setPackage($superPackageName)}##
+${importUtils.addReservedType("${$superPackageName}.${superClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+#if((${object.DeclaredAttributes} && !${object.DeclaredAttributes.isEmpty()}) || (${object.DeclaredRelationships} && !${object.DeclaredRelationships.isEmpty()}))
+${importUtils.addType('org.apache.cayenne.exp.Property')}##
+#end
+#foreach( $attr in ${object.DeclaredAttributes} )
+$importUtils.addType(${attr.Type})##
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+$importUtils.addType(${rel.TargetEntity.ClientClassName})##
+#if(${rel.CollectionType}) 
+$importUtils.addType(${rel.CollectionType})##
+#end
+#end
+#if( ${entityUtils.hasToOneDeclaredRelationships()} )
+${importUtils.addType('org.apache.cayenne.ValueHolder')}##
+${importUtils.addType('org.apache.cayenne.util.PersistentObjectHolder')}##
+#end
+#if( ${entityUtils.hasToManyDeclaredRelationships()} )
+${importUtils.addType('org.apache.cayenne.util.PersistentObjectList')}##
+#end
+${importUtils.generate()}
+
+/**
+ * A generated persistent class mapped as "${object.name}" Cayenne entity. It is a good idea to
+ * avoid changing this class manually, since it will be overwritten next time code is
+ * regenerated. If you need to make any customizations, put them in a subclass.
+ */
+public abstract class ${superClassName} extends ${baseClassName} {
+
+## Create ivars names
+#if( $createPropertyNames )
+#foreach( $attr in ${object.DeclaredAttributes} )
+    public static final String ${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY = "${attr.Name}";
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+    public static final String ${stringUtils.capitalizedAsConstant($rel.Name)}_PROPERTY = "${rel.Name}";
+#end
+
+#end
+## Create Properties
+#foreach( $attr in ${object.DeclaredAttributes} )
+    #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($attr.Name)} = Property.create("${attr.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ${rel.CollectionType} == "java.util.Map")
+    #set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClientClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#else
+    #set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClientClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#else
+    #set( $type = "$importUtils.formatJavaType(${rel.TargetEntity.ClassName})" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#end
+
+## Create ivars
+#foreach( $attr in ${object.DeclaredAttributes} )
+    protected $importUtils.formatJavaType(${attr.Type}) ${attr.Name};
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ${rel.CollectionType} == "java.util.Map")
+    protected $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClientClassName)> ${rel.Name};
+#else
+    protected $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClientClassName)> ${rel.Name};
+#end
+#else
+    protected ValueHolder ${rel.Name};
+#end
+#end
+
+## Create attribute set/get methods
+#foreach( $attr in ${object.DeclaredAttributes} )
+#if ( $importUtils.isBoolean(${attr.Type}) )
+    public boolean is${stringUtils.capitalized($attr.Name)}() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${attr.Name}", false);
+        }
+
+        return ${attr.Name};
+    }
+#else 
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${attr.Name}", false);
+        }
+
+        return ${attr.Name};
+    }
+#end
+#if ("true" != "${object.isReadOnly()}")
+    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $stringUtils.formatVariableName(${attr.Name})) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${attr.Name}", false);
+        }
+
+        Object oldValue = this.${stringUtils.formatVariableName($attr.Name)};
+        // notify objectContext about simple property change
+        if(objectContext != null) {
+            objectContext.propertyChanged(this, "${attr.Name}", oldValue, $stringUtils.formatVariableName(${attr.Name}));
+        }
+        
+        this.${stringUtils.formatVariableName($attr.Name)} = ${stringUtils.formatVariableName($attr.Name)};
+    }
+#end
+
+#end
+##
+##
+## Create list add/remove/get methods
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ${rel.CollectionType} == "java.util.Map")
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClientClassName)> get${stringUtils.capitalized($rel.Name)}() {
+#else
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClientClassName)> get${stringUtils.capitalized($rel.Name)}() {
+#end
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+#if ( ${rel.CollectionType} == "java.util.Map")
+        	throw new RuntimeException("Map relationships cannot be accessed for transient objects");
+#else
+        	this.$rel.Name = new PersistentObjectList(this, "${rel.Name}");
+#end
+		}
+
+        return ${rel.Name};
+    }
+#if ( ! $rel.ReadOnly )
+#if ( ${rel.CollectionType} == "java.util.Map")
+	public void addTo${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClientClassName}) object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	throw new RuntimeException("Map relationships cannot be accessed for transient objects");        
+        }
+
+        this.${rel.Name}.put(getMapKey("${rel.Name}", object), object);
+    }
+    public void removeFrom${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClientClassName}) object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	throw new RuntimeException("Map relationships cannot be accessed for transient objects");        
+        }
+
+        this.${rel.Name}.remove(getMapKey("${rel.Name}", object));
+    }
+#else
+    public void addTo${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClientClassName}) object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	this.$rel.Name = new PersistentObjectList(this, "${rel.Name}");
+		}
+
+        this.${rel.Name}.add(object);
+    }
+    public void removeFrom${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClientClassName}) object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	this.$rel.Name = new PersistentObjectList(this, "${rel.Name}");
+		}
+
+        this.${rel.Name}.remove(object);
+    }
+#end
+#end
+#else
+    public $importUtils.formatJavaType(${rel.TargetEntity.ClientClassName}) get${stringUtils.capitalized($rel.Name)}() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	this.$rel.Name = new PersistentObjectHolder(this, "$rel.Name");
+		}
+
+        return ($importUtils.formatJavaType(${rel.TargetEntity.ClientClassName})) ${rel.Name}.getValue();
+    }
+#if ( !${object.isReadOnly()} && !$rel.ReadOnly )
+    public void set${stringUtils.capitalized($rel.Name)}(${importUtils.formatJavaType($rel.TargetEntity.ClientClassName)} $stringUtils.formatVariableName(${rel.Name})) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${rel.Name}", true);
+        } else if (this.$rel.Name == null) {
+        	this.$rel.Name = new PersistentObjectHolder(this, "$rel.Name");
+		}
+
+        // note how we notify ObjectContext of change BEFORE the object is actually
+        // changed... this is needed to take a valid current snapshot
+        Object oldValue = this.${rel.Name}.getValueDirectly();
+        if (objectContext != null) {
+        	objectContext.propertyChanged(this, "$rel.Name", oldValue, $stringUtils.formatVariableName(${rel.Name}));
+        }
+        
+        this.${stringUtils.formatVariableName($rel.Name)}.setValue(${stringUtils.formatVariableName($rel.Name)});
+    }
+#end
+#end
+
+#end
+##callback methods
+#foreach( $cbname in ${entityUtils.callbackNames})
+    protected abstract void ${cbname}();
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-singleclass.vm
new file mode 100644
index 0000000..52fcf17
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-singleclass.vm
@@ -0,0 +1,100 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.DataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
+#foreach( $selectQuery in ${object.SelectQueries})
+${importUtils.addType(${selectQuery.Root.ClassName})}##
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
+${importUtils.generate()}
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class ${subClassName} {
+#if( ${object.hasQueryNames()})
+#foreach( $qname in ${object.QueryNames})
+
+    public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+#end
+#end
+
+    private static ${subClassName} instance;
+
+    private ${subClassName}() {}
+
+    public static ${subClassName} getInstance() {
+        if( instance == null) {
+            instance = new ${subClassName}();
+        }
+        return instance;
+    }
+
+#foreach( $selectQuery in ${object.SelectQueries})
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
+    #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
+
+#end
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
+    }
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/datamap-subclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/datamap-subclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-subclass.vm
new file mode 100644
index 0000000..f5e0474
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-subclass.vm
@@ -0,0 +1,47 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.dataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${superPackageName}.${superClassName}")}##
+${importUtils.generate()}
+
+public class ${subClassName} extends ${superClassName} {
+
+    private static ${subClassName} instance;
+
+    private ${subClassName}() {}
+
+    public static ${subClassName} getInstance() {
+        if(instance == null) {
+            instance = new ${subClassName}();
+        }
+
+        return instance;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-superclass.vm
new file mode 100644
index 0000000..bea1a56
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/datamap-superclass.vm
@@ -0,0 +1,91 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    dataMapUtils - class for query "helper" functions: See org.apache.cayenne.gen.DataMapUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName
+##
+${importUtils.setPackage($superPackageName)}##
+#if(${superPackageName})${importUtils.addReservedType("${superPackageName}.${superClassName}")}#end##
+#if(${basePackageName})${importUtils.addType("${basePackageName}.${baseClassName}")}#end##
+#if( ${object.hasSelectQueries()} )
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
+#foreach( $selectQuery in ${object.SelectQueries})
+${importUtils.addType(${selectQuery.Root.ClassName})}##
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
+#end##
+#end##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
+${importUtils.generate()}
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class ${superClassName} {
+#if( ${object.hasQueryNames()})
+#foreach( $qname in ${object.queryNames})
+
+    public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+#end
+#end
+#foreach( $selectQuery in ${object.SelectQueries})
+
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
+    #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
+
+#end
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
+    }
+
+#end
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-singleclass.vm
new file mode 100644
index 0000000..a30dcec
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-singleclass.vm
@@ -0,0 +1,106 @@
+##  Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##  Terminology:
+## 
+##	Base class - super superclass of embeddable, usually java.lang.Object
+##  Super class - superclass of embeddable, ie,  org.apache.cayenne.art.auto._Embeddable
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Embeddable
+##
+##  Keys of objects available in template are defined in 'org.apache.cayenne.gen.Artifact', namely:
+## 
+##    object - the Embeddable class: See org.apache.cayenne.map.Embeddable
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType("org.apache.cayenne.Persistent")}##
+#if(${object.Attributes} && !${object.Attributes.isEmpty()})
+${importUtils.addType('org.apache.cayenne.exp.Property')}##
+#end
+#foreach( $attr in ${object.Attributes} )
+$importUtils.addType(${attr.Type})##
+#end
+${importUtils.generate()}
+
+public abstract class ${subClassName} extends ${baseClassName} {
+
+## Create property names
+#if( $createPropertyNames )
+#foreach( $attr in ${object.Attributes} )
+    public static final String ${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY = "${attr.Name}";
+#end
+
+#end
+## Create Properties
+#foreach( $attr in ${object.Attributes} )
+    #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($attr.Name)} = Property.create("${attr.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+
+    // special properties injected by Cayenne
+    private Persistent owner;
+    private String embeddedProperty;
+    
+    // declared properties
+#foreach( $attr in ${object.Attributes} )
+    protected $importUtils.formatJavaType(${attr.Type}) $stringUtils.formatVariableName(${attr.Name});
+#end
+
+    // lifecycle methods
+    protected void propertyWillChange(String property, Object oldValue, Object newValue) {
+        if (owner != null && owner.getObjectContext() != null) {
+            owner.getObjectContext().propertyChanged(
+                    owner,
+                    embeddedProperty + "." + property,
+                    oldValue,
+                    newValue);
+        }
+    }
+
+    // declared getters and setters
+## Create attribute set/get methods
+#foreach( $attr in ${object.Attributes} )
+    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $stringUtils.formatVariableName(${attr.Name})) {
+        propertyWillChange("${attr.Name}", this.$stringUtils.formatVariableName(${attr.Name}), $stringUtils.formatVariableName(${attr.Name}));
+        this.$stringUtils.formatVariableName(${attr.Name}) = $stringUtils.formatVariableName(${attr.Name});
+    }
+#if ( $importUtils.isBoolean(${attr.Type}) )
+	public boolean is${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#elseif ( $importUtils.isNonBooleanPrimitive(${attr.Type}) )
+    public $classGen.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#else
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#end
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-subclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-subclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-subclass.vm
new file mode 100644
index 0000000..b5b701b
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-subclass.vm
@@ -0,0 +1,45 @@
+##  Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##  Terminology:
+## 
+##	Base class - super superclass of embeddable, usually java.lang.Object
+##  Super class - superclass of embeddable, ie,  org.apache.cayenne.art.auto._Embeddable
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Embeddable
+##
+##  Keys of objects available in template are defined in 'org.apache.cayenne.gen.Artifact', namely:
+## 
+##    object - the Embeddable class: See org.apache.cayenne.map.Embeddable
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${superPackageName}.${superClassName}")}##
+${importUtils.generate()}
+
+
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${subClassName} extends ${superClassName} {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-superclass.vm
new file mode 100644
index 0000000..95e39dc
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/embeddable-superclass.vm
@@ -0,0 +1,112 @@
+##  Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##  Terminology:
+## 
+##	Base class - super superclass of embeddable, usually java.lang.Object
+##  Super class - superclass of embeddable, ie,  org.apache.cayenne.art.auto._Embeddable
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Embeddable
+##
+##  Keys of objects available in template are defined in 'org.apache.cayenne.gen.Artifact', namely:
+## 
+##    object - the Embeddable class: See org.apache.cayenne.map.Embeddable
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($superPackageName)}##
+${importUtils.addReservedType("${superPackageName}.${superClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType("org.apache.cayenne.Persistent")}##
+#if(${object.Attributes} && !${object.Attributes.isEmpty()})
+${importUtils.addType('org.apache.cayenne.exp.Property')}##
+#end
+#foreach( $attr in ${object.Attributes} )
+$importUtils.addType(${attr.Type})##
+#end
+${importUtils.generate()}
+
+/** 
+ * Embeddable class ${superClassName} was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually, 
+ * since it may be overwritten next time code is regenerated. 
+ * If you need to make any customizations, please use subclass. 
+ */
+public abstract class ${superClassName} extends ${baseClassName} {
+
+## Create property names
+#if( $createPropertyNames )
+#foreach( $attr in ${object.Attributes} )
+    public static final String ${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY = "${attr.Name}";
+#end
+
+#end
+## Create Properties
+#foreach( $attr in ${object.Attributes} )
+    #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($attr.Name)} = Property.create("${attr.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+
+    // special properties injected by Cayenne
+    private Persistent owner;
+    private String embeddedProperty;
+    
+    // declared properties
+#foreach( $attr in ${object.Attributes} )
+    protected $importUtils.formatJavaType(${attr.Type}) $stringUtils.formatVariableName(${attr.Name});
+#end
+
+    // lifecycle methods
+    protected void propertyWillChange(String property, Object oldValue, Object newValue) {
+        if (owner != null && owner.getObjectContext() != null) {
+            owner.getObjectContext().propertyChanged(
+                    owner,
+                    embeddedProperty + "." + property,
+                    oldValue,
+                    newValue);
+        }
+    }
+
+    // declared getters and setters
+## Create attribute set/get methods
+#foreach( $attr in ${object.Attributes} )
+    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $stringUtils.formatVariableName(${attr.Name})) {
+        propertyWillChange("${attr.Name}", this.$stringUtils.formatVariableName(${attr.Name}), $stringUtils.formatVariableName(${attr.Name}));
+        this.$stringUtils.formatVariableName(${attr.Name}) = $stringUtils.formatVariableName(${attr.Name});
+    }
+#if ( $importUtils.isBoolean(${attr.Type}) )
+	public boolean is${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#elseif ( $importUtils.isNonBooleanPrimitive(${attr.Type}) )
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#else
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+#end
+
+#end
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
new file mode 100644
index 0000000..f310717
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -0,0 +1,298 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    object (duplicated as 'objEntity') - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    entityUtils - class for entity "helper" functions: See org.apache.cayenne.gen.EntityUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##    superClassName
+##    superPackageName
+##    subClassName
+##    subPackageName
+##    baseClassName
+##    basePackageName 
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${basePackageName}.${baseClassName}")}##
+${importUtils.addType("java.io.IOException")}##
+${importUtils.addType("java.io.ObjectInputStream")}##
+${importUtils.addType("java.io.ObjectOutputStream")}##
+#if((${object.DeclaredAttributes} && !${object.DeclaredAttributes.isEmpty()}) || (${object.DeclaredRelationships} && !${object.DeclaredRelationships.isEmpty()}))
+${importUtils.addType('org.apache.cayenne.exp.Property')}##
+#end
+#foreach( $attr in ${object.DeclaredAttributes} )
+$importUtils.addType(${attr.Type})##
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+$importUtils.addType(${rel.TargetEntity.ClassName})##
+#if(${rel.CollectionType})
+$importUtils.addType(${rel.CollectionType})##
+#end
+#end
+${importUtils.generate()}
+
+public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName} extends ${baseClassName} {
+
+    private static final long serialVersionUID = 1L;
+
+###########################
+## Create property names ##
+###########################
+#if( $createPropertyNames )
+#foreach( $attr in ${object.DeclaredAttributes} )
+    public static final String ${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY = "${attr.Name}";
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+    public static final String ${stringUtils.capitalizedAsConstant($rel.Name)}_PROPERTY = "${rel.Name}";
+#end
+
+#end
+#if( $object.DbEntity )
+#foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
+    public static final String ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = "${idAttr.Name}";
+#end
+#end
+
+#######################
+## Create Properties ##
+#######################
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($attr.Name)} = Property.create("${attr.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ${rel.CollectionType} == "java.util.Map")
+#set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#else
+#set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)>" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#else
+    #set( $type = "$importUtils.formatJavaType(${rel.TargetEntity.ClassName})" )
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = Property.create("${rel.Name}", ${stringUtils.stripGeneric($type)}.class);
+#end
+#end
+
+###################
+## Create Fields ##
+###################
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+protected $type ${attr.Name};
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+protected Object ${rel.Name};
+#end
+
+#########################################################
+## Create attributes and relationships set/get methods ##
+#########################################################
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+##
+## setter
+#if ("true" != "${object.isReadOnly()}")
+    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $name) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${attr.Type}", false);
+            objectContext.propertyChanged(this, "${attr.Type}", this.$name, $name);
+        }
+
+        this.$name = $name;
+    }
+
+#end
+##
+## getter
+#if ( $importUtils.isBoolean(${attr.Type}) )
+    public boolean is${stringUtils.capitalized($attr.Name)}() {
+#else
+    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+#end
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "${attr.Name}", false);
+        }
+
+        return $stringUtils.formatVariableName(${attr.Name});
+    }
+
+#end
+##
+## Create list add/remove/get methods
+#foreach( $rel in ${object.DeclaredRelationships} )
+#if( $rel.ToMany )
+#if ( ! $rel.ReadOnly )
+    public void addTo${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) obj) {
+        addToManyTarget("${rel.Name}", obj, true);
+    }
+
+    public void removeFrom${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) obj) {
+        removeToManyTarget("${rel.Name}", obj, true);
+    }
+
+#end
+    @SuppressWarnings("unchecked")
+#if ( ${rel.CollectionType} == "java.util.Map")
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)> get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($entityUtils.getMapKeyType($rel)), $importUtils.formatJavaType($rel.TargetEntity.ClassName)>)readProperty("${rel.Name}");
+    }
+#else
+    public $importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)> get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClassName)>)readProperty("${rel.Name}");
+    }
+#end
+
+#else
+#if ( !${object.isReadOnly()} && !$rel.ReadOnly )
+    public void set${stringUtils.capitalized($rel.Name)}($importUtils.formatJavaType(${rel.TargetEntity.ClassName}) $stringUtils.formatVariableName(${rel.name})) {
+        setToOneTarget("${rel.Name}", $stringUtils.formatVariableName(${rel.name}), true);
+    }
+
+#end
+    public $importUtils.formatJavaType(${rel.TargetEntity.ClassName}) get${stringUtils.capitalized($rel.Name)}() {
+        return ($importUtils.formatJavaType(${rel.TargetEntity.ClassName}))readProperty("${rel.Name}");
+    }
+
+#end
+#end
+#############################
+## Create callback methods ##
+#############################
+#foreach($cbname in ${entityUtils.callbackNames})
+    @Override
+    protected void ${cbname}() {
+        //TODO: implement ${cbname}
+    }
+
+#end
+###########################################################
+## Create writePropertyDirect/readPropertyDirect methods ##
+###########################################################
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+            case "${attr.Name}":
+                return this.${name};
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+            case "${rel.Name}":
+                return this.$stringUtils.formatVariableName(${rel.name});
+#end
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+            case "${attr.Name}":
+                this.${name} = ($type)val;
+                break;
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+            case "${rel.Name}":
+                this.$stringUtils.formatVariableName(${rel.name}) = val;
+                break;
+#end
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
+
+##################################
+## Create serialization support ##
+##################################
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        writeSerialized(out);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        readSerialized(in);
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.writeInt(persistenceState);
+        out.writeObject(objectId);
+
+        if(persistenceState == PersistenceState.COMMITTED
+                || persistenceState == PersistenceState.HOLLOW) {
+            return;
+        }
+
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#if($importUtils.isPrimitive($type))
+        out.write${stringUtils.capitalized($type)}($name);
+#else
+        out.writeObject(${name});
+#end
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+        out.writeObject(${stringUtils.formatVariableName($rel.Name)});
+#end
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        this.persistenceState = in.readInt();
+        this.objectId = (ObjectId) in.readObject();
+
+        if(persistenceState == PersistenceState.COMMITTED
+                || persistenceState == PersistenceState.HOLLOW) {
+            persistenceState = PersistenceState.HOLLOW;
+            return;
+        }
+
+#foreach( $attr in ${object.DeclaredAttributes} )
+#set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#if($importUtils.isPrimitive($type))
+        $name = in.read${stringUtils.capitalized($type)}();
+#else
+        $name = ($type)in.readObject();
+#end
+#end
+#foreach( $rel in ${object.DeclaredRelationships} )
+#set ( $name = "${stringUtils.formatVariableName($rel.Name)}")
+        $name = in.readObject();
+#end
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-cgen/src/main/resources/templates/v4_1/subclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/subclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/subclass.vm
new file mode 100644
index 0000000..e31e658
--- /dev/null
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/subclass.vm
@@ -0,0 +1,47 @@
+##   Licensed to the Apache Software Foundation (ASF) under one
+##  or more contributor license agreements.  See the NOTICE file
+##  distributed with this work for additional information
+##  regarding copyright ownership.  The ASF licenses this file
+##  to you under the Apache License, Version 2.0 (the
+##  "License"); you may not use this file except in compliance
+##  with the License.  You may obtain a copy of the License at
+##
+##    http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing,
+##  software distributed under the License is distributed on an
+##  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+##  KIND, either express or implied.  See the License for the
+##  specific language governing permissions and limitations
+##  under the License.
+##
+##Terminology:
+##	Base class - super superclass of entity, ie, org.apache.cayenne.CayenneDataObject or MyBaseClass
+##  Super class - superclass of entity, ie,  org.apache.cayenne.art.auto._Artist
+##	Sub class - class of entity, ie, org.apache.cayenne.art.Artist
+##
+##  Classes available in template
+##    objEntity - the ObjEntity class: See org.apache.cayenne.map.ObjectEntity
+##    stringUtils - class for string "helper" functions: See org.apache.cayenne.gen.StringUtils
+##    entityUtils - class for entity "helper" functions: See org.apache.cayenne.gen.EntityUtils
+##    importUtils - class for import statement management: See org.apache.cayenne.gen.ImportUtils
+##
+##
+${importUtils.setPackage($subPackageName)}##
+${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
+${importUtils.addType("${superPackageName}.${superClassName}")}##
+${importUtils.generate()}
+
+public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName} extends ${superClassName} {
+
+    private static final long serialVersionUID = 1L; 
+
+##callbacks
+#foreach($cbname in ${entityUtils.callbackNames})
+    @Override
+    protected void ${cbname}() {
+        //TODO: implement ${cbname}
+    }
+
+#end 
+}


[06/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
index bb22d47..199322b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
 
@@ -18,18 +22,84 @@ public abstract class _IvSub2 extends IvRoot {
     public static final Property<String> SUB2ATTR = Property.create("sub2Attr", String.class);
     public static final Property<String> SUB2NAME = Property.create("sub2Name", String.class);
 
+    protected String sub2Attr;
+    protected String sub2Name;
+
+
     public void setSub2Attr(String sub2Attr) {
-        writeProperty("sub2Attr", sub2Attr);
+        beforePropertyWrite("sub2Attr", this.sub2Attr, sub2Attr);
+        this.sub2Attr = sub2Attr;
     }
+
     public String getSub2Attr() {
-        return (String)readProperty("sub2Attr");
+        beforePropertyRead("sub2Attr");
+        return sub2Attr;
     }
 
     public void setSub2Name(String sub2Name) {
-        writeProperty("sub2Name", sub2Name);
+        beforePropertyWrite("sub2Name", this.sub2Name, sub2Name);
+        this.sub2Name = sub2Name;
     }
+
     public String getSub2Name() {
-        return (String)readProperty("sub2Name");
+        beforePropertyRead("sub2Name");
+        return sub2Name;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "sub2Attr":
+                return this.sub2Attr;
+            case "sub2Name":
+                return this.sub2Name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "sub2Attr":
+                this.sub2Attr = (String)val;
+                break;
+            case "sub2Name":
+                this.sub2Name = (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(sub2Attr);
+        out.writeObject(sub2Name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        sub2Attr = (String)in.readObject();
+        sub2Name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
index 9c90d5e..b9272c0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
@@ -1,5 +1,9 @@
 package org.apache.cayenne.testdo.inheritance_vertical.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
 
@@ -18,11 +22,61 @@ public abstract class _IvSub3 extends IvRoot {
     public static final Property<IvRoot> IV_ROOT = Property.create("ivRoot", IvRoot.class);
 
 
+    protected Object ivRoot;
+
     public IvRoot getIvRoot() {
         return (IvRoot)readProperty("ivRoot");
     }
 
+protected abstract void onPrePersist();
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "ivRoot":
+                return this.ivRoot;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "ivRoot":
+                this.ivRoot = val;
+                break;
+            default:
+                super.writePropertyDirectly(propName, val);
+        }
+    }
 
-    protected abstract void onPrePersist();
+    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(ivRoot);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        ivRoot = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
index b949e46..cce1bae 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.lifecycle_callbacks_order.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Lifecycle extends CayenneDataObject {
+public abstract class _Lifecycle extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _Lifecycle extends CayenneDataObject {
 
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String name;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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;
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
index a18472d..5895dbb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.lifecycles.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Lifecycles extends CayenneDataObject {
+public abstract class _Lifecycles extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _Lifecycles extends CayenneDataObject {
 
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String name;
+
+
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            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;
+            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);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
index 9ad2f80..6e1cc8f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.lob.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BlobTestEntity extends CayenneDataObject {
+public abstract class _BlobTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _BlobTestEntity extends CayenneDataObject {
 
     public static final Property<byte[]> BLOB_COL = Property.create("blobCol", byte[].class);
 
+    protected byte[] blobCol;
+
+
     public void setBlobCol(byte[] blobCol) {
-        writeProperty("blobCol", blobCol);
+        beforePropertyWrite("blobCol", this.blobCol, blobCol);
+        this.blobCol = blobCol;
     }
+
     public byte[] getBlobCol() {
-        return (byte[])readProperty("blobCol");
+        beforePropertyRead("blobCol");
+        return blobCol;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "blobCol":
+                return this.blobCol;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "blobCol":
+                this.blobCol = (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(blobCol);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        blobCol = (byte[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
index 5034c87..e5ae2e9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.lob.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.lob.ClobTestRelation;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.lob.ClobTestRelation;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ClobTestEntity extends CayenneDataObject {
+public abstract class _ClobTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _ClobTestEntity extends CayenneDataObject {
     public static final Property<String> CLOB_COL = Property.create("clobCol", String.class);
     public static final Property<List<ClobTestRelation>> CLOB_VALUE = Property.create("clobValue", List.class);
 
+    protected String clobCol;
+
+    protected Object clobValue;
+
     public void setClobCol(String clobCol) {
-        writeProperty("clobCol", clobCol);
+        beforePropertyWrite("clobCol", this.clobCol, clobCol);
+        this.clobCol = clobCol;
     }
+
     public String getClobCol() {
-        return (String)readProperty("clobCol");
+        beforePropertyRead("clobCol");
+        return clobCol;
     }
 
     public void addToClobValue(ClobTestRelation obj) {
         addToManyTarget("clobValue", obj, true);
     }
+
     public void removeFromClobValue(ClobTestRelation obj) {
         removeToManyTarget("clobValue", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<ClobTestRelation> getClobValue() {
         return (List<ClobTestRelation>)readProperty("clobValue");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "clobCol":
+                return this.clobCol;
+            case "clobValue":
+                return this.clobValue;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "clobCol":
+                this.clobCol = (String)val;
+                break;
+            case "clobValue":
+                this.clobValue = 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(clobCol);
+        out.writeObject(clobValue);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        clobCol = (String)in.readObject();
+        clobValue = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
index 01e3e05..3a8c35d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.lob.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.lob.ClobTestEntity;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.lob.ClobTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ClobTestRelation extends CayenneDataObject {
+public abstract class _ClobTestRelation extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,18 +24,29 @@ public abstract class _ClobTestRelation extends CayenneDataObject {
     public static final Property<Integer> VALUE = Property.create("value", Integer.class);
     public static final Property<ClobTestEntity> CLOB_ID = Property.create("clobId", ClobTestEntity.class);
 
+    protected Integer id;
+    protected Integer value;
+
+    protected Object clobId;
+
     public void setId(Integer id) {
-        writeProperty("id", id);
+        beforePropertyWrite("id", this.id, id);
+        this.id = id;
     }
+
     public Integer getId() {
-        return (Integer)readProperty("id");
+        beforePropertyRead("id");
+        return id;
     }
 
     public void setValue(Integer value) {
-        writeProperty("value", value);
+        beforePropertyWrite("value", this.value, value);
+        this.value = value;
     }
+
     public Integer getValue() {
-        return (Integer)readProperty("value");
+        beforePropertyRead("value");
+        return value;
     }
 
     public void setClobId(ClobTestEntity clobId) {
@@ -42,5 +57,67 @@ public abstract class _ClobTestRelation extends CayenneDataObject {
         return (ClobTestEntity)readProperty("clobId");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "id":
+                return this.id;
+            case "value":
+                return this.value;
+            case "clobId":
+                return this.clobId;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "id":
+                this.id = (Integer)val;
+                break;
+            case "value":
+                this.value = (Integer)val;
+                break;
+            case "clobId":
+                this.clobId = 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(id);
+        out.writeObject(value);
+        out.writeObject(clobId);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        id = (Integer)in.readObject();
+        value = (Integer)in.readObject();
+        clobId = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
index 56299e5..3d88ec8 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.lob.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _NClobTestEntity extends CayenneDataObject {
+public abstract class _NClobTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _NClobTestEntity extends CayenneDataObject {
 
     public static final Property<String> NCLOB_COL = Property.create("nclobCol", String.class);
 
+    protected String nclobCol;
+
+
     public void setNclobCol(String nclobCol) {
-        writeProperty("nclobCol", nclobCol);
+        beforePropertyWrite("nclobCol", this.nclobCol, nclobCol);
+        this.nclobCol = nclobCol;
     }
+
     public String getNclobCol() {
-        return (String)readProperty("nclobCol");
+        beforePropertyRead("nclobCol");
+        return nclobCol;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "nclobCol":
+                return this.nclobCol;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "nclobCol":
+                this.nclobCol = (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(nclobCol);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        nclobCol = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
index 9973a75..7b75aaf 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.locking.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.locking.RelLockingTestEntity;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.locking.RelLockingTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _LockingHelper extends CayenneDataObject {
+public abstract class _LockingHelper extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _LockingHelper extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<RelLockingTestEntity> TO_REL_LOCKING_TEST = Property.create("toRelLockingTest", RelLockingTestEntity.class);
 
+    protected String name;
+
+    protected Object toRelLockingTest;
+
     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 setToRelLockingTest(RelLockingTestEntity toRelLockingTest) {
@@ -34,5 +45,60 @@ public abstract class _LockingHelper extends CayenneDataObject {
         return (RelLockingTestEntity)readProperty("toRelLockingTest");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toRelLockingTest":
+                return this.toRelLockingTest;
+            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 "toRelLockingTest":
+                this.toRelLockingTest = 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(toRelLockingTest);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toRelLockingTest = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
index e74bc58..40ca5c1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.locking.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.locking.LockingHelper;
 import org.apache.cayenne.testdo.locking.SimpleLockingTestEntity;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.locking.SimpleLockingTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _RelLockingTestEntity extends CayenneDataObject {
+public abstract class _RelLockingTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,25 +26,34 @@ public abstract class _RelLockingTestEntity extends CayenneDataObject {
     public static final Property<List<LockingHelper>> LOCKING_HELPERS = Property.create("lockingHelpers", List.class);
     public static final Property<SimpleLockingTestEntity> TO_SIMPLE_LOCKING_TEST = Property.create("toSimpleLockingTest", SimpleLockingTestEntity.class);
 
+    protected String name;
+
+    protected Object lockingHelpers;
+    protected Object toSimpleLockingTest;
+
     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 addToLockingHelpers(LockingHelper obj) {
         addToManyTarget("lockingHelpers", obj, true);
     }
+
     public void removeFromLockingHelpers(LockingHelper obj) {
         removeToManyTarget("lockingHelpers", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<LockingHelper> getLockingHelpers() {
         return (List<LockingHelper>)readProperty("lockingHelpers");
     }
 
-
     public void setToSimpleLockingTest(SimpleLockingTestEntity toSimpleLockingTest) {
         setToOneTarget("toSimpleLockingTest", toSimpleLockingTest, true);
     }
@@ -50,5 +62,67 @@ public abstract class _RelLockingTestEntity extends CayenneDataObject {
         return (SimpleLockingTestEntity)readProperty("toSimpleLockingTest");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "lockingHelpers":
+                return this.lockingHelpers;
+            case "toSimpleLockingTest":
+                return this.toSimpleLockingTest;
+            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 "lockingHelpers":
+                this.lockingHelpers = val;
+                break;
+            case "toSimpleLockingTest":
+                this.toSimpleLockingTest = 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(lockingHelpers);
+        out.writeObject(toSimpleLockingTest);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        lockingHelpers = in.readObject();
+        toSimpleLockingTest = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
index 4bb40f6..978e848 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.locking.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SimpleLockingTestEntity extends CayenneDataObject {
+public abstract class _SimpleLockingTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,18 +22,84 @@ public abstract class _SimpleLockingTestEntity extends CayenneDataObject {
     public static final Property<String> DESCRIPTION = Property.create("description", String.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
+    protected String description;
+    protected String name;
+
+
     public void setDescription(String description) {
-        writeProperty("description", description);
+        beforePropertyWrite("description", this.description, description);
+        this.description = description;
     }
+
     public String getDescription() {
-        return (String)readProperty("description");
+        beforePropertyRead("description");
+        return description;
     }
 
     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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "description":
+                return this.description;
+            case "name":
+                return this.name;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "description":
+                this.description = (String)val;
+                break;
+            case "name":
+                this.name = (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(description);
+        out.writeObject(name);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        description = (String)in.readObject();
+        name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
index 575121e..d559308 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.map_to_many.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Map;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.map_to_many.IdMapToManyTarget;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.map_to_many.IdMapToManyTarget;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IdMapToMany extends CayenneDataObject {
+public abstract class _IdMapToMany extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _IdMapToMany extends CayenneDataObject {
 
     public static final Property<Map<Object, IdMapToManyTarget>> TARGETS = Property.create("targets", Map.class);
 
+
+    protected Object targets;
+
     public void addToTargets(IdMapToManyTarget obj) {
         addToManyTarget("targets", obj, true);
     }
+
     public void removeFromTargets(IdMapToManyTarget obj) {
         removeToManyTarget("targets", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public Map<Object, IdMapToManyTarget> getTargets() {
         return (Map<Object, IdMapToManyTarget>)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/map_to_many/auto/_IdMapToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
index 9e6d292..75e5668 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.map_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.map_to_many.IdMapToMany;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.map_to_many.IdMapToMany;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _IdMapToManyTarget extends CayenneDataObject {
+public abstract class _IdMapToManyTarget extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,6 +22,9 @@ public abstract class _IdMapToManyTarget extends CayenneDataObject {
 
     public static final Property<IdMapToMany> MAP_TO_MANY = Property.create("mapToMany", IdMapToMany.class);
 
+
+    protected Object mapToMany;
+
     public void setMapToMany(IdMapToMany mapToMany) {
         setToOneTarget("mapToMany", mapToMany, true);
     }
@@ -26,5 +33,53 @@ public abstract class _IdMapToManyTarget extends CayenneDataObject {
         return (IdMapToMany)readProperty("mapToMany");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "mapToMany":
+                return this.mapToMany;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "mapToMany":
+                this.mapToMany = 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(mapToMany);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        mapToMany = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
index fc0b07f..93208bb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.map_to_many.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Map;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.map_to_many.MapToManyTarget;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.map_to_many.MapToManyTarget;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MapToMany extends CayenneDataObject {
+public abstract class _MapToMany extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _MapToMany extends CayenneDataObject {
 
     public static final Property<Map<String, MapToManyTarget>> TARGETS = Property.create("targets", Map.class);
 
+
+    protected Object targets;
+
     public void addToTargets(MapToManyTarget obj) {
         addToManyTarget("targets", obj, true);
     }
+
     public void removeFromTargets(MapToManyTarget obj) {
         removeToManyTarget("targets", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public Map<String, MapToManyTarget> getTargets() {
         return (Map<String, MapToManyTarget>)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/map_to_many/auto/_MapToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
index c5c2842..8bdb39c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.map_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.map_to_many.MapToMany;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.map_to_many.MapToMany;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MapToManyTarget extends CayenneDataObject {
+public abstract class _MapToManyTarget extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _MapToManyTarget extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<MapToMany> MAP_TO_MANY = Property.create("mapToMany", MapToMany.class);
 
+    protected String name;
+
+    protected Object mapToMany;
+
     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 setMapToMany(MapToMany mapToMany) {
@@ -34,5 +45,60 @@ public abstract class _MapToManyTarget extends CayenneDataObject {
         return (MapToMany)readProperty("mapToMany");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "mapToMany":
+                return this.mapToMany;
+            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 "mapToMany":
+                this.mapToMany = 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(mapToMany);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        mapToMany = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
index 7825496..e78f7a9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.meaningful_pk.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.meaningful_pk.MeaningfulPKTest1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKTest1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulPKDep extends CayenneDataObject {
+public abstract class _MeaningfulPKDep extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _MeaningfulPKDep extends CayenneDataObject {
     public static final Property<String> DESCR = Property.create("descr", String.class);
     public static final Property<MeaningfulPKTest1> TO_MEANINGFUL_PK = Property.create("toMeaningfulPK", MeaningfulPKTest1.class);
 
+    protected String descr;
+
+    protected Object toMeaningfulPK;
+
     public void setDescr(String descr) {
-        writeProperty("descr", descr);
+        beforePropertyWrite("descr", this.descr, descr);
+        this.descr = descr;
     }
+
     public String getDescr() {
-        return (String)readProperty("descr");
+        beforePropertyRead("descr");
+        return descr;
     }
 
     public void setToMeaningfulPK(MeaningfulPKTest1 toMeaningfulPK) {
@@ -34,5 +45,60 @@ public abstract class _MeaningfulPKDep extends CayenneDataObject {
         return (MeaningfulPKTest1)readProperty("toMeaningfulPK");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "descr":
+                return this.descr;
+            case "toMeaningfulPK":
+                return this.toMeaningfulPK;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "descr":
+                this.descr = (String)val;
+                break;
+            case "toMeaningfulPK":
+                this.toMeaningfulPK = 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(descr);
+        out.writeObject(toMeaningfulPK);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        descr = (String)in.readObject();
+        toMeaningfulPK = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
index 4816c13..93bdada 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.meaningful_pk.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.meaningful_pk.MeaningfulPKDep;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.meaningful_pk.MeaningfulPKDep;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulPKTest1 extends CayenneDataObject {
+public abstract class _MeaningfulPKTest1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _MeaningfulPKTest1 extends CayenneDataObject {
     public static final Property<Integer> PK_ATTRIBUTE = Property.create("pkAttribute", Integer.class);
     public static final Property<List<MeaningfulPKDep>> MEANINGFUL_PKDEP_ARRAY = Property.create("meaningfulPKDepArray", List.class);
 
+    protected String descr;
+    protected Integer pkAttribute;
+
+    protected Object meaningfulPKDepArray;
+
     public void setDescr(String descr) {
-        writeProperty("descr", descr);
+        beforePropertyWrite("descr", this.descr, descr);
+        this.descr = descr;
     }
+
     public String getDescr() {
-        return (String)readProperty("descr");
+        beforePropertyRead("descr");
+        return descr;
     }
 
     public void setPkAttribute(Integer pkAttribute) {
-        writeProperty("pkAttribute", pkAttribute);
+        beforePropertyWrite("pkAttribute", this.pkAttribute, pkAttribute);
+        this.pkAttribute = pkAttribute;
     }
+
     public Integer getPkAttribute() {
-        return (Integer)readProperty("pkAttribute");
+        beforePropertyRead("pkAttribute");
+        return pkAttribute;
     }
 
     public void addToMeaningfulPKDepArray(MeaningfulPKDep obj) {
         addToManyTarget("meaningfulPKDepArray", obj, true);
     }
+
     public void removeFromMeaningfulPKDepArray(MeaningfulPKDep obj) {
         removeToManyTarget("meaningfulPKDepArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MeaningfulPKDep> getMeaningfulPKDepArray() {
         return (List<MeaningfulPKDep>)readProperty("meaningfulPKDepArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "descr":
+                return this.descr;
+            case "pkAttribute":
+                return this.pkAttribute;
+            case "meaningfulPKDepArray":
+                return this.meaningfulPKDepArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "descr":
+                this.descr = (String)val;
+                break;
+            case "pkAttribute":
+                this.pkAttribute = (Integer)val;
+                break;
+            case "meaningfulPKDepArray":
+                this.meaningfulPKDepArray = 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(descr);
+        out.writeObject(pkAttribute);
+        out.writeObject(meaningfulPKDepArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        descr = (String)in.readObject();
+        pkAttribute = (Integer)in.readObject();
+        meaningfulPKDepArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
index b988ecd..16f13ab 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.meaningful_pk.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MeaningfulPk extends CayenneDataObject {
+public abstract class _MeaningfulPk extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _MeaningfulPk extends CayenneDataObject {
 
     public static final Property<String> PK = Property.create("pk", String.class);
 
+    protected String pk;
+
+
     public void setPk(String pk) {
-        writeProperty("pk", pk);
+        beforePropertyWrite("pk", this.pk, pk);
+        this.pk = pk;
     }
+
     public String getPk() {
-        return (String)readProperty("pk");
+        beforePropertyRead("pk");
+        return pk;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "pk":
+                return this.pk;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "pk":
+                this.pk = (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(pk);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        pk = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
index 611b076..7d5ac6e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.misc_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ArraysEntity extends CayenneDataObject {
+public abstract class _ArraysEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,32 +24,120 @@ public abstract class _ArraysEntity extends CayenneDataObject {
     public static final Property<char[]> CHAR_ARRAY = Property.create("charArray", char[].class);
     public static final Property<Character[]> CHAR_WRAPPER_ARRAY = Property.create("charWrapperArray", Character[].class);
 
+    protected byte[] byteArray;
+    protected Byte[] byteWrapperArray;
+    protected char[] charArray;
+    protected Character[] charWrapperArray;
+
+
     public void setByteArray(byte[] byteArray) {
-        writeProperty("byteArray", byteArray);
+        beforePropertyWrite("byteArray", this.byteArray, byteArray);
+        this.byteArray = byteArray;
     }
+
     public byte[] getByteArray() {
-        return (byte[])readProperty("byteArray");
+        beforePropertyRead("byteArray");
+        return byteArray;
     }
 
     public void setByteWrapperArray(Byte[] byteWrapperArray) {
-        writeProperty("byteWrapperArray", byteWrapperArray);
+        beforePropertyWrite("byteWrapperArray", this.byteWrapperArray, byteWrapperArray);
+        this.byteWrapperArray = byteWrapperArray;
     }
+
     public Byte[] getByteWrapperArray() {
-        return (Byte[])readProperty("byteWrapperArray");
+        beforePropertyRead("byteWrapperArray");
+        return byteWrapperArray;
     }
 
     public void setCharArray(char[] charArray) {
-        writeProperty("charArray", charArray);
+        beforePropertyWrite("charArray", this.charArray, charArray);
+        this.charArray = charArray;
     }
+
     public char[] getCharArray() {
-        return (char[])readProperty("charArray");
+        beforePropertyRead("charArray");
+        return charArray;
     }
 
     public void setCharWrapperArray(Character[] charWrapperArray) {
-        writeProperty("charWrapperArray", charWrapperArray);
+        beforePropertyWrite("charWrapperArray", this.charWrapperArray, charWrapperArray);
+        this.charWrapperArray = charWrapperArray;
     }
+
     public Character[] getCharWrapperArray() {
-        return (Character[])readProperty("charWrapperArray");
+        beforePropertyRead("charWrapperArray");
+        return charWrapperArray;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "byteArray":
+                return this.byteArray;
+            case "byteWrapperArray":
+                return this.byteWrapperArray;
+            case "charArray":
+                return this.charArray;
+            case "charWrapperArray":
+                return this.charWrapperArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "byteArray":
+                this.byteArray = (byte[])val;
+                break;
+            case "byteWrapperArray":
+                this.byteWrapperArray = (Byte[])val;
+                break;
+            case "charArray":
+                this.charArray = (char[])val;
+                break;
+            case "charWrapperArray":
+                this.charWrapperArray = (Character[])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(byteArray);
+        out.writeObject(byteWrapperArray);
+        out.writeObject(charArray);
+        out.writeObject(charWrapperArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        byteArray = (byte[])in.readObject();
+        byteWrapperArray = (Byte[])in.readObject();
+        charArray = (char[])in.readObject();
+        charWrapperArray = (Character[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
index 836ecc1..1163888 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.misc_types.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CharacterEntity extends CayenneDataObject {
+public abstract class _CharacterEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _CharacterEntity extends CayenneDataObject {
 
     public static final Property<Character> CHARACTER_FIELD = Property.create("characterField", Character.class);
 
+    protected Character characterField;
+
+
     public void setCharacterField(Character characterField) {
-        writeProperty("characterField", characterField);
+        beforePropertyWrite("characterField", this.characterField, characterField);
+        this.characterField = characterField;
     }
+
     public Character getCharacterField() {
-        return (Character)readProperty("characterField");
+        beforePropertyRead("characterField");
+        return characterField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "characterField":
+                return this.characterField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "characterField":
+                this.characterField = (Character)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(characterField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        characterField = (Character)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
index 1512815..2f9adf1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.misc_types.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.MockSerializable;
 import org.apache.cayenne.exp.Property;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _SerializableEntity extends CayenneDataObject {
+public abstract class _SerializableEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -18,11 +22,66 @@ public abstract class _SerializableEntity extends CayenneDataObject {
 
     public static final Property<MockSerializable> SERIALIZABLE_FIELD = Property.create("serializableField", MockSerializable.class);
 
+    protected MockSerializable serializableField;
+
+
     public void setSerializableField(MockSerializable serializableField) {
-        writeProperty("serializableField", serializableField);
+        beforePropertyWrite("serializableField", this.serializableField, serializableField);
+        this.serializableField = serializableField;
     }
+
     public MockSerializable getSerializableField() {
-        return (MockSerializable)readProperty("serializableField");
+        beforePropertyRead("serializableField");
+        return serializableField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "serializableField":
+                return this.serializableField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "serializableField":
+                this.serializableField = (MockSerializable)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(serializableField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        serializableField = (MockSerializable)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
index b3f8b88..e2427ee 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.mixed_persistence_strategy.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.mixed_persistence_strategy.MixedPersistenceStrategy2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.mixed_persistence_strategy.MixedPersistenceStra
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MixedPersistenceStrategy extends CayenneDataObject {
+public abstract class _MixedPersistenceStrategy extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _MixedPersistenceStrategy extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<MixedPersistenceStrategy2>> DETAILS = Property.create("details", List.class);
 
+    protected String description;
+    protected String name;
+
+    protected Object details;
+
     public void setDescription(String description) {
-        writeProperty("description", description);
+        beforePropertyWrite("description", this.description, description);
+        this.description = description;
     }
+
     public String getDescription() {
-        return (String)readProperty("description");
+        beforePropertyRead("description");
+        return description;
     }
 
     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 addToDetails(MixedPersistenceStrategy2 obj) {
         addToManyTarget("details", obj, true);
     }
+
     public void removeFromDetails(MixedPersistenceStrategy2 obj) {
         removeToManyTarget("details", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<MixedPersistenceStrategy2> getDetails() {
         return (List<MixedPersistenceStrategy2>)readProperty("details");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "description":
+                return this.description;
+            case "name":
+                return this.name;
+            case "details":
+                return this.details;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "description":
+                this.description = (String)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "details":
+                this.details = 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(description);
+        out.writeObject(name);
+        out.writeObject(details);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        description = (String)in.readObject();
+        name = (String)in.readObject();
+        details = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
index 227192d..300c2b3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.mixed_persistence_strategy.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.mixed_persistence_strategy.MixedPersistenceStrategy;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.mixed_persistence_strategy.MixedPersistenceStra
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _MixedPersistenceStrategy2 extends CayenneDataObject {
+public abstract class _MixedPersistenceStrategy2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _MixedPersistenceStrategy2 extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<MixedPersistenceStrategy> MASTER = Property.create("master", MixedPersistenceStrategy.class);
 
+    protected String name;
+
+    protected Object master;
+
     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 setMaster(MixedPersistenceStrategy master) {
@@ -34,5 +45,60 @@ public abstract class _MixedPersistenceStrategy2 extends CayenneDataObject {
         return (MixedPersistenceStrategy)readProperty("master");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "master":
+                return this.master;
+            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 "master":
+                this.master = 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(master);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        master = in.readObject();
+    }
 
 }


[13/18] cayenne git commit: CAY-2330 Field based data objects update test classes to latest cgen templates

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
index d184188..9da8fa5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/things/auto/_Thing.java
@@ -40,7 +40,7 @@ public abstract class _Thing extends CayenneDataObject {
 
     public Integer getVolume() {
         beforePropertyRead("volume");
-        return volume;
+        return this.volume;
     }
 
     public void setWeight(Integer weight) {
@@ -50,7 +50,7 @@ public abstract class _Thing extends CayenneDataObject {
 
     public Integer getWeight() {
         beforePropertyRead("weight");
-        return weight;
+        return this.weight;
     }
 
     public void setBall(Ball ball) {
@@ -121,19 +121,19 @@ public abstract class _Thing extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(volume);
-        out.writeObject(weight);
-        out.writeObject(ball);
-        out.writeObject(box);
+        out.writeObject(this.volume);
+        out.writeObject(this.weight);
+        out.writeObject(this.ball);
+        out.writeObject(this.box);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        volume = (Integer)in.readObject();
-        weight = (Integer)in.readObject();
-        ball = in.readObject();
-        box = in.readObject();
+        this.volume = (Integer)in.readObject();
+        this.weight = (Integer)in.readObject();
+        this.ball = in.readObject();
+        this.box = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneDep.java
index aca4f32..9a33de6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneDep.java
@@ -73,13 +73,13 @@ public abstract class _TooneDep extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toMaster);
+        out.writeObject(this.toMaster);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toMaster = in.readObject();
+        this.toMaster = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneMaster.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneMaster.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneMaster.java
index e77fca1..8d9858f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneMaster.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/toone/auto/_TooneMaster.java
@@ -73,13 +73,13 @@ public abstract class _TooneMaster extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toDependent);
+        out.writeObject(this.toDependent);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toDependent = in.readObject();
+        this.toDependent = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
index a63b36d..8b903d6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Customer.java
@@ -35,7 +35,7 @@ public abstract class _Customer extends BaseDataObject {
 
     public String getLongvarcharCol() {
         beforePropertyRead("longvarcharCol");
-        return longvarcharCol;
+        return this.longvarcharCol;
     }
 
     public void addToOrder(Product obj) {
@@ -96,15 +96,15 @@ public abstract class _Customer extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(longvarcharCol);
-        out.writeObject(order);
+        out.writeObject(this.longvarcharCol);
+        out.writeObject(this.order);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        longvarcharCol = (String)in.readObject();
-        order = in.readObject();
+        this.longvarcharCol = (String)in.readObject();
+        this.order = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
index d61e552..821705f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/unsupported_distinct_types/auto/_Product.java
@@ -40,7 +40,7 @@ public abstract class _Product extends BaseDataObject {
 
     public String getLongvarcharCol() {
         beforePropertyRead("longvarcharCol");
-        return longvarcharCol;
+        return this.longvarcharCol;
     }
 
     public void addToBase(Product obj) {
@@ -137,19 +137,19 @@ public abstract class _Product extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(longvarcharCol);
-        out.writeObject(base);
-        out.writeObject(contained);
-        out.writeObject(orderBy);
+        out.writeObject(this.longvarcharCol);
+        out.writeObject(this.base);
+        out.writeObject(this.contained);
+        out.writeObject(this.orderBy);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        longvarcharCol = (String)in.readObject();
-        base = in.readObject();
-        contained = in.readObject();
-        orderBy = in.readObject();
+        this.longvarcharCol = (String)in.readObject();
+        this.base = in.readObject();
+        this.contained = in.readObject();
+        this.orderBy = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
index 2f77d87..a3bd685 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidPkEntity.java
@@ -32,7 +32,7 @@ public abstract class _UuidPkEntity extends BaseDataObject {
 
     public UUID getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _UuidPkEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(id);
+        out.writeObject(this.id);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        id = (UUID)in.readObject();
+        this.id = (UUID)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
index 3342cb6..08da08c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/uuid/auto/_UuidTestEntity.java
@@ -32,7 +32,7 @@ public abstract class _UuidTestEntity extends BaseDataObject {
 
     public UUID getUuid() {
         beforePropertyRead("uuid");
-        return uuid;
+        return this.uuid;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _UuidTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(uuid);
+        out.writeObject(this.uuid);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        uuid = (UUID)in.readObject();
+        this.uuid = (UUID)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
index b4803c4..343544f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortDep.java
@@ -73,13 +73,13 @@ public abstract class _SortDep extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(root);
+        out.writeObject(this.root);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        root = in.readObject();
+        this.root = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
index 67b4d45..2fda8a5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/weighted_sort/auto/_SortRoot.java
@@ -79,13 +79,13 @@ public abstract class _SortRoot extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(deps);
+        out.writeObject(this.deps);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        deps = in.readObject();
+        this.deps = in.readObject();
     }
 
 }


[16/18] cayenne git commit: CAY-2330 Field based data objects update test classes to latest cgen templates

Posted by nt...@apache.org.
CAY-2330 Field based data objects
  update test classes to latest cgen templates


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/f3a350e1
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/f3a350e1
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/f3a350e1

Branch: refs/heads/master
Commit: f3a350e1b380cbda8d51e8d468989b8af1dc5ead
Parents: 4d315fb
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Jul 6 14:05:49 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Jul 6 14:05:50 2017 +0300

----------------------------------------------------------------------
 .../array_type/auto/_ArrayTestEntity.java       |   6 +-
 .../testdo/binary_pk/auto/_BinaryPKTest1.java   |  10 +-
 .../testdo/binary_pk/auto/_BinaryPKTest2.java   |  10 +-
 .../cayenne/testdo/cay_2032/auto/_Team.java     |   4 +-
 .../cayenne/testdo/cay_2032/auto/_User.java     |  10 +-
 .../testdo/compound/auto/_CharFkTestEntity.java |  10 +-
 .../testdo/compound/auto/_CharPkTestEntity.java |  16 +--
 .../compound/auto/_CompoundFkTestEntity.java    |  10 +-
 .../compound/auto/_CompoundPkTestEntity.java    |  22 ++--
 .../testdo/date_time/auto/_CalendarEntity.java  |   6 +-
 .../testdo/date_time/auto/_DateTestEntity.java  |  18 +--
 .../cayenne/testdo/db1/auto/_CrossdbM1E1.java   |  14 +--
 .../cayenne/testdo/db2/auto/_CrossdbM2E1.java   |  10 +-
 .../cayenne/testdo/db2/auto/_CrossdbM2E2.java   |  14 +--
 .../testdo/deleterules/auto/_DeleteCascade.java |  10 +-
 .../testdo/deleterules/auto/_DeleteDeny.java    |  10 +-
 .../testdo/deleterules/auto/_DeleteNullify.java |  10 +-
 .../testdo/deleterules/auto/_DeleteRule.java    |  18 +--
 .../testdo/embeddable/auto/_EmbedEntity1.java   |  18 +--
 .../testdo/enum_test/auto/_EnumEntity.java      |   6 +-
 .../extended_type/auto/_ExtendedTypeEntity.java |   6 +-
 .../generated/auto/_GeneratedColumnCompKey.java |  10 +-
 .../auto/_GeneratedColumnCompMaster.java        |  10 +-
 .../generated/auto/_GeneratedColumnDep.java     |  10 +-
 .../generated/auto/_GeneratedColumnTest2.java   |   6 +-
 .../auto/_GeneratedColumnTestEntity.java        |  10 +-
 .../testdo/generated/auto/_GeneratedF1.java     |   4 +-
 .../testdo/generated/auto/_GeneratedF2.java     |   4 +-
 .../testdo/inheritance/auto/_BaseEntity.java    |  14 +--
 .../inheritance/auto/_DirectToSubEntity.java    |   4 +-
 .../testdo/inheritance/auto/_RelatedEntity.java |   8 +-
 .../testdo/inheritance_flat/auto/_Group.java    |   8 +-
 .../inheritance_flat/auto/_GroupProperties.java |  16 +--
 .../testdo/inheritance_flat/auto/_Role.java     |  30 ++---
 .../testdo/inheritance_flat/auto/_User.java     |   4 +-
 .../inheritance_flat/auto/_UserProperties.java  |  16 +--
 .../auto/_AbstractPerson.java                   |  16 +--
 .../inheritance_people/auto/_Address.java       |  10 +-
 .../inheritance_people/auto/_ClientCompany.java |  10 +-
 .../auto/_CustomerRepresentative.java           |  10 +-
 .../inheritance_people/auto/_Department.java    |  14 +--
 .../inheritance_people/auto/_Employee.java      |  14 +--
 .../inheritance_people/auto/_Manager.java       |   4 +-
 .../inheritance_people/auto/_PersonNotes.java   |  10 +-
 .../inheritance_vertical/auto/_Iv1Root.java     |  12 +-
 .../inheritance_vertical/auto/_Iv1Sub1.java     |   6 +-
 .../inheritance_vertical/auto/_Iv2Root.java     |   6 +-
 .../inheritance_vertical/auto/_Iv2Sub1.java     |   4 +-
 .../inheritance_vertical/auto/_IvAbstract.java  |   6 +-
 .../inheritance_vertical/auto/_IvBase.java      |  12 +-
 .../auto/_IvBaseWithLock.java                   |  12 +-
 .../inheritance_vertical/auto/_IvConcrete.java  |  14 +--
 .../inheritance_vertical/auto/_IvImpl.java      |  20 ++--
 .../auto/_IvImplWithLock.java                   |  10 +-
 .../inheritance_vertical/auto/_IvOther.java     |  14 +--
 .../inheritance_vertical/auto/_IvRoot.java      |  12 +-
 .../inheritance_vertical/auto/_IvSub1.java      |   6 +-
 .../inheritance_vertical/auto/_IvSub1Sub1.java  |   6 +-
 .../inheritance_vertical/auto/_IvSub2.java      |  12 +-
 .../inheritance_vertical/auto/_IvSub3.java      |   6 +-
 .../auto/_Lifecycle.java                        |   6 +-
 .../testdo/lifecycles/auto/_Lifecycles.java     |   6 +-
 .../testdo/lob/auto/_BlobTestEntity.java        |   6 +-
 .../testdo/lob/auto/_ClobTestEntity.java        |  10 +-
 .../testdo/lob/auto/_ClobTestRelation.java      |  16 +--
 .../testdo/lob/auto/_NClobTestEntity.java       |   6 +-
 .../testdo/locking/auto/_LockingHelper.java     |  10 +-
 .../locking/auto/_RelLockingTestEntity.java     |  14 +--
 .../locking/auto/_SimpleLockingTestEntity.java  |  12 +-
 .../testdo/map_to_many/auto/_IdMapToMany.java   |   4 +-
 .../map_to_many/auto/_IdMapToManyTarget.java    |   4 +-
 .../testdo/map_to_many/auto/_MapToMany.java     |   4 +-
 .../map_to_many/auto/_MapToManyTarget.java      |  10 +-
 .../meaningful_pk/auto/_MeaningfulPKDep.java    |  10 +-
 .../meaningful_pk/auto/_MeaningfulPKTest1.java  |  16 +--
 .../meaningful_pk/auto/_MeaningfulPk.java       |   6 +-
 .../testdo/misc_types/auto/_ArraysEntity.java   |  24 ++--
 .../misc_types/auto/_CharacterEntity.java       |   6 +-
 .../misc_types/auto/_SerializableEntity.java    |   6 +-
 .../auto/_MixedPersistenceStrategy.java         |  16 +--
 .../auto/_MixedPersistenceStrategy2.java        |  10 +-
 .../cayenne/testdo/mt/auto/_MtTable1.java       |  16 +--
 .../testdo/mt/auto/_MtTable1Subclass1.java      |   6 +-
 .../testdo/mt/auto/_MtTable1Subclass2.java      |   6 +-
 .../cayenne/testdo/mt/auto/_MtTable2.java       |  14 +--
 .../cayenne/testdo/mt/auto/_MtTable3.java       |  22 ++--
 .../cayenne/testdo/mt/auto/_MtTable4.java       |   4 +-
 .../cayenne/testdo/mt/auto/_MtTable5.java       |   4 +-
 .../testdo/no_pk/auto/_NoPkTestEntity.java      |   6 +-
 .../numeric_types/auto/_BigDecimalEntity.java   |   6 +-
 .../numeric_types/auto/_BigIntegerEntity.java   |   6 +-
 .../auto/_BitNumberTestEntity.java              |   6 +-
 .../numeric_types/auto/_BitTestEntity.java      |   6 +-
 .../numeric_types/auto/_BooleanTestEntity.java  |   6 +-
 .../numeric_types/auto/_DecimalPKTest1.java     |  12 +-
 .../auto/_DecimalPKTestEntity.java              |  12 +-
 .../testdo/numeric_types/auto/_LongEntity.java  |   6 +-
 .../numeric_types/auto/_SmallintTestEntity.java |   6 +-
 .../numeric_types/auto/_TinyintTestEntity.java  |   6 +-
 .../testdo/oneway/auto/_OnewayTable2.java       |  10 +-
 .../testdo/oneway/auto/_OnewayTable3.java       |   4 +-
 .../primitive/auto/_PrimitivesTestEntity.java   |  16 +--
 .../testdo/qualified/auto/_Qualified1.java      |  16 +--
 .../testdo/qualified/auto/_Qualified2.java      |  16 +--
 .../testdo/quotemap/auto/_QuoteAdress.java      |  16 +--
 .../testdo/quotemap/auto/_Quote_Person.java     |  34 +++---
 .../testdo/reflexive/auto/_Reflexive.java       |  14 +--
 .../relationships/auto/_FkOfDifferentType.java  |   4 +-
 .../relationships/auto/_MeaningfulFK.java       |  10 +-
 .../relationships/auto/_ReflexiveAndToOne.java  |  18 +--
 .../relationships/auto/_RelationshipHelper.java |  18 +--
 .../relationships_activity/auto/_Activity.java  |  18 +--
 .../auto/_ActivityResult.java                   |  20 ++--
 .../relationships_child_master/auto/_Child.java |   4 +-
 .../auto/_Master.java                           |  10 +-
 .../relationships_clob/auto/_ClobDetail.java    |  10 +-
 .../relationships_clob/auto/_ClobMaster.java    |  16 +--
 .../auto/_CollectionToMany.java                 |   4 +-
 .../auto/_CollectionToManyTarget.java           |   4 +-
 .../auto/_DeleteRuleFlatA.java                  |   4 +-
 .../auto/_DeleteRuleFlatB.java                  |   4 +-
 .../auto/_DeleteRuleTest1.java                  |   4 +-
 .../auto/_DeleteRuleTest2.java                  |   8 +-
 .../auto/_DeleteRuleTest3.java                  |   4 +-
 .../auto/_FlattenedCircular.java                |   8 +-
 .../auto/_FlattenedTest1.java                   |  26 ++--
 .../auto/_FlattenedTest2.java                   |  14 +--
 .../auto/_FlattenedTest3.java                   |  18 +--
 .../auto/_FlattenedTest4.java                   |  10 +-
 .../auto/_FlattenedTest5.java                   |  10 +-
 .../auto/_SetToMany.java                        |   4 +-
 .../auto/_SetToManyTarget.java                  |   4 +-
 .../auto/_ToManyFkDep.java                      |  20 ++--
 .../auto/_ToManyFkRoot.java                     |  16 +--
 .../auto/_ToManyRoot2.java                      |  10 +-
 .../relationships_to_one_fk/auto/_ToOneFK1.java |   4 +-
 .../relationships_to_one_fk/auto/_ToOneFK2.java |   4 +-
 .../return_types/auto/_ReturnTypesMap1.java     | 120 +++++++++----------
 .../return_types/auto/_ReturnTypesMap2.java     |  24 ++--
 .../return_types/auto/_ReturnTypesMapLobs1.java |  12 +-
 .../testdo/soft_delete/auto/_SoftDelete.java    |  14 +--
 .../table_primitives/auto/_TablePrimitives.java |  12 +-
 .../testdo/testmap/auto/_ArtistCallback.java    |  14 +--
 .../apache/cayenne/testdo/things/auto/_Bag.java |  18 +--
 .../cayenne/testdo/things/auto/_Ball.java       |  20 ++--
 .../apache/cayenne/testdo/things/auto/_Box.java |  22 ++--
 .../cayenne/testdo/things/auto/_BoxInfo.java    |  10 +-
 .../cayenne/testdo/things/auto/_Thing.java      |  20 ++--
 .../cayenne/testdo/toone/auto/_TooneDep.java    |   4 +-
 .../cayenne/testdo/toone/auto/_TooneMaster.java |   4 +-
 .../auto/_Customer.java                         |  10 +-
 .../auto/_Product.java                          |  18 +--
 .../cayenne/testdo/uuid/auto/_UuidPkEntity.java |   6 +-
 .../testdo/uuid/auto/_UuidTestEntity.java       |   6 +-
 .../testdo/weighted_sort/auto/_SortDep.java     |   4 +-
 .../testdo/weighted_sort/auto/_SortRoot.java    |   4 +-
 156 files changed, 883 insertions(+), 883 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
index a85ab78..a124735 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _ArrayTestEntity extends BaseDataObject {
 
     public Double[] getDoubleArray() {
         beforePropertyRead("doubleArray");
-        return doubleArray;
+        return this.doubleArray;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _ArrayTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(doubleArray);
+        out.writeObject(this.doubleArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        doubleArray = (Double[])in.readObject();
+        this.doubleArray = (Double[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
index 3b48e02..4871638 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
@@ -35,7 +35,7 @@ public abstract class _BinaryPKTest1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToBinaryPKDetails(BinaryPKTest2 obj) {
@@ -96,15 +96,15 @@ public abstract class _BinaryPKTest1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(binaryPKDetails);
+        out.writeObject(this.name);
+        out.writeObject(this.binaryPKDetails);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        binaryPKDetails = in.readObject();
+        this.name = (String)in.readObject();
+        this.binaryPKDetails = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
index 37083e0..8165599 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
@@ -34,7 +34,7 @@ public abstract class _BinaryPKTest2 extends BaseDataObject {
 
     public String getDetailName() {
         beforePropertyRead("detailName");
-        return detailName;
+        return this.detailName;
     }
 
     public void setToBinaryPKMaster(BinaryPKTest1 toBinaryPKMaster) {
@@ -90,15 +90,15 @@ public abstract class _BinaryPKTest2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(detailName);
-        out.writeObject(toBinaryPKMaster);
+        out.writeObject(this.detailName);
+        out.writeObject(this.toBinaryPKMaster);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        detailName = (String)in.readObject();
-        toBinaryPKMaster = in.readObject();
+        this.detailName = (String)in.readObject();
+        this.toBinaryPKMaster = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
index 0dc3d02..6361a69 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
@@ -79,13 +79,13 @@ public abstract class _Team extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(teamUsers);
+        out.writeObject(this.teamUsers);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        teamUsers = in.readObject();
+        this.teamUsers = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
index e385c03..fcf1dab 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
@@ -35,7 +35,7 @@ public abstract class _User extends BaseDataObject {
 
     public byte[] getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToUserTeams(Team obj) {
@@ -96,15 +96,15 @@ public abstract class _User extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(userTeams);
+        out.writeObject(this.name);
+        out.writeObject(this.userTeams);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (byte[])in.readObject();
-        userTeams = in.readObject();
+        this.name = (byte[])in.readObject();
+        this.userTeams = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
index 08ce9b3..4d93574 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
@@ -34,7 +34,7 @@ public abstract class _CharFkTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToCharPK(CharPkTestEntity toCharPK) {
@@ -90,15 +90,15 @@ public abstract class _CharFkTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toCharPK);
+        out.writeObject(this.name);
+        out.writeObject(this.toCharPK);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toCharPK = in.readObject();
+        this.name = (String)in.readObject();
+        this.toCharPK = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
index 63c967e..d14d598 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
@@ -37,7 +37,7 @@ public abstract class _CharPkTestEntity extends BaseDataObject {
 
     public String getOtherCol() {
         beforePropertyRead("otherCol");
-        return otherCol;
+        return this.otherCol;
     }
 
     public void setPkCol(String pkCol) {
@@ -47,7 +47,7 @@ public abstract class _CharPkTestEntity extends BaseDataObject {
 
     public String getPkCol() {
         beforePropertyRead("pkCol");
-        return pkCol;
+        return this.pkCol;
     }
 
     public void addToCharFKs(CharFkTestEntity obj) {
@@ -113,17 +113,17 @@ public abstract class _CharPkTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(otherCol);
-        out.writeObject(pkCol);
-        out.writeObject(charFKs);
+        out.writeObject(this.otherCol);
+        out.writeObject(this.pkCol);
+        out.writeObject(this.charFKs);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        otherCol = (String)in.readObject();
-        pkCol = (String)in.readObject();
-        charFKs = in.readObject();
+        this.otherCol = (String)in.readObject();
+        this.pkCol = (String)in.readObject();
+        this.charFKs = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
index 4ea2475..cf2f6f3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
@@ -34,7 +34,7 @@ public abstract class _CompoundFkTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToCompoundPk(CompoundPkTestEntity toCompoundPk) {
@@ -90,15 +90,15 @@ public abstract class _CompoundFkTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toCompoundPk);
+        out.writeObject(this.name);
+        out.writeObject(this.toCompoundPk);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toCompoundPk = in.readObject();
+        this.name = (String)in.readObject();
+        this.toCompoundPk = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
index 54dfcce..f067bf9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
@@ -40,7 +40,7 @@ public abstract class _CompoundPkTestEntity extends BaseDataObject {
 
     public String getKey1() {
         beforePropertyRead("key1");
-        return key1;
+        return this.key1;
     }
 
     public void setKey2(String key2) {
@@ -50,7 +50,7 @@ public abstract class _CompoundPkTestEntity extends BaseDataObject {
 
     public String getKey2() {
         beforePropertyRead("key2");
-        return key2;
+        return this.key2;
     }
 
     public void setName(String name) {
@@ -60,7 +60,7 @@ public abstract class _CompoundPkTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToCompoundFkArray(CompoundFkTestEntity obj) {
@@ -131,19 +131,19 @@ public abstract class _CompoundPkTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(key1);
-        out.writeObject(key2);
-        out.writeObject(name);
-        out.writeObject(compoundFkArray);
+        out.writeObject(this.key1);
+        out.writeObject(this.key2);
+        out.writeObject(this.name);
+        out.writeObject(this.compoundFkArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        key1 = (String)in.readObject();
-        key2 = (String)in.readObject();
-        name = (String)in.readObject();
-        compoundFkArray = in.readObject();
+        this.key1 = (String)in.readObject();
+        this.key2 = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.compoundFkArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
index 2cd2fcc..fe87795 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
@@ -32,7 +32,7 @@ public abstract class _CalendarEntity extends BaseDataObject {
 
     public Calendar getCalendarField() {
         beforePropertyRead("calendarField");
-        return calendarField;
+        return this.calendarField;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _CalendarEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(calendarField);
+        out.writeObject(this.calendarField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        calendarField = (Calendar)in.readObject();
+        this.calendarField = (Calendar)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
index 976108a..222211f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
@@ -36,7 +36,7 @@ public abstract class _DateTestEntity extends BaseDataObject {
 
     public Date getDateColumn() {
         beforePropertyRead("dateColumn");
-        return dateColumn;
+        return this.dateColumn;
     }
 
     public void setTimeColumn(Date timeColumn) {
@@ -46,7 +46,7 @@ public abstract class _DateTestEntity extends BaseDataObject {
 
     public Date getTimeColumn() {
         beforePropertyRead("timeColumn");
-        return timeColumn;
+        return this.timeColumn;
     }
 
     public void setTimestampColumn(Date timestampColumn) {
@@ -56,7 +56,7 @@ public abstract class _DateTestEntity extends BaseDataObject {
 
     public Date getTimestampColumn() {
         beforePropertyRead("timestampColumn");
-        return timestampColumn;
+        return this.timestampColumn;
     }
 
     @Override
@@ -109,17 +109,17 @@ public abstract class _DateTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(dateColumn);
-        out.writeObject(timeColumn);
-        out.writeObject(timestampColumn);
+        out.writeObject(this.dateColumn);
+        out.writeObject(this.timeColumn);
+        out.writeObject(this.timestampColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        dateColumn = (Date)in.readObject();
-        timeColumn = (Date)in.readObject();
-        timestampColumn = (Date)in.readObject();
+        this.dateColumn = (Date)in.readObject();
+        this.timeColumn = (Date)in.readObject();
+        this.timestampColumn = (Date)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
index ad8fe6b..3117203 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
@@ -38,7 +38,7 @@ public abstract class _CrossdbM1E1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFlattened(CrossdbM2E1 obj) {
@@ -117,17 +117,17 @@ public abstract class _CrossdbM1E1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(flattened);
-        out.writeObject(listOfM2E2);
+        out.writeObject(this.name);
+        out.writeObject(this.flattened);
+        out.writeObject(this.listOfM2E2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        flattened = in.readObject();
-        listOfM2E2 = in.readObject();
+        this.name = (String)in.readObject();
+        this.flattened = in.readObject();
+        this.listOfM2E2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
index 57031a7..c090fac 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
@@ -35,7 +35,7 @@ public abstract class _CrossdbM2E1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToListOfM2E2(CrossdbM2E2 obj) {
@@ -96,15 +96,15 @@ public abstract class _CrossdbM2E1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(listOfM2E2);
+        out.writeObject(this.name);
+        out.writeObject(this.listOfM2E2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        listOfM2E2 = in.readObject();
+        this.name = (String)in.readObject();
+        this.listOfM2E2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
index d1b020c..53762db 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
@@ -37,7 +37,7 @@ public abstract class _CrossdbM2E2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToM1E1(CrossdbM1E1 toM1E1) {
@@ -106,17 +106,17 @@ public abstract class _CrossdbM2E2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toM1E1);
-        out.writeObject(toM2E1);
+        out.writeObject(this.name);
+        out.writeObject(this.toM1E1);
+        out.writeObject(this.toM2E1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toM1E1 = in.readObject();
-        toM2E1 = in.readObject();
+        this.name = (String)in.readObject();
+        this.toM1E1 = in.readObject();
+        this.toM2E1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
index 8a5e586..3435644 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteCascade.java
@@ -34,7 +34,7 @@ public abstract class _DeleteCascade extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setCascade(DeleteRule cascade) {
@@ -90,15 +90,15 @@ public abstract class _DeleteCascade extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(cascade);
+        out.writeObject(this.name);
+        out.writeObject(this.cascade);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        cascade = in.readObject();
+        this.name = (String)in.readObject();
+        this.cascade = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
index 20a733e..c7906c7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteDeny.java
@@ -34,7 +34,7 @@ public abstract class _DeleteDeny extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setDeny(DeleteRule deny) {
@@ -90,15 +90,15 @@ public abstract class _DeleteDeny extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(deny);
+        out.writeObject(this.name);
+        out.writeObject(this.deny);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        deny = in.readObject();
+        this.name = (String)in.readObject();
+        this.deny = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
index 8695107..f5dbfd5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteNullify.java
@@ -34,7 +34,7 @@ public abstract class _DeleteNullify extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setNullify(DeleteRule nullify) {
@@ -90,15 +90,15 @@ public abstract class _DeleteNullify extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(nullify);
+        out.writeObject(this.name);
+        out.writeObject(this.nullify);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        nullify = in.readObject();
+        this.name = (String)in.readObject();
+        this.nullify = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
index 9ede774..0c1429b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/deleterules/auto/_DeleteRule.java
@@ -41,7 +41,7 @@ public abstract class _DeleteRule extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToFromCascade(DeleteCascade obj) {
@@ -138,19 +138,19 @@ public abstract class _DeleteRule extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(fromCascade);
-        out.writeObject(fromDeny);
-        out.writeObject(fromNullify);
+        out.writeObject(this.name);
+        out.writeObject(this.fromCascade);
+        out.writeObject(this.fromDeny);
+        out.writeObject(this.fromNullify);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        fromCascade = in.readObject();
-        fromDeny = in.readObject();
-        fromNullify = in.readObject();
+        this.name = (String)in.readObject();
+        this.fromCascade = in.readObject();
+        this.fromDeny = in.readObject();
+        this.fromNullify = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
index 272c4f0..2634b64 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java
@@ -36,7 +36,7 @@ public abstract class _EmbedEntity1 extends BaseDataObject {
 
     public Embeddable1 getEmbedded1() {
         beforePropertyRead("embedded1");
-        return embedded1;
+        return this.embedded1;
     }
 
     public void setEmbedded2(Embeddable1 embedded2) {
@@ -46,7 +46,7 @@ public abstract class _EmbedEntity1 extends BaseDataObject {
 
     public Embeddable1 getEmbedded2() {
         beforePropertyRead("embedded2");
-        return embedded2;
+        return this.embedded2;
     }
 
     public void setName(String name) {
@@ -56,7 +56,7 @@ public abstract class _EmbedEntity1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -109,17 +109,17 @@ public abstract class _EmbedEntity1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(embedded1);
-        out.writeObject(embedded2);
-        out.writeObject(name);
+        out.writeObject(this.embedded1);
+        out.writeObject(this.embedded2);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        embedded1 = (Embeddable1)in.readObject();
-        embedded2 = (Embeddable1)in.readObject();
-        name = (String)in.readObject();
+        this.embedded1 = (Embeddable1)in.readObject();
+        this.embedded2 = (Embeddable1)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
index 7b99a25..f8bd14f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity.java
@@ -32,7 +32,7 @@ public abstract class _EnumEntity extends BaseDataObject {
 
     public Enum1 getEnumAttribute() {
         beforePropertyRead("enumAttribute");
-        return enumAttribute;
+        return this.enumAttribute;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _EnumEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(enumAttribute);
+        out.writeObject(this.enumAttribute);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        enumAttribute = (Enum1)in.readObject();
+        this.enumAttribute = (Enum1)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
index 9f12732..a93919c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/auto/_ExtendedTypeEntity.java
@@ -32,7 +32,7 @@ public abstract class _ExtendedTypeEntity extends BaseDataObject {
 
     public StringET1 getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _ExtendedTypeEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (StringET1)in.readObject();
+        this.name = (StringET1)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
index 9eaad43..5c1aef0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompKey.java
@@ -36,7 +36,7 @@ public abstract class _GeneratedColumnCompKey extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToMaster(GeneratedColumnCompMaster toMaster) {
@@ -92,15 +92,15 @@ public abstract class _GeneratedColumnCompKey extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toMaster);
+        out.writeObject(this.name);
+        out.writeObject(this.toMaster);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toMaster = in.readObject();
+        this.name = (String)in.readObject();
+        this.toMaster = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
index f0bb5c8..4fea41e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnCompMaster.java
@@ -35,7 +35,7 @@ public abstract class _GeneratedColumnCompMaster extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToToDetail(GeneratedColumnCompKey obj) {
@@ -96,15 +96,15 @@ public abstract class _GeneratedColumnCompMaster extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toDetail);
+        out.writeObject(this.name);
+        out.writeObject(this.toDetail);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toDetail = in.readObject();
+        this.name = (String)in.readObject();
+        this.toDetail = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
index fb8b70d..ee7850f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnDep.java
@@ -34,7 +34,7 @@ public abstract class _GeneratedColumnDep extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToMaster(GeneratedColumnTestEntity toMaster) {
@@ -90,15 +90,15 @@ public abstract class _GeneratedColumnDep extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toMaster);
+        out.writeObject(this.name);
+        out.writeObject(this.toMaster);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toMaster = in.readObject();
+        this.name = (String)in.readObject();
+        this.toMaster = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
index 10b1a1a..234e117 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTest2.java
@@ -31,7 +31,7 @@ public abstract class _GeneratedColumnTest2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _GeneratedColumnTest2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
index 7888c4c..22afbcb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedColumnTestEntity.java
@@ -34,7 +34,7 @@ public abstract class _GeneratedColumnTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToDep(GeneratedColumnDep toDep) {
@@ -90,15 +90,15 @@ public abstract class _GeneratedColumnTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toDep);
+        out.writeObject(this.name);
+        out.writeObject(this.toDep);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toDep = in.readObject();
+        this.name = (String)in.readObject();
+        this.toDep = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
index 1a80442..7992e7a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF1.java
@@ -79,13 +79,13 @@ public abstract class _GeneratedF1 extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(f2);
+        out.writeObject(this.f2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        f2 = in.readObject();
+        this.f2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
index 0b33d82..bacfdbe 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/generated/auto/_GeneratedF2.java
@@ -79,13 +79,13 @@ public abstract class _GeneratedF2 extends CayenneDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(f1);
+        out.writeObject(this.f1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        f1 = in.readObject();
+        this.f1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
index 3bbedab..a70dd14 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_BaseEntity.java
@@ -37,7 +37,7 @@ public abstract class _BaseEntity extends BaseDataObject {
 
     public String getEntityType() {
         beforePropertyRead("entityType");
-        return entityType;
+        return this.entityType;
     }
 
     public void setToDirectToSubEntity(DirectToSubEntity toDirectToSubEntity) {
@@ -106,17 +106,17 @@ public abstract class _BaseEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(entityType);
-        out.writeObject(toDirectToSubEntity);
-        out.writeObject(toRelatedEntity);
+        out.writeObject(this.entityType);
+        out.writeObject(this.toDirectToSubEntity);
+        out.writeObject(this.toRelatedEntity);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        entityType = (String)in.readObject();
-        toDirectToSubEntity = in.readObject();
-        toRelatedEntity = in.readObject();
+        this.entityType = (String)in.readObject();
+        this.toDirectToSubEntity = in.readObject();
+        this.toRelatedEntity = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
index 999e686..1ba3c89 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_DirectToSubEntity.java
@@ -79,13 +79,13 @@ public abstract class _DirectToSubEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(subEntities);
+        out.writeObject(this.subEntities);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        subEntities = in.readObject();
+        this.subEntities = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
index 47f0dea..0d6788b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance/auto/_RelatedEntity.java
@@ -100,15 +100,15 @@ public abstract class _RelatedEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(baseEntities);
-        out.writeObject(subEntities);
+        out.writeObject(this.baseEntities);
+        out.writeObject(this.subEntities);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        baseEntities = in.readObject();
-        subEntities = in.readObject();
+        this.baseEntities = in.readObject();
+        this.subEntities = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
index 61a2296..72ce986 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Group.java
@@ -95,15 +95,15 @@ public abstract class _Group extends User {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(groupMembers);
-        out.writeObject(groupProperties);
+        out.writeObject(this.groupMembers);
+        out.writeObject(this.groupProperties);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        groupMembers = in.readObject();
-        groupProperties = in.readObject();
+        this.groupMembers = in.readObject();
+        this.groupProperties = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
index 8542516..2d4eece 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_GroupProperties.java
@@ -36,7 +36,7 @@ public abstract class _GroupProperties extends BaseDataObject {
 
     public String getDescription() {
         beforePropertyRead("description");
-        return description;
+        return this.description;
     }
 
     public void setId(Long id) {
@@ -46,7 +46,7 @@ public abstract class _GroupProperties extends BaseDataObject {
 
     public Long getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     public void setGroup(Group group) {
@@ -107,17 +107,17 @@ public abstract class _GroupProperties extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(description);
-        out.writeObject(id);
-        out.writeObject(group);
+        out.writeObject(this.description);
+        out.writeObject(this.id);
+        out.writeObject(this.group);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        description = (String)in.readObject();
-        id = (Long)in.readObject();
-        group = in.readObject();
+        this.description = (String)in.readObject();
+        this.id = (Long)in.readObject();
+        this.group = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
index 772d63c..c973436 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_Role.java
@@ -39,7 +39,7 @@ public abstract class _Role extends BaseDataObject {
 
     public long getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     public void setName(String name) {
@@ -49,7 +49,7 @@ public abstract class _Role extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setType(int type) {
@@ -59,7 +59,7 @@ public abstract class _Role extends BaseDataObject {
 
     public int getType() {
         beforePropertyRead("type");
-        return type;
+        return this.type;
     }
 
     public void addToRoleGroups(Group obj) {
@@ -75,9 +75,9 @@ public abstract class _Role extends BaseDataObject {
         return (List<Group>)readProperty("roleGroups");
     }
 
-protected abstract void onPostPersist();
+    protected abstract void onPostPersist();
 
-protected abstract void onPostUpdate();
+    protected abstract void onPostUpdate();
 
     @Override
     public Object readPropertyDirectly(String propName) {
@@ -107,13 +107,13 @@ protected abstract void onPostUpdate();
 
         switch (propName) {
             case "id":
-                this.id = (Long)val;
+                this.id = val == null ? 0 : (Long)val;
                 break;
             case "name":
                 this.name = (String)val;
                 break;
             case "type":
-                this.type = (Integer)val;
+                this.type = val == null ? 0 : (Integer)val;
                 break;
             case "roleGroups":
                 this.roleGroups = val;
@@ -134,19 +134,19 @@ protected abstract void onPostUpdate();
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeLong(id);
-        out.writeObject(name);
-        out.writeInt(type);
-        out.writeObject(roleGroups);
+        out.writeLong(this.id);
+        out.writeObject(this.name);
+        out.writeInt(this.type);
+        out.writeObject(this.roleGroups);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        id = in.readLong();
-        name = (String)in.readObject();
-        type = in.readInt();
-        roleGroups = in.readObject();
+        this.id = in.readLong();
+        this.name = (String)in.readObject();
+        this.type = in.readInt();
+        this.roleGroups = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
index 6a0b8d2..94772b7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_User.java
@@ -73,13 +73,13 @@ public abstract class _User extends Role {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(userProperties);
+        out.writeObject(this.userProperties);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        userProperties = in.readObject();
+        this.userProperties = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
index 61777ba..c1963bc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_flat/auto/_UserProperties.java
@@ -36,7 +36,7 @@ public abstract class _UserProperties extends BaseDataObject {
 
     public Long getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     public void setNickname(String nickname) {
@@ -46,7 +46,7 @@ public abstract class _UserProperties extends BaseDataObject {
 
     public String getNickname() {
         beforePropertyRead("nickname");
-        return nickname;
+        return this.nickname;
     }
 
     public void setUser(User user) {
@@ -107,17 +107,17 @@ public abstract class _UserProperties extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(id);
-        out.writeObject(nickname);
-        out.writeObject(user);
+        out.writeObject(this.id);
+        out.writeObject(this.nickname);
+        out.writeObject(this.user);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        id = (Long)in.readObject();
-        nickname = (String)in.readObject();
-        user = in.readObject();
+        this.id = (Long)in.readObject();
+        this.nickname = (String)in.readObject();
+        this.user = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
index e7dba28..01c4534 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_AbstractPerson.java
@@ -37,7 +37,7 @@ public abstract class _AbstractPerson extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setPersonType(String personType) {
@@ -47,7 +47,7 @@ public abstract class _AbstractPerson extends BaseDataObject {
 
     public String getPersonType() {
         beforePropertyRead("personType");
-        return personType;
+        return this.personType;
     }
 
     public void addToNotes(PersonNotes obj) {
@@ -113,17 +113,17 @@ public abstract class _AbstractPerson extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(personType);
-        out.writeObject(notes);
+        out.writeObject(this.name);
+        out.writeObject(this.personType);
+        out.writeObject(this.notes);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        personType = (String)in.readObject();
-        notes = in.readObject();
+        this.name = (String)in.readObject();
+        this.personType = (String)in.readObject();
+        this.notes = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
index a8e18db..a322e28 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Address.java
@@ -34,7 +34,7 @@ public abstract class _Address extends BaseDataObject {
 
     public String getCity() {
         beforePropertyRead("city");
-        return city;
+        return this.city;
     }
 
     public void setToEmployee(Employee toEmployee) {
@@ -90,15 +90,15 @@ public abstract class _Address extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(city);
-        out.writeObject(toEmployee);
+        out.writeObject(this.city);
+        out.writeObject(this.toEmployee);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        city = (String)in.readObject();
-        toEmployee = in.readObject();
+        this.city = (String)in.readObject();
+        this.toEmployee = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
index 856cfa9..ac6fee3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_ClientCompany.java
@@ -35,7 +35,7 @@ public abstract class _ClientCompany extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToRepresentatives(CustomerRepresentative obj) {
@@ -96,15 +96,15 @@ public abstract class _ClientCompany extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(representatives);
+        out.writeObject(this.name);
+        out.writeObject(this.representatives);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        representatives = in.readObject();
+        this.name = (String)in.readObject();
+        this.representatives = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
index a2e0f3b..eb62f6d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_CustomerRepresentative.java
@@ -34,7 +34,7 @@ public abstract class _CustomerRepresentative extends AbstractPerson {
 
     public String getClientContactType() {
         beforePropertyRead("clientContactType");
-        return clientContactType;
+        return this.clientContactType;
     }
 
     public void setToClientCompany(ClientCompany toClientCompany) {
@@ -90,15 +90,15 @@ public abstract class _CustomerRepresentative extends AbstractPerson {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(clientContactType);
-        out.writeObject(toClientCompany);
+        out.writeObject(this.clientContactType);
+        out.writeObject(this.toClientCompany);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        clientContactType = (String)in.readObject();
-        toClientCompany = in.readObject();
+        this.clientContactType = (String)in.readObject();
+        this.toClientCompany = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
index b379e04..4794ff3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Department.java
@@ -38,7 +38,7 @@ public abstract class _Department extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToEmployees(Employee obj) {
@@ -112,17 +112,17 @@ public abstract class _Department extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(employees);
-        out.writeObject(toManager);
+        out.writeObject(this.name);
+        out.writeObject(this.employees);
+        out.writeObject(this.toManager);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        employees = in.readObject();
-        toManager = in.readObject();
+        this.name = (String)in.readObject();
+        this.employees = in.readObject();
+        this.toManager = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
index 81c6d93..871a2bf 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Employee.java
@@ -38,7 +38,7 @@ public abstract class _Employee extends AbstractPerson {
 
     public Float getSalary() {
         beforePropertyRead("salary");
-        return salary;
+        return this.salary;
     }
 
     public void addToAddresses(Address obj) {
@@ -112,17 +112,17 @@ public abstract class _Employee extends AbstractPerson {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(salary);
-        out.writeObject(addresses);
-        out.writeObject(toDepartment);
+        out.writeObject(this.salary);
+        out.writeObject(this.addresses);
+        out.writeObject(this.toDepartment);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        salary = (Float)in.readObject();
-        addresses = in.readObject();
-        toDepartment = in.readObject();
+        this.salary = (Float)in.readObject();
+        this.addresses = in.readObject();
+        this.toDepartment = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
index cad5dbf..e87f87a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_Manager.java
@@ -79,13 +79,13 @@ public abstract class _Manager extends Employee {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(managedDepartments);
+        out.writeObject(this.managedDepartments);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        managedDepartments = in.readObject();
+        this.managedDepartments = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
index 951773f..a4d02fe 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_people/auto/_PersonNotes.java
@@ -34,7 +34,7 @@ public abstract class _PersonNotes extends BaseDataObject {
 
     public String getNotes() {
         beforePropertyRead("notes");
-        return notes;
+        return this.notes;
     }
 
     public void setPerson(AbstractPerson person) {
@@ -90,15 +90,15 @@ public abstract class _PersonNotes extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(notes);
-        out.writeObject(person);
+        out.writeObject(this.notes);
+        out.writeObject(this.person);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        notes = (String)in.readObject();
-        person = in.readObject();
+        this.notes = (String)in.readObject();
+        this.person = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
index 9a2c384..49ead06 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
@@ -33,7 +33,7 @@ public abstract class _Iv1Root extends BaseDataObject {
 
     public String getDiscriminator() {
         beforePropertyRead("discriminator");
-        return discriminator;
+        return this.discriminator;
     }
 
     public void setName(String name) {
@@ -43,7 +43,7 @@ public abstract class _Iv1Root extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _Iv1Root extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(discriminator);
-        out.writeObject(name);
+        out.writeObject(this.discriminator);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        discriminator = (String)in.readObject();
-        name = (String)in.readObject();
+        this.discriminator = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
index 9087579..d4e86e9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
@@ -31,7 +31,7 @@ public abstract class _Iv1Sub1 extends Iv1Root {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _Iv1Sub1 extends Iv1Root {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
index 84434f5..824b3c7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
@@ -31,7 +31,7 @@ public abstract class _Iv2Root extends BaseDataObject {
 
     public String getDiscriminator() {
         beforePropertyRead("discriminator");
-        return discriminator;
+        return this.discriminator;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _Iv2Root extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(discriminator);
+        out.writeObject(this.discriminator);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        discriminator = (String)in.readObject();
+        this.discriminator = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
index 7fccf6c..a689f84 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
@@ -73,13 +73,13 @@ public abstract class _Iv2Sub1 extends Iv2Root {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(x);
+        out.writeObject(this.x);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        x = in.readObject();
+        this.x = in.readObject();
     }
 
 }


[09/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
index 6a0c23e..41e18ff 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
@@ -19,138 +19,37 @@
 
 package org.apache.cayenne;
 
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.reflect.PropertyUtils;
-import org.apache.cayenne.validation.BeanValidationFailure;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
 /**
- * A default implementation of DataObject interface. It is normally used as a
- * superclass of Cayenne persistent objects.
+ * Implementation of DataObject that uses {@link Map} to store object fields.
+ * This implementation was pre 4.1 default.
  */
-public class CayenneDataObject extends PersistentObject implements DataObject, Validating {
+public class CayenneDataObject extends BaseDataObject {
 
 	private static final long serialVersionUID = -313743913882350400L;
 
-	protected long snapshotVersion = DEFAULT_VERSION;
-
 	protected Map<String, Object> values = new HashMap<>();
 
 	@Override
 	public void setPersistenceState(int persistenceState) {
-		this.persistenceState = persistenceState;
-
+		super.setPersistenceState(persistenceState);
+		// additionally clear values for HOLLOW state
 		if (persistenceState == PersistenceState.HOLLOW) {
 			values.clear();
 		}
 	}
 
-	/**
-	 * Returns a value of the property identified by a property path. Supports
-	 * reading both mapped and unmapped properties. Unmapped properties are
-	 * accessed in a manner consistent with JavaBeans specification.
-	 * <p>
-	 * Property path (or nested property) is a dot-separated path used to
-	 * traverse object relationships until the final object is found. If a null
-	 * object found while traversing path, null is returned. If a list is
-	 * encountered in the middle of the path, CayenneRuntimeException is thrown.
-	 * Unlike {@link #readPropertyDirectly(String)}, this method will resolve an
-	 * object if it is HOLLOW.
-	 * <p>
-	 * Examples:
-	 * </p>
-	 * <ul>
-	 * <li>Read this object property:<br>
-	 * <code>String name = (String)artist.readNestedProperty("name");</code><br>
-	 * <br>
-	 * </li>
-	 * <li>Read an object related to this object:<br>
-	 * <code>Gallery g = (Gallery)paintingInfo.readNestedProperty("toPainting.toGallery");</code>
-	 * <br>
-	 * <br>
-	 * </li>
-	 * <li>Read a property of an object related to this object: <br>
-	 * <code>String name = (String)painting.readNestedProperty("toArtist.artistName");</code>
-	 * <br>
-	 * <br>
-	 * </li>
-	 * <li>Read to-many relationship list:<br>
-	 * <code>List exhibits = (List)painting.readNestedProperty("toGallery.exhibitArray");</code>
-	 * <br>
-	 * <br>
-	 * </li>
-	 * <li>Read to-many relationship in the middle of the path:<br>
-	 * <code>List&lt;String&gt; names = (List&lt;String&gt;)artist.readNestedProperty("paintingArray.paintingName");</code>
-	 * <br>
-	 * <br>
-	 * </li>
-	 * </ul>
-	 * 
-	 * @since 1.0.5
-	 */
-	public Object readNestedProperty(String path) {
-
-		if ((null == path) || (0 == path.length())) {
-			throw new IllegalArgumentException("the path must be supplied in order to lookup a nested property");
-		}
-
-		int dotIndex = path.indexOf('.');
-
-		if (0 == dotIndex) {
-			throw new IllegalArgumentException("the path is invalid because it starts with a period character");
-		}
-
-		if (dotIndex == path.length() - 1) {
-			throw new IllegalArgumentException("the path is invalid because it ends with a period character");
-		}
-
-		if (-1 == dotIndex) {
-			return readSimpleProperty(path);
-		}
-
-		String path0 = path.substring(0, dotIndex);
-		String pathRemainder = path.substring(dotIndex + 1);
-
-		// this is copied from the old code where the placement of a plus
-		// character at the end of a segment of a property path would
-		// simply strip out the plus. I am not entirely sure why this is
-		// done. See unit test 'testReadNestedPropertyToManyInMiddle1'.
-
-		if ('+' == path0.charAt(path0.length() - 1)) {
-			path0 = path0.substring(0, path0.length() - 1);
-		}
-
-		Object property = readSimpleProperty(path0);
-
-		if (property == null) {
-			return null;
-		} else if (property instanceof DataObject) {
-			return ((DataObject) property).readNestedProperty(pathRemainder);
-		} else {
-			return Cayenne.readNestedProperty(property, pathRemainder);
-		}
-	}
-
-	private final Object readSimpleProperty(String property) {
+	@Override
+	Object readSimpleProperty(String property) {
 
 		// side effect - resolves HOLLOW object
 		Object object = readProperty(property);
@@ -164,303 +63,17 @@ public class CayenneDataObject extends PersistentObject implements DataObject, V
 		return object;
 	}
 
-	public Object readProperty(String propertyName) {
-		if (objectContext != null) {
-			// will resolve faults ourselves below as checking class descriptors
-			// for the
-			// "lazyFaulting" flag is inefficient. Passing "false" here to
-			// suppress fault
-			// processing
-			objectContext.prepareForAccess(this, propertyName, false);
-		}
-
-		Object object = readPropertyDirectly(propertyName);
-
-		if (object instanceof Fault) {
-			object = ((Fault) object).resolveFault(this, propertyName);
-			writePropertyDirectly(propertyName, object);
-		}
-
-		return object;
-	}
-
+	@Override
 	public Object readPropertyDirectly(String propName) {
 		return values.get(propName);
 	}
 
-	public void writeProperty(String propName, Object val) {
-		if (objectContext != null) {
-			// pass "false" to avoid unneeded fault processing
-			objectContext.prepareForAccess(this, propName, false);
-
-			// note how we notify ObjectContext of change BEFORE the object is
-			// actually
-			// changed... this is needed to take a valid current snapshot
-			Object oldValue = readPropertyDirectly(propName);
-			objectContext.propertyChanged(this, propName, oldValue, val);
-		}
-
-		writePropertyDirectly(propName, val);
-	}
-
+	@Override
 	public void writePropertyDirectly(String propName, Object val) {
 		values.put(propName, val);
 	}
 
-	public void removeToManyTarget(String relName, DataObject value, boolean setReverse) {
-
-		// Now do the rest of the normal handling (regardless of whether it was
-		// flattened or not)
-		Object holder = readProperty(relName);
-
-		// call 'propertyChanged' AFTER readProperty as readProperty ensures
-		// that this
-		// object fault is resolved
-		getObjectContext().propertyChanged(this, relName, value, null);
-
-		// TODO: andrus 8/20/2007 - can we optimize this somehow, avoiding type
-		// checking??
-		if (holder instanceof Collection) {
-			((Collection<Object>) holder).remove(value);
-		} else if (holder instanceof Map) {
-			((Map<Object, Object>) holder).remove(getMapKey(relName, value));
-		}
-
-		if (value != null && setReverse) {
-			unsetReverseRelationship(relName, value);
-		}
-	}
-
-	public void addToManyTarget(String relName, DataObject value, boolean setReverse) {
-		if (value == null) {
-			throw new NullPointerException("Attempt to add null target DataObject.");
-		}
-
-		willConnect(relName, value);
-
-		// Now do the rest of the normal handling (regardless of whether it was
-		// flattened or not)
-		Object holder = readProperty(relName);
-
-		// call 'propertyChanged' AFTER readProperty as readProperty ensures
-		// that this
-		// object fault is resolved
-		getObjectContext().propertyChanged(this, relName, null, value);
-
-		// TODO: andrus 8/20/2007 - can we optimize this somehow, avoiding type
-		// checking??
-		if (holder instanceof Collection) {
-			((Collection<Object>) holder).add(value);
-		} else if (holder instanceof Map) {
-			((Map<Object, Object>) holder).put(getMapKey(relName, value), value);
-		}
-
-		if (setReverse) {
-			setReverseRelationship(relName, value);
-		}
-	}
-
-	/**
-	 * Sets the relationships to the specified <code>DataObject</code> objects.
-	 * 
-	 * <p>
-	 * New relationships will be created with
-	 * {@link #addToManyTarget(String, org.apache.cayenne.DataObject, boolean)},
-	 * already established relationships stay untouched. Missing relationships
-	 * will be removed with
-	 * {@link #removeToManyTarget(String, org.apache.cayenne.DataObject, boolean)}
-	 * and returnd as List. You may delete them manually.
-	 * </p>
-	 * 
-	 * <p>
-	 * Notice: Moving an object relationship to another object, is still needing
-	 * an manually "unregister" from the first object by
-	 * {@link #removeToManyTarget(String, org.apache.cayenne.DataObject, boolean)}
-	 * </p>
-	 * 
-	 * @param relName
-	 *            name of the relation
-	 * @param values
-	 *            <code>DataObject</code> objects of this
-	 *            <code>Collection</code> are set to the object. No changes will
-	 *            be made to the the <code>Collection</code>, a copy is used. It
-	 *            is safe to pass a persisted <code>Collection</code> of another
-	 *            object.
-	 * @param setReverse
-	 *            update reverse relationships
-	 * @return <code>List&lt;? extends DataObject&gt;</code> of unrelated
-	 *         DataObjects. If no relationship was removed an empty List is
-	 *         returned.
-	 * @throws IllegalArgumentException
-	 *             if no relationship could be read by relName, or if the passed
-	 *             <code>Collection</code> is null. To clear all relationships
-	 *             use an empty <code>Collection</code>
-	 * @throws UnsupportedOperationException
-	 *             if the relation Collection Type is neither
-	 *             <code>java.util.Collection</code> nor
-	 *             <code>java.util.Map</code>
-	 * @since 4.0
-	 */
-	@SuppressWarnings("unchecked")
-	public List<? extends DataObject> setToManyTarget(String relName, Collection<? extends DataObject> values,
-			boolean setReverse) {
-		if (values == null) {
-			throw new IllegalArgumentException("values Collection is null. To clear all relationships use an empty Collection");
-		}
-
-		Object property = readProperty(relName);
-		if(property == null) {
-			throw new IllegalArgumentException("unknown relName " + relName);
-		}
-		Collection<DataObject> old = null;
-		if (property instanceof Map) {
-			old = ((Map) property).values();
-		} else if (property instanceof Collection) {
-			old = (Collection) property;
-		} else {
-			throw new UnsupportedOperationException("setToManyTarget operates only with Map or Collection types");
-		}
-
-		// operate on a copy of passed collection
-		values = new ArrayList<>(values);
-
-		List<DataObject> removedObjects = new ArrayList<>();
-
-		// remove all relationships, which are missing in passed collection
-		Object[] oldValues = old.toArray();
-		for (Object obj : oldValues) {
-			if (!values.contains(obj)) {
-				DataObject obj2 = (DataObject) obj;
-				removeToManyTarget(relName, obj2, setReverse);
-				// collect objects whose relationship was removed
-				removedObjects.add((DataObject) obj2);
-			}
-		}
-
-		// dont add elements which are already present
-		for (Object obj : old) {
-			values.remove(obj);
-		}
-
-		// add new elements
-		for (DataObject obj : values) {
-			addToManyTarget(relName, obj, setReverse);
-		}
-
-		return removedObjects;
-	}
-
-	public void setToOneTarget(String relationshipName, DataObject value, boolean setReverse) {
-
-		willConnect(relationshipName, value);
-
-		Object oldTarget = readProperty(relationshipName);
-		if (oldTarget == value) {
-			return;
-		}
-
-		getObjectContext().propertyChanged(this, relationshipName, oldTarget, value);
-
-		if (setReverse) {
-			// unset old reverse relationship
-			if (oldTarget instanceof DataObject) {
-				unsetReverseRelationship(relationshipName, (DataObject) oldTarget);
-			}
-
-			// set new reverse relationship
-			if (value != null) {
-				setReverseRelationship(relationshipName, value);
-			}
-		}
-
-		objectContext.prepareForAccess(this, relationshipName, false);
-		writePropertyDirectly(relationshipName, value);
-	}
-
-	/**
-	 * Called before establishing a relationship with another object. Applies
-	 * "persistence by reachability" logic, pulling one of the two objects to a
-	 * DataConext of another object in case one of the objects is transient. If
-	 * both objects are persistent, and they don't have the same DataContext,
-	 * CayenneRuntimeException is thrown.
-	 * 
-	 * @since 1.2
-	 */
-	protected void willConnect(String relationshipName, Persistent object) {
-		// first handle most common case - both objects are in the same
-		// ObjectContext or target is null
-		if (object == null || this.getObjectContext() == object.getObjectContext()) {
-			return;
-		} else if (this.getObjectContext() == null && object.getObjectContext() != null) {
-			object.getObjectContext().registerNewObject(this);
-		} else if (this.getObjectContext() != null && object.getObjectContext() == null) {
-			this.getObjectContext().registerNewObject(object);
-		} else {
-			throw new CayenneRuntimeException("Cannot set object as destination of relationship %s"
-					+ " because it is in a different ObjectContext",  relationshipName);
-		}
-	}
-
-	/**
-	 * Initializes reverse relationship from object <code>val</code> to this
-	 * object.
-	 * 
-	 * @param relName
-	 *            name of relationship from this object to <code>val</code>.
-	 */
-	protected void setReverseRelationship(String relName, DataObject val) {
-		ObjRelationship rel = objectContext.getEntityResolver().getObjEntity(objectId.getEntityName())
-				.getRelationship(relName);
-		ObjRelationship revRel = rel.getReverseRelationship();
-		if (revRel != null) {
-			if (revRel.isToMany())
-				val.addToManyTarget(revRel.getName(), this, false);
-			else
-				val.setToOneTarget(revRel.getName(), this, false);
-		}
-	}
-
-	/**
-	 * Removes current object from reverse relationship of object
-	 * <code>val</code> to this object.
-	 */
-	protected void unsetReverseRelationship(String relName, DataObject val) {
-
-		EntityResolver resolver = objectContext.getEntityResolver();
-		ObjEntity entity = resolver.getObjEntity(objectId.getEntityName());
-
-		if (entity == null) {
-			throw new IllegalStateException("DataObject's entity is unmapped, objectId: " + objectId);
-		}
-
-		ObjRelationship rel = entity.getRelationship(relName);
-		ObjRelationship revRel = rel.getReverseRelationship();
-		if (revRel != null) {
-			if (revRel.isToMany())
-				val.removeToManyTarget(revRel.getName(), this, false);
-			else
-				val.setToOneTarget(revRel.getName(), null, false);
-		}
-	}
-
-	/**
-	 * A variation of "toString" method, that may be more efficient in some
-	 * cases. For example when printing a list of objects into the same String.
-	 */
-	public StringBuffer toStringBuffer(StringBuffer buffer, boolean fullDesc) {
-		String id = (objectId != null) ? objectId.toString() : "<no id>";
-		String state = PersistenceState.persistenceStateName(persistenceState);
-
-		buffer.append('{').append(id).append("; ").append(state).append("; ");
-
-		if (fullDesc) {
-			appendProperties(buffer);
-		}
-
-		buffer.append("}");
-		return buffer;
-	}
-
+	@Override
 	protected void appendProperties(StringBuffer buffer) {
 		buffer.append("[");
 		Iterator<Map.Entry<String, Object>> it = values.entrySet().iterator();
@@ -490,265 +103,28 @@ public class CayenneDataObject extends PersistentObject implements DataObject, V
 	}
 
 	@Override
-	public String toString() {
-		return toStringBuffer(new StringBuffer(), true).toString();
-	}
-
-	private void writeObject(ObjectOutputStream out) throws IOException {
-		out.writeInt(persistenceState);
-
-		switch (persistenceState) {
-		// New, modified or transient or deleted - write the whole shebang
-		// The other states (committed, hollow) all need just ObjectId
-		case PersistenceState.TRANSIENT:
-		case PersistenceState.NEW:
-		case PersistenceState.MODIFIED:
-		case PersistenceState.DELETED:
-			out.writeObject(values);
-			break;
-		}
-
-		out.writeObject(objectId);
-	}
-
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-		this.persistenceState = in.readInt();
-
-		switch (persistenceState) {
-		case PersistenceState.TRANSIENT:
-		case PersistenceState.NEW:
-		case PersistenceState.MODIFIED:
-		case PersistenceState.DELETED:
-			values = (Map<String, Object>) in.readObject();
-			break;
-		case PersistenceState.COMMITTED:
-		case PersistenceState.HOLLOW:
-			this.persistenceState = PersistenceState.HOLLOW;
-			// props will be populated when required (readProperty called)
-			values = new HashMap<>();
-			break;
-		}
-
-		this.objectId = (ObjectId) in.readObject();
-
-		// DataContext will be set *IF* the DataContext it came from is also
-		// deserialized. Setting of DataContext is handled by the DataContext
-		// itself
-	}
-
-	/**
-	 * Returns a version of a DataRow snapshot that was used to create this
-	 * object.
-	 * 
-	 * @since 1.1
-	 */
-	public long getSnapshotVersion() {
-		return snapshotVersion;
+	protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+		super.readState(in);
+		values = (Map<String, Object>) in.readObject();
 	}
 
-	/**
-	 * @since 1.1
-	 */
-	public void setSnapshotVersion(long snapshotVersion) {
-		this.snapshotVersion = snapshotVersion;
+	@Override
+	protected void writeState(ObjectOutputStream out) throws IOException {
+		super.writeState(out);
+		out.writeObject(values);
 	}
 
 	/**
 	 * Convenience method to invoke {@link Cayenne#makePath(String...)} from
 	 * within a DataObject subclass to create a dotted path using the generated
 	 * string constants for attributes and relationships.
-	 * 
+	 *
+	 * @deprecated since 4.1, use {@link Cayenne#makePath(String...)} instead
 	 * @see Cayenne#makePath(String...)
 	 * @since 3.1
 	 */
-	// TODO: should we deprecate this one? After all the purpose of "Cayenne"
-	// class is to
-	// get rid of utility methods elsewhere..
+	@Deprecated
 	public static String makePath(String... pathParts) {
 		return Cayenne.makePath(pathParts);
 	}
-
-	/**
-	 * Performs property validation of the object, appending any validation
-	 * failures to the provided validationResult object. This method is invoked
-	 * from "validateFor.." before committing a NEW or MODIFIED object to the
-	 * database. Validation includes checking for null values and value sizes.
-	 * CayenneDataObject subclasses may override this method, calling super.
-	 * 
-	 * @since 1.1
-	 */
-	protected void validateForSave(ValidationResult validationResult) {
-
-		ObjEntity objEntity = getObjectContext().getEntityResolver().getObjEntity(this);
-		if (objEntity == null) {
-			throw new CayenneRuntimeException("No ObjEntity mapping found for DataObject %s", getClass().getName());
-		}
-
-		// validate mandatory attributes
-
-		// handling a special case - meaningful mandatory FK... defer failures
-		// until
-		// relationship validation is done... This is just a temporary solution,
-		// as
-		// handling meaningful keys within the object lifecycle requires
-		// something more,
-		// namely read/write methods for relationships and direct values should
-		// be
-		// synchronous with each other..
-		Map<String, ValidationFailure> failedDbAttributes = null;
-
-		for (ObjAttribute next : objEntity.getAttributes()) {
-
-			// TODO: andrus, 2/20/2007 - handle embedded attribute
-			if (next instanceof EmbeddedAttribute) {
-				continue;
-			}
-
-			DbAttribute dbAttribute = next.getDbAttribute();
-
-			if (dbAttribute == null) {
-				throw new CayenneRuntimeException("ObjAttribute '%s"
-						+ "' does not have a corresponding DbAttribute", next.getName());
-			}
-
-			// pk may still be generated
-			if (dbAttribute.isPrimaryKey()) {
-				continue;
-			}
-
-			Object value = this.readPropertyDirectly(next.getName());
-			if (dbAttribute.isMandatory()) {
-				ValidationFailure failure = BeanValidationFailure.validateNotNull(this, next.getName(), value);
-
-				if (failure != null) {
-
-					if (failedDbAttributes == null) {
-						failedDbAttributes = new HashMap<>();
-					}
-
-					failedDbAttributes.put(dbAttribute.getName(), failure);
-					continue;
-				}
-			}
-
-			// validate length
-			if (value != null && dbAttribute.getMaxLength() > 0) {
-
-				if (value.getClass().isArray()) {
-					int len = Array.getLength(value);
-					if (len > dbAttribute.getMaxLength()) {
-						String message = "\"" + next.getName() + "\" exceeds maximum allowed length ("
-								+ dbAttribute.getMaxLength() + " bytes): " + len;
-						validationResult.addFailure(new BeanValidationFailure(this, next.getName(), message));
-					}
-				} else if (value instanceof CharSequence) {
-					int len = ((CharSequence) value).length();
-					if (len > dbAttribute.getMaxLength()) {
-						String message = "\"" + next.getName() + "\" exceeds maximum allowed length ("
-								+ dbAttribute.getMaxLength() + " chars): " + len;
-						validationResult.addFailure(new BeanValidationFailure(this, next.getName(), message));
-					}
-				}
-			}
-		}
-
-		// validate mandatory relationships
-		for (final ObjRelationship relationship : objEntity.getRelationships()) {
-
-			List<DbRelationship> dbRels = relationship.getDbRelationships();
-			if (dbRels.isEmpty()) {
-				continue;
-			}
-
-			// skip db relationships that we can't validate or that can't be invalid here
-			// can't handle paths longer than two db relationships
-			// see ObjRelationship.recalculateReadOnlyValue() for more info
-			if (relationship.isSourceIndependentFromTargetChange()) {
-				continue;
-			}
-
-			// if db relationship is not based on a PK and is based on mandatory
-			// attributes, see if we have a target object set
-			// relationship will be validated only if all db path has mandatory
-			// db relationships
-			boolean validate = true;
-			for (DbRelationship dbRelationship : dbRels) {
-				for (DbJoin join : dbRelationship.getJoins()) {
-					DbAttribute source = join.getSource();
-					if (source.isMandatory()) {
-						// clear attribute failures...
-						if (failedDbAttributes != null && !failedDbAttributes.isEmpty()) {
-							failedDbAttributes.remove(source.getName());
-						}
-					} else {
-						// do not validate if the relation is based on
-						// multiple keys with some that can be nullable.
-						validate = false;
-					}
-				}
-			}
-
-			if (validate) {
-				Object value = this.readPropertyDirectly(relationship.getName());
-				ValidationFailure failure = BeanValidationFailure.validateNotNull(this, relationship.getName(), value);
-
-				if (failure != null) {
-					validationResult.addFailure(failure);
-				}
-			}
-
-		}
-
-		// deal with previously found attribute failures...
-		if (failedDbAttributes != null && !failedDbAttributes.isEmpty()) {
-			for (ValidationFailure failure : failedDbAttributes.values()) {
-				validationResult.addFailure(failure);
-			}
-		}
-	}
-
-	/**
-	 * Calls {@link #validateForSave(ValidationResult)}. CayenneDataObject
-	 * subclasses may override it providing validation logic that should be
-	 * executed for the newly created objects before saving them.
-	 * 
-	 * @since 1.1
-	 */
-	public void validateForInsert(ValidationResult validationResult) {
-		validateForSave(validationResult);
-	}
-
-	/**
-	 * Calls {@link #validateForSave(ValidationResult)}. CayenneDataObject
-	 * subclasses may override it providing validation logic that should be
-	 * executed for the modified objects before saving them.
-	 * 
-	 * @since 1.1
-	 */
-	public void validateForUpdate(ValidationResult validationResult) {
-		validateForSave(validationResult);
-	}
-
-	/**
-	 * This implementation does nothing. CayenneDataObject subclasses may
-	 * override it providing validation logic that should be executed for the
-	 * deleted objects before committing them.
-	 * 
-	 * @since 1.1
-	 */
-	public void validateForDelete(ValidationResult validationResult) {
-		// does nothing
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	@Override
-	public void setObjectContext(ObjectContext objectContext) {
-		this.objectContext = objectContext;
-
-		if (objectContext == null) {
-			this.persistenceState = PersistenceState.TRANSIENT;
-		}
-	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
index 958af1f..498d96c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
@@ -132,7 +132,7 @@ public class DataContextExtrasIT extends ServerCase {
     }
 
     @Test
-    public void testResolveFault() {
+    public void testResolveFault() throws Exception {
 
         Artist o1 = context.newObject(Artist.class);
         o1.setArtistName("a");
@@ -140,11 +140,20 @@ public class DataContextExtrasIT extends ServerCase {
 
         context.invalidateObjects(o1);
         assertEquals(PersistenceState.HOLLOW, o1.getPersistenceState());
-        assertNull(o1.readPropertyDirectly("artistName"));
+
+        // NOTE: Map-based data objects clear their state, while field-based do not,
+        // but all we really care is that HOLLOW object transparently updates it's state.
+        // Here can be two variants depending on what type of data object is used:
+        // assertNull(o1.readPropertyDirectly("artistName")); // map-based
+        // assertEquals("a", o1.readPropertyDirectly("artistName")); // field-based
+
+        // update table bypassing Cayenne
+        int count = tArtist.update().set("ARTIST_NAME", "b").where("ARTIST_NAME", "a").execute();
+        assertTrue(count > 0);
 
         context.prepareForAccess(o1, null, false);
         assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-        assertEquals("a", o1.readPropertyDirectly("artistName"));
+        assertEquals("b", o1.readPropertyDirectly("artistName"));
     }
 
     @Test
@@ -158,9 +167,7 @@ public class DataContextExtrasIT extends ServerCase {
         try {
             context.prepareForAccess(o1, null, false);
             fail("Must blow on non-existing fault.");
-        }
-        catch (CayenneRuntimeException ex) {
-
+        } catch (CayenneRuntimeException ignored) {
         }
     }
 
@@ -204,7 +211,7 @@ public class DataContextExtrasIT extends ServerCase {
     public void testIdObjectFromDataRow() {
 
         DataRow row = new DataRow(10);
-        row.put("ARTIST_ID", new Integer(100000));
+        row.put("ARTIST_ID", 100000);
         DataObject obj = context.objectFromDataRow(Artist.class, row);
         assertNotNull(obj);
         assertTrue(context.getGraphManager().registeredNodes().contains(obj));
@@ -217,7 +224,7 @@ public class DataContextExtrasIT extends ServerCase {
     public void testPartialObjectFromDataRow() {
 
         DataRow row = new DataRow(10);
-        row.put("ARTIST_ID", new Integer(100001));
+        row.put("ARTIST_ID", 100001);
         row.put("ARTIST_NAME", "ArtistXYZ");
         DataObject obj = context.objectFromDataRow(Artist.class, row);
         assertNotNull(obj);
@@ -230,7 +237,7 @@ public class DataContextExtrasIT extends ServerCase {
     public void testFullObjectFromDataRow() {
 
         DataRow row = new DataRow(10);
-        row.put("ARTIST_ID", new Integer(123456));
+        row.put("ARTIST_ID", 123456);
         row.put("ARTIST_NAME", "ArtistXYZ");
         row.put("DATE_OF_BIRTH", new Date());
         Artist obj = context.objectFromDataRow(Artist.class, row);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
index efea9ec..7811d03 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchExtrasIT.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.access;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.DataObject;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
@@ -133,7 +133,7 @@ public class DataContextPrefetchExtrasIT extends ServerCase {
 
         List<?> objects = context.performQuery(q);
         assertEquals(1, objects.size());
-        CayenneDataObject fk1 = (CayenneDataObject) objects.get(0);
+        BaseDataObject fk1 = (BaseDataObject) objects.get(0);
 
         Object toOnePrefetch = fk1.readNestedProperty("toCompoundPk");
         assertNotNull(toOnePrefetch);
@@ -159,17 +159,17 @@ public class DataContextPrefetchExtrasIT extends ServerCase {
 
         List<?> pks = context.performQuery(q);
         assertEquals(1, pks.size());
-        CayenneDataObject pk1 = (CayenneDataObject) pks.get(0);
+        BaseDataObject pk1 = (BaseDataObject) pks.get(0);
 
         List<?> toMany = (List<?>) pk1.readPropertyDirectly("compoundFkArray");
         assertNotNull(toMany);
         assertFalse(((ValueHolder) toMany).isFault());
         assertEquals(2, toMany.size());
 
-        CayenneDataObject fk1 = (CayenneDataObject) toMany.get(0);
+        BaseDataObject fk1 = (BaseDataObject) toMany.get(0);
         assertEquals(PersistenceState.COMMITTED, fk1.getPersistenceState());
 
-        CayenneDataObject fk2 = (CayenneDataObject) toMany.get(1);
+        BaseDataObject fk2 = (BaseDataObject) toMany.get(1);
         assertEquals(PersistenceState.COMMITTED, fk2.getPersistenceState());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
index 36102ca..a85ab78 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/array_type/auto/_ArrayTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.array_type.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;
 
 /**
@@ -9,7 +13,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _ArrayTestEntity extends CayenneDataObject {
+public abstract class _ArrayTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -17,11 +21,66 @@ public abstract class _ArrayTestEntity extends CayenneDataObject {
 
     public static final Property<Double[]> DOUBLE_ARRAY = Property.create("doubleArray", Double[].class);
 
+    protected Double[] doubleArray;
+
+
     public void setDoubleArray(Double[] doubleArray) {
-        writeProperty("doubleArray", doubleArray);
+        beforePropertyWrite("doubleArray", this.doubleArray, doubleArray);
+        this.doubleArray = doubleArray;
     }
+
     public Double[] getDoubleArray() {
-        return (Double[])readProperty("doubleArray");
+        beforePropertyRead("doubleArray");
+        return doubleArray;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "doubleArray":
+                return this.doubleArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "doubleArray":
+                this.doubleArray = (Double[])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(doubleArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        doubleArray = (Double[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
index 0ad5986..3b48e02 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.binary_pk.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.binary_pk.BinaryPKTest2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.binary_pk.BinaryPKTest2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BinaryPKTest1 extends CayenneDataObject {
+public abstract class _BinaryPKTest1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _BinaryPKTest1 extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<BinaryPKTest2>> BINARY_PKDETAILS = Property.create("binaryPKDetails", List.class);
 
+    protected String name;
+
+    protected Object binaryPKDetails;
+
     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 addToBinaryPKDetails(BinaryPKTest2 obj) {
         addToManyTarget("binaryPKDetails", obj, true);
     }
+
     public void removeFromBinaryPKDetails(BinaryPKTest2 obj) {
         removeToManyTarget("binaryPKDetails", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<BinaryPKTest2> getBinaryPKDetails() {
         return (List<BinaryPKTest2>)readProperty("binaryPKDetails");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "binaryPKDetails":
+                return this.binaryPKDetails;
+            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 "binaryPKDetails":
+                this.binaryPKDetails = 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(binaryPKDetails);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        binaryPKDetails = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
index 9e1c2c3..37083e0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/binary_pk/auto/_BinaryPKTest2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.binary_pk.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.binary_pk.BinaryPKTest1;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.binary_pk.BinaryPKTest1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _BinaryPKTest2 extends CayenneDataObject {
+public abstract class _BinaryPKTest2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _BinaryPKTest2 extends CayenneDataObject {
     public static final Property<String> DETAIL_NAME = Property.create("detailName", String.class);
     public static final Property<BinaryPKTest1> TO_BINARY_PKMASTER = Property.create("toBinaryPKMaster", BinaryPKTest1.class);
 
+    protected String detailName;
+
+    protected Object toBinaryPKMaster;
+
     public void setDetailName(String detailName) {
-        writeProperty("detailName", detailName);
+        beforePropertyWrite("detailName", this.detailName, detailName);
+        this.detailName = detailName;
     }
+
     public String getDetailName() {
-        return (String)readProperty("detailName");
+        beforePropertyRead("detailName");
+        return detailName;
     }
 
     public void setToBinaryPKMaster(BinaryPKTest1 toBinaryPKMaster) {
@@ -34,5 +45,60 @@ public abstract class _BinaryPKTest2 extends CayenneDataObject {
         return (BinaryPKTest1)readProperty("toBinaryPKMaster");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "detailName":
+                return this.detailName;
+            case "toBinaryPKMaster":
+                return this.toBinaryPKMaster;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "detailName":
+                this.detailName = (String)val;
+                break;
+            case "toBinaryPKMaster":
+                this.toBinaryPKMaster = 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(detailName);
+        out.writeObject(toBinaryPKMaster);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        detailName = (String)in.readObject();
+        toBinaryPKMaster = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
index b5007ed..0dc3d02 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_Team.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.cay_2032.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.cay_2032.User;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.cay_2032.User;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _Team extends CayenneDataObject {
+public abstract class _Team extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -20,16 +23,69 @@ public abstract class _Team extends CayenneDataObject {
 
     public static final Property<List<User>> TEAM_USERS = Property.create("teamUsers", List.class);
 
+
+    protected Object teamUsers;
+
     public void addToTeamUsers(User obj) {
         addToManyTarget("teamUsers", obj, true);
     }
+
     public void removeFromTeamUsers(User obj) {
         removeToManyTarget("teamUsers", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<User> getTeamUsers() {
         return (List<User>)readProperty("teamUsers");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "teamUsers":
+                return this.teamUsers;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "teamUsers":
+                this.teamUsers = 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(teamUsers);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        teamUsers = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
index 5f40fa9..e385c03 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/cay_2032/auto/_User.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.cay_2032.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.cay_2032.Team;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.cay_2032.Team;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _User extends CayenneDataObject {
+public abstract class _User extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _User extends CayenneDataObject {
     public static final Property<byte[]> NAME = Property.create("name", byte[].class);
     public static final Property<List<Team>> USER_TEAMS = Property.create("userTeams", List.class);
 
+    protected byte[] name;
+
+    protected Object userTeams;
+
     public void setName(byte[] name) {
-        writeProperty("name", name);
+        beforePropertyWrite("name", this.name, name);
+        this.name = name;
     }
+
     public byte[] getName() {
-        return (byte[])readProperty("name");
+        beforePropertyRead("name");
+        return name;
     }
 
     public void addToUserTeams(Team obj) {
         addToManyTarget("userTeams", obj, true);
     }
+
     public void removeFromUserTeams(Team obj) {
         removeToManyTarget("userTeams", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<Team> getUserTeams() {
         return (List<Team>)readProperty("userTeams");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "userTeams":
+                return this.userTeams;
+            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 = (byte[])val;
+                break;
+            case "userTeams":
+                this.userTeams = 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(userTeams);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (byte[])in.readObject();
+        userTeams = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
index 9f6c4e1..08ce9b3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharFkTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.compound.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.compound.CharPkTestEntity;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.compound.CharPkTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CharFkTestEntity extends CayenneDataObject {
+public abstract class _CharFkTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _CharFkTestEntity extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<CharPkTestEntity> TO_CHAR_PK = Property.create("toCharPK", CharPkTestEntity.class);
 
+    protected String name;
+
+    protected Object toCharPK;
+
     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 setToCharPK(CharPkTestEntity toCharPK) {
@@ -34,5 +45,60 @@ public abstract class _CharFkTestEntity extends CayenneDataObject {
         return (CharPkTestEntity)readProperty("toCharPK");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toCharPK":
+                return this.toCharPK;
+            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 "toCharPK":
+                this.toCharPK = 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(toCharPK);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toCharPK = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
index 05ae88f..63c967e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CharPkTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.compound.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.compound.CharFkTestEntity;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.compound.CharFkTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CharPkTestEntity extends CayenneDataObject {
+public abstract class _CharPkTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -22,30 +25,105 @@ public abstract class _CharPkTestEntity extends CayenneDataObject {
     public static final Property<String> PK_COL = Property.create("pkCol", String.class);
     public static final Property<List<CharFkTestEntity>> CHAR_FKS = Property.create("charFKs", List.class);
 
+    protected String otherCol;
+    protected String pkCol;
+
+    protected Object charFKs;
+
     public void setOtherCol(String otherCol) {
-        writeProperty("otherCol", otherCol);
+        beforePropertyWrite("otherCol", this.otherCol, otherCol);
+        this.otherCol = otherCol;
     }
+
     public String getOtherCol() {
-        return (String)readProperty("otherCol");
+        beforePropertyRead("otherCol");
+        return otherCol;
     }
 
     public void setPkCol(String pkCol) {
-        writeProperty("pkCol", pkCol);
+        beforePropertyWrite("pkCol", this.pkCol, pkCol);
+        this.pkCol = pkCol;
     }
+
     public String getPkCol() {
-        return (String)readProperty("pkCol");
+        beforePropertyRead("pkCol");
+        return pkCol;
     }
 
     public void addToCharFKs(CharFkTestEntity obj) {
         addToManyTarget("charFKs", obj, true);
     }
+
     public void removeFromCharFKs(CharFkTestEntity obj) {
         removeToManyTarget("charFKs", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CharFkTestEntity> getCharFKs() {
         return (List<CharFkTestEntity>)readProperty("charFKs");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "otherCol":
+                return this.otherCol;
+            case "pkCol":
+                return this.pkCol;
+            case "charFKs":
+                return this.charFKs;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "otherCol":
+                this.otherCol = (String)val;
+                break;
+            case "pkCol":
+                this.pkCol = (String)val;
+                break;
+            case "charFKs":
+                this.charFKs = 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(otherCol);
+        out.writeObject(pkCol);
+        out.writeObject(charFKs);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        otherCol = (String)in.readObject();
+        pkCol = (String)in.readObject();
+        charFKs = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
index 3bcc635..4ea2475 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundFkTestEntity.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.compound.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.compound.CompoundPkTestEntity;
 
@@ -10,7 +14,7 @@ import org.apache.cayenne.testdo.compound.CompoundPkTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CompoundFkTestEntity extends CayenneDataObject {
+public abstract class _CompoundFkTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +23,18 @@ public abstract class _CompoundFkTestEntity extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<CompoundPkTestEntity> TO_COMPOUND_PK = Property.create("toCompoundPk", CompoundPkTestEntity.class);
 
+    protected String name;
+
+    protected Object toCompoundPk;
+
     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 setToCompoundPk(CompoundPkTestEntity toCompoundPk) {
@@ -34,5 +45,60 @@ public abstract class _CompoundFkTestEntity extends CayenneDataObject {
         return (CompoundPkTestEntity)readProperty("toCompoundPk");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toCompoundPk":
+                return this.toCompoundPk;
+            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 "toCompoundPk":
+                this.toCompoundPk = 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(toCompoundPk);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toCompoundPk = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
index c04dfc9..54dfcce 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/compound/auto/_CompoundPkTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.compound.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.compound.CompoundFkTestEntity;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.compound.CompoundFkTestEntity;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CompoundPkTestEntity extends CayenneDataObject {
+public abstract class _CompoundPkTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -24,37 +27,123 @@ public abstract class _CompoundPkTestEntity extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<CompoundFkTestEntity>> COMPOUND_FK_ARRAY = Property.create("compoundFkArray", List.class);
 
+    protected String key1;
+    protected String key2;
+    protected String name;
+
+    protected Object compoundFkArray;
+
     public void setKey1(String key1) {
-        writeProperty("key1", key1);
+        beforePropertyWrite("key1", this.key1, key1);
+        this.key1 = key1;
     }
+
     public String getKey1() {
-        return (String)readProperty("key1");
+        beforePropertyRead("key1");
+        return key1;
     }
 
     public void setKey2(String key2) {
-        writeProperty("key2", key2);
+        beforePropertyWrite("key2", this.key2, key2);
+        this.key2 = key2;
     }
+
     public String getKey2() {
-        return (String)readProperty("key2");
+        beforePropertyRead("key2");
+        return key2;
     }
 
     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 addToCompoundFkArray(CompoundFkTestEntity obj) {
         addToManyTarget("compoundFkArray", obj, true);
     }
+
     public void removeFromCompoundFkArray(CompoundFkTestEntity obj) {
         removeToManyTarget("compoundFkArray", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CompoundFkTestEntity> getCompoundFkArray() {
         return (List<CompoundFkTestEntity>)readProperty("compoundFkArray");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "key1":
+                return this.key1;
+            case "key2":
+                return this.key2;
+            case "name":
+                return this.name;
+            case "compoundFkArray":
+                return this.compoundFkArray;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "key1":
+                this.key1 = (String)val;
+                break;
+            case "key2":
+                this.key2 = (String)val;
+                break;
+            case "name":
+                this.name = (String)val;
+                break;
+            case "compoundFkArray":
+                this.compoundFkArray = 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(key1);
+        out.writeObject(key2);
+        out.writeObject(name);
+        out.writeObject(compoundFkArray);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        key1 = (String)in.readObject();
+        key2 = (String)in.readObject();
+        name = (String)in.readObject();
+        compoundFkArray = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
index 6efeefd..2cd2fcc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_CalendarEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.date_time.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Calendar;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CalendarEntity extends CayenneDataObject {
+public abstract class _CalendarEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -19,11 +22,66 @@ public abstract class _CalendarEntity extends CayenneDataObject {
 
     public static final Property<Calendar> CALENDAR_FIELD = Property.create("calendarField", Calendar.class);
 
+    protected Calendar calendarField;
+
+
     public void setCalendarField(Calendar calendarField) {
-        writeProperty("calendarField", calendarField);
+        beforePropertyWrite("calendarField", this.calendarField, calendarField);
+        this.calendarField = calendarField;
     }
+
     public Calendar getCalendarField() {
-        return (Calendar)readProperty("calendarField");
+        beforePropertyRead("calendarField");
+        return calendarField;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "calendarField":
+                return this.calendarField;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "calendarField":
+                this.calendarField = (Calendar)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(calendarField);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        calendarField = (Calendar)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
index 6303f03..976108a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/date_time/auto/_DateTestEntity.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.date_time.auto;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Date;
 
-import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.BaseDataObject;
 import org.apache.cayenne.exp.Property;
 
 /**
@@ -11,7 +14,7 @@ import org.apache.cayenne.exp.Property;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _DateTestEntity extends CayenneDataObject {
+public abstract class _DateTestEntity extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,25 +24,102 @@ public abstract class _DateTestEntity extends CayenneDataObject {
     public static final Property<Date> TIME_COLUMN = Property.create("timeColumn", Date.class);
     public static final Property<Date> TIMESTAMP_COLUMN = Property.create("timestampColumn", Date.class);
 
+    protected Date dateColumn;
+    protected Date timeColumn;
+    protected Date timestampColumn;
+
+
     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 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;
+    }
+
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "dateColumn":
+                return this.dateColumn;
+            case "timeColumn":
+                return this.timeColumn;
+            case "timestampColumn":
+                return this.timestampColumn;
+            default:
+                return super.readPropertyDirectly(propName);
+        }
+    }
+
+    @Override
+    public void writePropertyDirectly(String propName, Object val) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (propName) {
+            case "dateColumn":
+                this.dateColumn = (Date)val;
+                break;
+            case "timeColumn":
+                this.timeColumn = (Date)val;
+                break;
+            case "timestampColumn":
+                this.timestampColumn = (Date)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(dateColumn);
+        out.writeObject(timeColumn);
+        out.writeObject(timestampColumn);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        dateColumn = (Date)in.readObject();
+        timeColumn = (Date)in.readObject();
+        timestampColumn = (Date)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
index 0cd4fc0..ad8fe6b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.db1.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.db2.CrossdbM2E1;
 import org.apache.cayenne.testdo.db2.CrossdbM2E2;
@@ -13,7 +16,7 @@ import org.apache.cayenne.testdo.db2.CrossdbM2E2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CrossdbM1E1 extends CayenneDataObject {
+public abstract class _CrossdbM1E1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -23,35 +26,108 @@ public abstract class _CrossdbM1E1 extends CayenneDataObject {
     public static final Property<List<CrossdbM2E1>> FLATTENED = Property.create("flattened", List.class);
     public static final Property<List<CrossdbM2E2>> LIST_OF_M2E2 = Property.create("listOfM2E2", List.class);
 
+    protected String name;
+
+    protected Object flattened;
+    protected Object listOfM2E2;
+
     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 addToFlattened(CrossdbM2E1 obj) {
         addToManyTarget("flattened", obj, true);
     }
+
     public void removeFromFlattened(CrossdbM2E1 obj) {
         removeToManyTarget("flattened", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CrossdbM2E1> getFlattened() {
         return (List<CrossdbM2E1>)readProperty("flattened");
     }
 
-
     public void addToListOfM2E2(CrossdbM2E2 obj) {
         addToManyTarget("listOfM2E2", obj, true);
     }
+
     public void removeFromListOfM2E2(CrossdbM2E2 obj) {
         removeToManyTarget("listOfM2E2", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CrossdbM2E2> getListOfM2E2() {
         return (List<CrossdbM2E2>)readProperty("listOfM2E2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "flattened":
+                return this.flattened;
+            case "listOfM2E2":
+                return this.listOfM2E2;
+            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 "flattened":
+                this.flattened = val;
+                break;
+            case "listOfM2E2":
+                this.listOfM2E2 = 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(flattened);
+        out.writeObject(listOfM2E2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        flattened = in.readObject();
+        listOfM2E2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
index bcf4067..57031a7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E1.java
@@ -1,8 +1,11 @@
 package org.apache.cayenne.testdo.db2.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.db2.CrossdbM2E2;
 
@@ -12,7 +15,7 @@ import org.apache.cayenne.testdo.db2.CrossdbM2E2;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CrossdbM2E1 extends CayenneDataObject {
+public abstract class _CrossdbM2E1 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,23 +24,87 @@ public abstract class _CrossdbM2E1 extends CayenneDataObject {
     public static final Property<String> NAME = Property.create("name", String.class);
     public static final Property<List<CrossdbM2E2>> LIST_OF_M2E2 = Property.create("listOfM2E2", List.class);
 
+    protected String name;
+
+    protected Object listOfM2E2;
+
     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 addToListOfM2E2(CrossdbM2E2 obj) {
         addToManyTarget("listOfM2E2", obj, true);
     }
+
     public void removeFromListOfM2E2(CrossdbM2E2 obj) {
         removeToManyTarget("listOfM2E2", obj, true);
     }
+
     @SuppressWarnings("unchecked")
     public List<CrossdbM2E2> getListOfM2E2() {
         return (List<CrossdbM2E2>)readProperty("listOfM2E2");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "listOfM2E2":
+                return this.listOfM2E2;
+            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 "listOfM2E2":
+                this.listOfM2E2 = 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(listOfM2E2);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        listOfM2E2 = in.readObject();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/544aae08/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
index 364acfb..d1b020c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/db2/auto/_CrossdbM2E2.java
@@ -1,6 +1,10 @@
 package org.apache.cayenne.testdo.db2.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.db1.CrossdbM1E1;
 import org.apache.cayenne.testdo.db2.CrossdbM2E1;
@@ -11,7 +15,7 @@ import org.apache.cayenne.testdo.db2.CrossdbM2E1;
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
  */
-public abstract class _CrossdbM2E2 extends CayenneDataObject {
+public abstract class _CrossdbM2E2 extends BaseDataObject {
 
     private static final long serialVersionUID = 1L; 
 
@@ -21,11 +25,19 @@ public abstract class _CrossdbM2E2 extends CayenneDataObject {
     public static final Property<CrossdbM1E1> TO_M1E1 = Property.create("toM1E1", CrossdbM1E1.class);
     public static final Property<CrossdbM2E1> TO_M2E1 = Property.create("toM2E1", CrossdbM2E1.class);
 
+    protected String name;
+
+    protected Object toM1E1;
+    protected Object toM2E1;
+
     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 setToM1E1(CrossdbM1E1 toM1E1) {
@@ -36,7 +48,6 @@ public abstract class _CrossdbM2E2 extends CayenneDataObject {
         return (CrossdbM1E1)readProperty("toM1E1");
     }
 
-
     public void setToM2E1(CrossdbM2E1 toM2E1) {
         setToOneTarget("toM2E1", toM2E1, true);
     }
@@ -45,5 +56,67 @@ public abstract class _CrossdbM2E2 extends CayenneDataObject {
         return (CrossdbM2E1)readProperty("toM2E1");
     }
 
+    @Override
+    public Object readPropertyDirectly(String propName) {
+        if(propName == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch(propName) {
+            case "name":
+                return this.name;
+            case "toM1E1":
+                return this.toM1E1;
+            case "toM2E1":
+                return this.toM2E1;
+            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 "toM1E1":
+                this.toM1E1 = val;
+                break;
+            case "toM2E1":
+                this.toM2E1 = 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(toM1E1);
+        out.writeObject(toM2E1);
+    }
+
+    @Override
+    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+        super.readState(in);
+        name = (String)in.readObject();
+        toM1E1 = in.readObject();
+        toM2E1 = in.readObject();
+    }
 
 }


[15/18] cayenne git commit: CAY-2330 Field based data objects update test classes to latest cgen templates

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
index 021f9e3..8f40c01 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
@@ -31,7 +31,7 @@ public abstract class _IvAbstract extends BaseDataObject {
 
     public String getType() {
         beforePropertyRead("type");
-        return type;
+        return this.type;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _IvAbstract extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(type);
+        out.writeObject(this.type);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        type = (String)in.readObject();
+        this.type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
index 91b2119..4286f72 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
@@ -33,7 +33,7 @@ public abstract class _IvBase extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setType(String type) {
@@ -43,7 +43,7 @@ public abstract class _IvBase extends BaseDataObject {
 
     public String getType() {
         beforePropertyRead("type");
-        return type;
+        return this.type;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _IvBase extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(type);
+        out.writeObject(this.name);
+        out.writeObject(this.type);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        type = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
index 29dfc23..6f6d0b1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
@@ -33,7 +33,7 @@ public abstract class _IvBaseWithLock extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setType(String type) {
@@ -43,7 +43,7 @@ public abstract class _IvBaseWithLock extends BaseDataObject {
 
     public String getType() {
         beforePropertyRead("type");
-        return type;
+        return this.type;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _IvBaseWithLock extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(type);
+        out.writeObject(this.name);
+        out.writeObject(this.type);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        type = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.type = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
index 898c954..0e494d0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
@@ -37,7 +37,7 @@ public abstract class _IvConcrete extends IvAbstract {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToChildren(IvConcrete obj) {
@@ -111,17 +111,17 @@ public abstract class _IvConcrete extends IvAbstract {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(children);
-        out.writeObject(parent);
+        out.writeObject(this.name);
+        out.writeObject(this.children);
+        out.writeObject(this.parent);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        children = in.readObject();
-        parent = in.readObject();
+        this.name = (String)in.readObject();
+        this.children = in.readObject();
+        this.parent = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
index b24df08..dc6e086 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
@@ -38,7 +38,7 @@ public abstract class _IvImpl extends IvBase {
 
     public String getAttr1() {
         beforePropertyRead("attr1");
-        return attr1;
+        return this.attr1;
     }
 
     public void setAttr2(String attr2) {
@@ -48,7 +48,7 @@ public abstract class _IvImpl extends IvBase {
 
     public String getAttr2() {
         beforePropertyRead("attr2");
-        return attr2;
+        return this.attr2;
     }
 
     public void setOther1(IvOther other1) {
@@ -122,19 +122,19 @@ public abstract class _IvImpl extends IvBase {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(attr1);
-        out.writeObject(attr2);
-        out.writeObject(other1);
-        out.writeObject(other2);
+        out.writeObject(this.attr1);
+        out.writeObject(this.attr2);
+        out.writeObject(this.other1);
+        out.writeObject(this.other2);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        attr1 = (String)in.readObject();
-        attr2 = (String)in.readObject();
-        other1 = in.readObject();
-        other2 = in.readObject();
+        this.attr1 = (String)in.readObject();
+        this.attr2 = (String)in.readObject();
+        this.other1 = in.readObject();
+        this.other2 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
index b72749b..32fb526 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
@@ -34,7 +34,7 @@ public abstract class _IvImplWithLock extends IvBaseWithLock {
 
     public String getAttr1() {
         beforePropertyRead("attr1");
-        return attr1;
+        return this.attr1;
     }
 
     public void setOther1(IvOther other1) {
@@ -90,15 +90,15 @@ public abstract class _IvImplWithLock extends IvBaseWithLock {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(attr1);
-        out.writeObject(other1);
+        out.writeObject(this.attr1);
+        out.writeObject(this.other1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        attr1 = (String)in.readObject();
-        other1 = in.readObject();
+        this.attr1 = (String)in.readObject();
+        this.other1 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
index 0554293..82e47d0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
@@ -38,7 +38,7 @@ public abstract class _IvOther extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @SuppressWarnings("unchecked")
@@ -101,17 +101,17 @@ public abstract class _IvOther extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(impls);
-        out.writeObject(implsWithLock);
+        out.writeObject(this.name);
+        out.writeObject(this.impls);
+        out.writeObject(this.implsWithLock);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        impls = in.readObject();
-        implsWithLock = in.readObject();
+        this.name = (String)in.readObject();
+        this.impls = in.readObject();
+        this.implsWithLock = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
index b88346b..f3f86d0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
@@ -33,7 +33,7 @@ public abstract class _IvRoot extends BaseDataObject {
 
     public String getDiscriminator() {
         beforePropertyRead("discriminator");
-        return discriminator;
+        return this.discriminator;
     }
 
     public void setName(String name) {
@@ -43,7 +43,7 @@ public abstract class _IvRoot extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _IvRoot extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(discriminator);
-        out.writeObject(name);
+        out.writeObject(this.discriminator);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        discriminator = (String)in.readObject();
-        name = (String)in.readObject();
+        this.discriminator = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
index 3dc23bb..136987f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
@@ -31,7 +31,7 @@ public abstract class _IvSub1 extends IvRoot {
 
     public String getSub1Name() {
         beforePropertyRead("sub1Name");
-        return sub1Name;
+        return this.sub1Name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _IvSub1 extends IvRoot {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(sub1Name);
+        out.writeObject(this.sub1Name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        sub1Name = (String)in.readObject();
+        this.sub1Name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
index 83e36f4..a3a8e97 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
@@ -31,7 +31,7 @@ public abstract class _IvSub1Sub1 extends IvSub1 {
 
     public String getSub1Sub1Name() {
         beforePropertyRead("sub1Sub1Name");
-        return sub1Sub1Name;
+        return this.sub1Sub1Name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _IvSub1Sub1 extends IvSub1 {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(sub1Sub1Name);
+        out.writeObject(this.sub1Sub1Name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        sub1Sub1Name = (String)in.readObject();
+        this.sub1Sub1Name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
index 199322b..42dfb57 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
@@ -33,7 +33,7 @@ public abstract class _IvSub2 extends IvRoot {
 
     public String getSub2Attr() {
         beforePropertyRead("sub2Attr");
-        return sub2Attr;
+        return this.sub2Attr;
     }
 
     public void setSub2Name(String sub2Name) {
@@ -43,7 +43,7 @@ public abstract class _IvSub2 extends IvRoot {
 
     public String getSub2Name() {
         beforePropertyRead("sub2Name");
-        return sub2Name;
+        return this.sub2Name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _IvSub2 extends IvRoot {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(sub2Attr);
-        out.writeObject(sub2Name);
+        out.writeObject(this.sub2Attr);
+        out.writeObject(this.sub2Name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        sub2Attr = (String)in.readObject();
-        sub2Name = (String)in.readObject();
+        this.sub2Attr = (String)in.readObject();
+        this.sub2Name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
index b9272c0..827d09c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
@@ -28,7 +28,7 @@ public abstract class _IvSub3 extends IvRoot {
         return (IvRoot)readProperty("ivRoot");
     }
 
-protected abstract void onPrePersist();
+    protected abstract void onPrePersist();
 
     @Override
     public Object readPropertyDirectly(String propName) {
@@ -70,13 +70,13 @@ protected abstract void onPrePersist();
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(ivRoot);
+        out.writeObject(this.ivRoot);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        ivRoot = in.readObject();
+        this.ivRoot = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
index cce1bae..b4bc8ff 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycle_callbacks_order/auto/_Lifecycle.java
@@ -31,7 +31,7 @@ public abstract class _Lifecycle extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _Lifecycle extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
index 5895dbb..ed26a39 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lifecycles/auto/_Lifecycles.java
@@ -31,7 +31,7 @@ public abstract class _Lifecycles extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _Lifecycles extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
index 6e1cc8f..b81fbbb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_BlobTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _BlobTestEntity extends BaseDataObject {
 
     public byte[] getBlobCol() {
         beforePropertyRead("blobCol");
-        return blobCol;
+        return this.blobCol;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _BlobTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(blobCol);
+        out.writeObject(this.blobCol);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        blobCol = (byte[])in.readObject();
+        this.blobCol = (byte[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
index e5ae2e9..d8e7c3b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestEntity.java
@@ -35,7 +35,7 @@ public abstract class _ClobTestEntity extends BaseDataObject {
 
     public String getClobCol() {
         beforePropertyRead("clobCol");
-        return clobCol;
+        return this.clobCol;
     }
 
     public void addToClobValue(ClobTestRelation obj) {
@@ -96,15 +96,15 @@ public abstract class _ClobTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(clobCol);
-        out.writeObject(clobValue);
+        out.writeObject(this.clobCol);
+        out.writeObject(this.clobValue);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        clobCol = (String)in.readObject();
-        clobValue = in.readObject();
+        this.clobCol = (String)in.readObject();
+        this.clobValue = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
index 3a8c35d..bb3b212 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_ClobTestRelation.java
@@ -36,7 +36,7 @@ public abstract class _ClobTestRelation extends BaseDataObject {
 
     public Integer getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     public void setValue(Integer value) {
@@ -46,7 +46,7 @@ public abstract class _ClobTestRelation extends BaseDataObject {
 
     public Integer getValue() {
         beforePropertyRead("value");
-        return value;
+        return this.value;
     }
 
     public void setClobId(ClobTestEntity clobId) {
@@ -107,17 +107,17 @@ public abstract class _ClobTestRelation extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(id);
-        out.writeObject(value);
-        out.writeObject(clobId);
+        out.writeObject(this.id);
+        out.writeObject(this.value);
+        out.writeObject(this.clobId);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        id = (Integer)in.readObject();
-        value = (Integer)in.readObject();
-        clobId = in.readObject();
+        this.id = (Integer)in.readObject();
+        this.value = (Integer)in.readObject();
+        this.clobId = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
index 3d88ec8..e23c436 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/lob/auto/_NClobTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _NClobTestEntity extends BaseDataObject {
 
     public String getNclobCol() {
         beforePropertyRead("nclobCol");
-        return nclobCol;
+        return this.nclobCol;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _NClobTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(nclobCol);
+        out.writeObject(this.nclobCol);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        nclobCol = (String)in.readObject();
+        this.nclobCol = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
index 7b75aaf..44cd31f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_LockingHelper.java
@@ -34,7 +34,7 @@ public abstract class _LockingHelper extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setToRelLockingTest(RelLockingTestEntity toRelLockingTest) {
@@ -90,15 +90,15 @@ public abstract class _LockingHelper extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(toRelLockingTest);
+        out.writeObject(this.name);
+        out.writeObject(this.toRelLockingTest);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        toRelLockingTest = in.readObject();
+        this.name = (String)in.readObject();
+        this.toRelLockingTest = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
index 40ca5c1..77134e2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_RelLockingTestEntity.java
@@ -38,7 +38,7 @@ public abstract class _RelLockingTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToLockingHelpers(LockingHelper obj) {
@@ -112,17 +112,17 @@ public abstract class _RelLockingTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(lockingHelpers);
-        out.writeObject(toSimpleLockingTest);
+        out.writeObject(this.name);
+        out.writeObject(this.lockingHelpers);
+        out.writeObject(this.toSimpleLockingTest);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        lockingHelpers = in.readObject();
-        toSimpleLockingTest = in.readObject();
+        this.name = (String)in.readObject();
+        this.lockingHelpers = in.readObject();
+        this.toSimpleLockingTest = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
index 978e848..a74e312 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
@@ -33,7 +33,7 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
 
     public String getDescription() {
         beforePropertyRead("description");
-        return description;
+        return this.description;
     }
 
     public void setName(String name) {
@@ -43,7 +43,7 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(description);
-        out.writeObject(name);
+        out.writeObject(this.description);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        description = (String)in.readObject();
-        name = (String)in.readObject();
+        this.description = (String)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
index d559308..289f86e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToMany.java
@@ -79,13 +79,13 @@ public abstract class _IdMapToMany extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(targets);
+        out.writeObject(this.targets);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        targets = in.readObject();
+        this.targets = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
index 75e5668..7c9e69a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_IdMapToManyTarget.java
@@ -73,13 +73,13 @@ public abstract class _IdMapToManyTarget extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(mapToMany);
+        out.writeObject(this.mapToMany);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        mapToMany = in.readObject();
+        this.mapToMany = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
index 93208bb..731504b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToMany.java
@@ -79,13 +79,13 @@ public abstract class _MapToMany extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(targets);
+        out.writeObject(this.targets);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        targets = in.readObject();
+        this.targets = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
index 8bdb39c..2ae11ac 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/map_to_many/auto/_MapToManyTarget.java
@@ -34,7 +34,7 @@ public abstract class _MapToManyTarget extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setMapToMany(MapToMany mapToMany) {
@@ -90,15 +90,15 @@ public abstract class _MapToManyTarget extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(mapToMany);
+        out.writeObject(this.name);
+        out.writeObject(this.mapToMany);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        mapToMany = in.readObject();
+        this.name = (String)in.readObject();
+        this.mapToMany = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
index e78f7a9..adf1f91 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKDep.java
@@ -34,7 +34,7 @@ public abstract class _MeaningfulPKDep extends BaseDataObject {
 
     public String getDescr() {
         beforePropertyRead("descr");
-        return descr;
+        return this.descr;
     }
 
     public void setToMeaningfulPK(MeaningfulPKTest1 toMeaningfulPK) {
@@ -90,15 +90,15 @@ public abstract class _MeaningfulPKDep extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(descr);
-        out.writeObject(toMeaningfulPK);
+        out.writeObject(this.descr);
+        out.writeObject(this.toMeaningfulPK);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        descr = (String)in.readObject();
-        toMeaningfulPK = in.readObject();
+        this.descr = (String)in.readObject();
+        this.toMeaningfulPK = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
index 93bdada..9e994d3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPKTest1.java
@@ -37,7 +37,7 @@ public abstract class _MeaningfulPKTest1 extends BaseDataObject {
 
     public String getDescr() {
         beforePropertyRead("descr");
-        return descr;
+        return this.descr;
     }
 
     public void setPkAttribute(Integer pkAttribute) {
@@ -47,7 +47,7 @@ public abstract class _MeaningfulPKTest1 extends BaseDataObject {
 
     public Integer getPkAttribute() {
         beforePropertyRead("pkAttribute");
-        return pkAttribute;
+        return this.pkAttribute;
     }
 
     public void addToMeaningfulPKDepArray(MeaningfulPKDep obj) {
@@ -113,17 +113,17 @@ public abstract class _MeaningfulPKTest1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(descr);
-        out.writeObject(pkAttribute);
-        out.writeObject(meaningfulPKDepArray);
+        out.writeObject(this.descr);
+        out.writeObject(this.pkAttribute);
+        out.writeObject(this.meaningfulPKDepArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        descr = (String)in.readObject();
-        pkAttribute = (Integer)in.readObject();
-        meaningfulPKDepArray = in.readObject();
+        this.descr = (String)in.readObject();
+        this.pkAttribute = (Integer)in.readObject();
+        this.meaningfulPKDepArray = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
index 16f13ab..a45487d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/meaningful_pk/auto/_MeaningfulPk.java
@@ -31,7 +31,7 @@ public abstract class _MeaningfulPk extends BaseDataObject {
 
     public String getPk() {
         beforePropertyRead("pk");
-        return pk;
+        return this.pk;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _MeaningfulPk extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(pk);
+        out.writeObject(this.pk);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        pk = (String)in.readObject();
+        this.pk = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
index 7d5ac6e..c1d0e9a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_ArraysEntity.java
@@ -37,7 +37,7 @@ public abstract class _ArraysEntity extends BaseDataObject {
 
     public byte[] getByteArray() {
         beforePropertyRead("byteArray");
-        return byteArray;
+        return this.byteArray;
     }
 
     public void setByteWrapperArray(Byte[] byteWrapperArray) {
@@ -47,7 +47,7 @@ public abstract class _ArraysEntity extends BaseDataObject {
 
     public Byte[] getByteWrapperArray() {
         beforePropertyRead("byteWrapperArray");
-        return byteWrapperArray;
+        return this.byteWrapperArray;
     }
 
     public void setCharArray(char[] charArray) {
@@ -57,7 +57,7 @@ public abstract class _ArraysEntity extends BaseDataObject {
 
     public char[] getCharArray() {
         beforePropertyRead("charArray");
-        return charArray;
+        return this.charArray;
     }
 
     public void setCharWrapperArray(Character[] charWrapperArray) {
@@ -67,7 +67,7 @@ public abstract class _ArraysEntity extends BaseDataObject {
 
     public Character[] getCharWrapperArray() {
         beforePropertyRead("charWrapperArray");
-        return charWrapperArray;
+        return this.charWrapperArray;
     }
 
     @Override
@@ -125,19 +125,19 @@ public abstract class _ArraysEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(byteArray);
-        out.writeObject(byteWrapperArray);
-        out.writeObject(charArray);
-        out.writeObject(charWrapperArray);
+        out.writeObject(this.byteArray);
+        out.writeObject(this.byteWrapperArray);
+        out.writeObject(this.charArray);
+        out.writeObject(this.charWrapperArray);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        byteArray = (byte[])in.readObject();
-        byteWrapperArray = (Byte[])in.readObject();
-        charArray = (char[])in.readObject();
-        charWrapperArray = (Character[])in.readObject();
+        this.byteArray = (byte[])in.readObject();
+        this.byteWrapperArray = (Byte[])in.readObject();
+        this.charArray = (char[])in.readObject();
+        this.charWrapperArray = (Character[])in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
index 1163888..5add37c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_CharacterEntity.java
@@ -31,7 +31,7 @@ public abstract class _CharacterEntity extends BaseDataObject {
 
     public Character getCharacterField() {
         beforePropertyRead("characterField");
-        return characterField;
+        return this.characterField;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _CharacterEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(characterField);
+        out.writeObject(this.characterField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        characterField = (Character)in.readObject();
+        this.characterField = (Character)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
index 2f9adf1..2d79de4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/misc_types/auto/_SerializableEntity.java
@@ -32,7 +32,7 @@ public abstract class _SerializableEntity extends BaseDataObject {
 
     public MockSerializable getSerializableField() {
         beforePropertyRead("serializableField");
-        return serializableField;
+        return this.serializableField;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _SerializableEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(serializableField);
+        out.writeObject(this.serializableField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        serializableField = (MockSerializable)in.readObject();
+        this.serializableField = (MockSerializable)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
index e2427ee..b926c18 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy.java
@@ -37,7 +37,7 @@ public abstract class _MixedPersistenceStrategy extends BaseDataObject {
 
     public String getDescription() {
         beforePropertyRead("description");
-        return description;
+        return this.description;
     }
 
     public void setName(String name) {
@@ -47,7 +47,7 @@ public abstract class _MixedPersistenceStrategy extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void addToDetails(MixedPersistenceStrategy2 obj) {
@@ -113,17 +113,17 @@ public abstract class _MixedPersistenceStrategy extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(description);
-        out.writeObject(name);
-        out.writeObject(details);
+        out.writeObject(this.description);
+        out.writeObject(this.name);
+        out.writeObject(this.details);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        description = (String)in.readObject();
-        name = (String)in.readObject();
-        details = in.readObject();
+        this.description = (String)in.readObject();
+        this.name = (String)in.readObject();
+        this.details = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
index 300c2b3..81f24bc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mixed_persistence_strategy/auto/_MixedPersistenceStrategy2.java
@@ -34,7 +34,7 @@ public abstract class _MixedPersistenceStrategy2 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     public void setMaster(MixedPersistenceStrategy master) {
@@ -90,15 +90,15 @@ public abstract class _MixedPersistenceStrategy2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(name);
-        out.writeObject(master);
+        out.writeObject(this.name);
+        out.writeObject(this.master);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        name = (String)in.readObject();
-        master = in.readObject();
+        this.name = (String)in.readObject();
+        this.master = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
index 21b0e92..1c2730b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1.java
@@ -37,7 +37,7 @@ public abstract class _MtTable1 extends BaseDataObject {
 
     public String getGlobalAttribute1() {
         beforePropertyRead("globalAttribute1");
-        return globalAttribute1;
+        return this.globalAttribute1;
     }
 
     public void setServerAttribute1(String serverAttribute1) {
@@ -47,7 +47,7 @@ public abstract class _MtTable1 extends BaseDataObject {
 
     public String getServerAttribute1() {
         beforePropertyRead("serverAttribute1");
-        return serverAttribute1;
+        return this.serverAttribute1;
     }
 
     public void addToTable2Array(MtTable2 obj) {
@@ -113,17 +113,17 @@ public abstract class _MtTable1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(globalAttribute1);
-        out.writeObject(serverAttribute1);
-        out.writeObject(table2Array);
+        out.writeObject(this.globalAttribute1);
+        out.writeObject(this.serverAttribute1);
+        out.writeObject(this.table2Array);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        globalAttribute1 = (String)in.readObject();
-        serverAttribute1 = (String)in.readObject();
-        table2Array = in.readObject();
+        this.globalAttribute1 = (String)in.readObject();
+        this.serverAttribute1 = (String)in.readObject();
+        this.table2Array = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
index ae178eb..a57126b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass1.java
@@ -31,7 +31,7 @@ public abstract class _MtTable1Subclass1 extends MtTable1 {
 
     public String getSubclass1Attribute1() {
         beforePropertyRead("subclass1Attribute1");
-        return subclass1Attribute1;
+        return this.subclass1Attribute1;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _MtTable1Subclass1 extends MtTable1 {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(subclass1Attribute1);
+        out.writeObject(this.subclass1Attribute1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        subclass1Attribute1 = (String)in.readObject();
+        this.subclass1Attribute1 = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
index da985cc..2e6b4ec 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable1Subclass2.java
@@ -31,7 +31,7 @@ public abstract class _MtTable1Subclass2 extends MtTable1 {
 
     public String getSubclass2Attribute1() {
         beforePropertyRead("subclass2Attribute1");
-        return subclass2Attribute1;
+        return this.subclass2Attribute1;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _MtTable1Subclass2 extends MtTable1 {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(subclass2Attribute1);
+        out.writeObject(this.subclass2Attribute1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        subclass2Attribute1 = (String)in.readObject();
+        this.subclass2Attribute1 = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
index 42160e8..8701e8e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
@@ -37,7 +37,7 @@ public abstract class _MtTable2 extends BaseDataObject {
 
     public String getGlobalAttribute() {
         beforePropertyRead("globalAttribute");
-        return globalAttribute;
+        return this.globalAttribute;
     }
 
     public void setTable1(MtTable1 table1) {
@@ -106,17 +106,17 @@ public abstract class _MtTable2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(globalAttribute);
-        out.writeObject(table1);
-        out.writeObject(table3);
+        out.writeObject(this.globalAttribute);
+        out.writeObject(this.table1);
+        out.writeObject(this.table3);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        globalAttribute = (String)in.readObject();
-        table1 = in.readObject();
-        table3 = in.readObject();
+        this.globalAttribute = (String)in.readObject();
+        this.table1 = in.readObject();
+        this.table3 = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
index 9b38704..55269fe 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
@@ -39,7 +39,7 @@ public abstract class _MtTable3 extends BaseDataObject {
 
     public byte[] getBinaryColumn() {
         beforePropertyRead("binaryColumn");
-        return binaryColumn;
+        return this.binaryColumn;
     }
 
     public void setCharColumn(String charColumn) {
@@ -49,7 +49,7 @@ public abstract class _MtTable3 extends BaseDataObject {
 
     public String getCharColumn() {
         beforePropertyRead("charColumn");
-        return charColumn;
+        return this.charColumn;
     }
 
     public void setIntColumn(Integer intColumn) {
@@ -59,7 +59,7 @@ public abstract class _MtTable3 extends BaseDataObject {
 
     public Integer getIntColumn() {
         beforePropertyRead("intColumn");
-        return intColumn;
+        return this.intColumn;
     }
 
     public void addToTable2Array(MtTable2 obj) {
@@ -130,19 +130,19 @@ public abstract class _MtTable3 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(binaryColumn);
-        out.writeObject(charColumn);
-        out.writeObject(intColumn);
-        out.writeObject(table2Array);
+        out.writeObject(this.binaryColumn);
+        out.writeObject(this.charColumn);
+        out.writeObject(this.intColumn);
+        out.writeObject(this.table2Array);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        binaryColumn = (byte[])in.readObject();
-        charColumn = (String)in.readObject();
-        intColumn = (Integer)in.readObject();
-        table2Array = in.readObject();
+        this.binaryColumn = (byte[])in.readObject();
+        this.charColumn = (String)in.readObject();
+        this.intColumn = (Integer)in.readObject();
+        this.table2Array = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
index d8b4a0b..b7ed587 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable4.java
@@ -79,13 +79,13 @@ public abstract class _MtTable4 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(table5s);
+        out.writeObject(this.table5s);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        table5s = in.readObject();
+        this.table5s = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
index cbcebff..cb4489f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable5.java
@@ -79,13 +79,13 @@ public abstract class _MtTable5 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(table4s);
+        out.writeObject(this.table4s);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        table4s = in.readObject();
+        this.table4s = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
index 72d3963..aa29094 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/no_pk/auto/_NoPkTestEntity.java
@@ -30,7 +30,7 @@ public abstract class _NoPkTestEntity extends BaseDataObject {
 
     public Integer getAttribute1() {
         beforePropertyRead("attribute1");
-        return attribute1;
+        return this.attribute1;
     }
 
     @Override
@@ -73,13 +73,13 @@ public abstract class _NoPkTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(attribute1);
+        out.writeObject(this.attribute1);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        attribute1 = (Integer)in.readObject();
+        this.attribute1 = (Integer)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
index 07fa1a0..536bd2e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigDecimalEntity.java
@@ -32,7 +32,7 @@ public abstract class _BigDecimalEntity extends BaseDataObject {
 
     public BigDecimal getBigDecimalField() {
         beforePropertyRead("bigDecimalField");
-        return bigDecimalField;
+        return this.bigDecimalField;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _BigDecimalEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(bigDecimalField);
+        out.writeObject(this.bigDecimalField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        bigDecimalField = (BigDecimal)in.readObject();
+        this.bigDecimalField = (BigDecimal)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
index ef841d1..769b942 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BigIntegerEntity.java
@@ -32,7 +32,7 @@ public abstract class _BigIntegerEntity extends BaseDataObject {
 
     public BigInteger getBigIntegerField() {
         beforePropertyRead("bigIntegerField");
-        return bigIntegerField;
+        return this.bigIntegerField;
     }
 
     @Override
@@ -75,13 +75,13 @@ public abstract class _BigIntegerEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(bigIntegerField);
+        out.writeObject(this.bigIntegerField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        bigIntegerField = (BigInteger)in.readObject();
+        this.bigIntegerField = (BigInteger)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
index 2fcc59c..4185508 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitNumberTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _BitNumberTestEntity extends BaseDataObject {
 
     public Integer getBitColumn() {
         beforePropertyRead("bitColumn");
-        return bitColumn;
+        return this.bitColumn;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _BitNumberTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(bitColumn);
+        out.writeObject(this.bitColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        bitColumn = (Integer)in.readObject();
+        this.bitColumn = (Integer)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
index 59337dd..2b251c9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BitTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _BitTestEntity extends BaseDataObject {
 
     public Boolean getBitColumn() {
         beforePropertyRead("bitColumn");
-        return bitColumn;
+        return this.bitColumn;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _BitTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(bitColumn);
+        out.writeObject(this.bitColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        bitColumn = (Boolean)in.readObject();
+        this.bitColumn = (Boolean)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
index 5a1b340..d05f701 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_BooleanTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _BooleanTestEntity extends BaseDataObject {
 
     public Boolean getBooleanColumn() {
         beforePropertyRead("booleanColumn");
-        return booleanColumn;
+        return this.booleanColumn;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _BooleanTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(booleanColumn);
+        out.writeObject(this.booleanColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        booleanColumn = (Boolean)in.readObject();
+        this.booleanColumn = (Boolean)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
index 816493c..ceaac63 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTest1.java
@@ -33,7 +33,7 @@ public abstract class _DecimalPKTest1 extends BaseDataObject {
 
     public Double getDecimalPK() {
         beforePropertyRead("decimalPK");
-        return decimalPK;
+        return this.decimalPK;
     }
 
     public void setName(String name) {
@@ -43,7 +43,7 @@ public abstract class _DecimalPKTest1 extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -91,15 +91,15 @@ public abstract class _DecimalPKTest1 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(decimalPK);
-        out.writeObject(name);
+        out.writeObject(this.decimalPK);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        decimalPK = (Double)in.readObject();
-        name = (String)in.readObject();
+        this.decimalPK = (Double)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
index 7f6cc44..8122f65 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_DecimalPKTestEntity.java
@@ -34,7 +34,7 @@ public abstract class _DecimalPKTestEntity extends BaseDataObject {
 
     public BigDecimal getDecimalPK() {
         beforePropertyRead("decimalPK");
-        return decimalPK;
+        return this.decimalPK;
     }
 
     public void setName(String name) {
@@ -44,7 +44,7 @@ public abstract class _DecimalPKTestEntity extends BaseDataObject {
 
     public String getName() {
         beforePropertyRead("name");
-        return name;
+        return this.name;
     }
 
     @Override
@@ -92,15 +92,15 @@ public abstract class _DecimalPKTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(decimalPK);
-        out.writeObject(name);
+        out.writeObject(this.decimalPK);
+        out.writeObject(this.name);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        decimalPK = (BigDecimal)in.readObject();
-        name = (String)in.readObject();
+        this.decimalPK = (BigDecimal)in.readObject();
+        this.name = (String)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
index 9eb37ad..c0ff27b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_LongEntity.java
@@ -31,7 +31,7 @@ public abstract class _LongEntity extends BaseDataObject {
 
     public Long getLongField() {
         beforePropertyRead("longField");
-        return longField;
+        return this.longField;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _LongEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(longField);
+        out.writeObject(this.longField);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        longField = (Long)in.readObject();
+        this.longField = (Long)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
index fa9d208..ec80ca5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_SmallintTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _SmallintTestEntity extends BaseDataObject {
 
     public Short getSmallintCol() {
         beforePropertyRead("smallintCol");
-        return smallintCol;
+        return this.smallintCol;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _SmallintTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(smallintCol);
+        out.writeObject(this.smallintCol);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        smallintCol = (Short)in.readObject();
+        this.smallintCol = (Short)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
index da57ad8..1914136 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/numeric_types/auto/_TinyintTestEntity.java
@@ -31,7 +31,7 @@ public abstract class _TinyintTestEntity extends BaseDataObject {
 
     public Byte getTinyintCol() {
         beforePropertyRead("tinyintCol");
-        return tinyintCol;
+        return this.tinyintCol;
     }
 
     @Override
@@ -74,13 +74,13 @@ public abstract class _TinyintTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(tinyintCol);
+        out.writeObject(this.tinyintCol);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        tinyintCol = (Byte)in.readObject();
+        this.tinyintCol = (Byte)in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
index 52aceba..5880e83 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable2.java
@@ -34,7 +34,7 @@ public abstract class _OnewayTable2 extends BaseDataObject {
 
     public Integer getId() {
         beforePropertyRead("id");
-        return id;
+        return this.id;
     }
 
     public void setToOneOneWayDb(OnewayTable1 toOneOneWayDb) {
@@ -90,15 +90,15 @@ public abstract class _OnewayTable2 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(id);
-        out.writeObject(toOneOneWayDb);
+        out.writeObject(this.id);
+        out.writeObject(this.toOneOneWayDb);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        id = (Integer)in.readObject();
-        toOneOneWayDb = in.readObject();
+        this.id = (Integer)in.readObject();
+        this.toOneOneWayDb = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
index 7c18626..690ce04 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/oneway/auto/_OnewayTable3.java
@@ -79,13 +79,13 @@ public abstract class _OnewayTable3 extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeObject(toManyOneWayDb);
+        out.writeObject(this.toManyOneWayDb);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        toManyOneWayDb = in.readObject();
+        this.toManyOneWayDb = in.readObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a350e1/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
index 2150ddb..640f660 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
@@ -33,7 +33,7 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
 	public boolean isBooleanColumn() {
         beforePropertyRead("booleanColumn");
-        return booleanColumn;
+        return this.booleanColumn;
     }
 
     public void setIntColumn(int intColumn) {
@@ -43,7 +43,7 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
     public int getIntColumn() {
         beforePropertyRead("intColumn");
-        return intColumn;
+        return this.intColumn;
     }
 
     @Override
@@ -70,10 +70,10 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
         switch (propName) {
             case "booleanColumn":
-                this.booleanColumn = (Boolean)val;
+                this.booleanColumn = val == null ? false : (Boolean)val;
                 break;
             case "intColumn":
-                this.intColumn = (Integer)val;
+                this.intColumn = val == null ? 0 : (Integer)val;
                 break;
             default:
                 super.writePropertyDirectly(propName, val);
@@ -91,15 +91,15 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeBoolean(booleanColumn);
-        out.writeInt(intColumn);
+        out.writeBoolean(this.booleanColumn);
+        out.writeInt(this.intColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        booleanColumn = in.readBoolean();
-        intColumn = in.readInt();
+        this.booleanColumn = in.readBoolean();
+        this.intColumn = in.readInt();
     }
 
 }


[17/18] cayenne git commit: CAY-2330 Field based data objects handle properties names that are java keywords

Posted by nt...@apache.org.
CAY-2330 Field based data objects
  handle properties names that are java keywords


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/1ba6f5ec
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/1ba6f5ec
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/1ba6f5ec

Branch: refs/heads/master
Commit: 1ba6f5ece51343b22cb8252022fdaaabc146f46a
Parents: f3a350e
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Jul 11 14:58:43 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Jul 11 14:58:43 2017 +0300

----------------------------------------------------------------------
 cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm | 4 ++--
 cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm  | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/1ba6f5ec/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
index 5c674dc..d1888e0 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -102,11 +102,11 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 ###################
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
-    protected $type ${attr.Name};
+    protected $type $stringUtils.formatVariableName(${attr.Name});
 #end
 
 #foreach( $rel in ${object.DeclaredRelationships} )
-    protected Object ${rel.Name};
+    protected Object $stringUtils.formatVariableName(${rel.Name});
 #end
 
 #########################################################

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1ba6f5ec/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
index 90bdfe2..8f8bcfe 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -110,11 +110,11 @@ public abstract class ${superClassName} extends ${baseClassName} {
 ###################
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $type = "$importUtils.formatJavaType(${attr.Type})")
-    protected $type ${attr.Name};
+    protected $type $stringUtils.formatVariableName(${attr.Name});
 #end
 
 #foreach( $rel in ${object.DeclaredRelationships} )
-    protected Object ${rel.Name};
+    protected Object $stringUtils.formatVariableName(${rel.Name});
 #end
 
 #########################################################


[03/18] cayenne git commit: CAY-2330 Field based data objects

Posted by nt...@apache.org.
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();
     }
 
 }


[18/18] cayenne git commit: Merge remote-tracking branch 'remotes/parent/pr/235' into asf-master

Posted by nt...@apache.org.
Merge remote-tracking branch 'remotes/parent/pr/235' into asf-master

# Conflicts:
#	cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
#	docs/doc/src/main/resources/RELEASE-NOTES.txt
#	docs/doc/src/main/resources/UPGRADE.txt


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/7b762e9a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/7b762e9a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/7b762e9a

Branch: refs/heads/master
Commit: 7b762e9a3182403329ca3f428553dd13ca6429f8
Parents: caaeb99 1ba6f5e
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Aug 11 10:44:16 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Aug 11 10:44:16 2017 +0300

----------------------------------------------------------------------
 ...eGeneratorTaskCrossMapRelationshipsTest.java |   2 +-
 .../cayenne/tools/CayenneGeneratorTaskTest.java |  12 +-
 .../cayenne/gen/ClassGenerationAction.java      |   2 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |   4 +-
 .../org/apache/cayenne/gen/ImportUtils.java     |   9 +
 .../v4_1/client-datamap-singleclass.vm          |  98 +++
 .../templates/v4_1/client-datamap-subclass.vm   |  47 ++
 .../templates/v4_1/client-datamap-superclass.vm |  87 +++
 .../resources/templates/v4_1/client-subclass.vm |  57 ++
 .../templates/v4_1/client-superclass.vm         | 248 +++++++
 .../templates/v4_1/datamap-singleclass.vm       | 100 +++
 .../templates/v4_1/datamap-subclass.vm          |  47 ++
 .../templates/v4_1/datamap-superclass.vm        |  91 +++
 .../templates/v4_1/embeddable-singleclass.vm    | 106 +++
 .../templates/v4_1/embeddable-subclass.vm       |  45 ++
 .../templates/v4_1/embeddable-superclass.vm     | 112 +++
 .../resources/templates/v4_1/singleclass.vm     | 278 +++++++
 .../main/resources/templates/v4_1/subclass.vm   |  47 ++
 .../main/resources/templates/v4_1/superclass.vm | 292 ++++++++
 .../cayenne/gen/ClassGenerationActionTest.java  |  13 +-
 .../cayenne/CayenneContextPrimitiveIT.java      |  29 +
 .../apache/cayenne/crypto/db/auto/_Table1.java  | 114 ++-
 .../apache/cayenne/crypto/db/auto/_Table2.java  |  82 ++-
 .../apache/cayenne/crypto/db/auto/_Table3.java  |  67 +-
 .../apache/cayenne/crypto/db/auto/_Table4.java  |  83 ++-
 .../apache/cayenne/crypto/db/auto/_Table5.java  | 100 ++-
 .../apache/cayenne/crypto/db/auto/_Table6.java  |  84 ++-
 .../java8/db/auto/_LocalDateTestEntity.java     |  66 +-
 .../java8/db/auto/_LocalDateTimeTestEntity.java |  66 +-
 .../java8/db/auto/_LocalTimeTestEntity.java     |  66 +-
 .../java/org/apache/cayenne/BaseDataObject.java | 722 +++++++++++++++++++
 .../org/apache/cayenne/CayenneDataObject.java   | 664 +----------------
 .../cayenne/access/DataContextExtrasIT.java     |  25 +-
 .../access/DataContextPrefetchExtrasIT.java     |  10 +-
 .../array_type/auto/_ArrayTestEntity.java       |  67 +-
 .../testdo/binary_pk/auto/_BinaryPKTest1.java   |  75 +-
 .../testdo/binary_pk/auto/_BinaryPKTest2.java   |  74 +-
 .../cayenne/testdo/cay_2032/auto/_Team.java     |  60 +-
 .../cayenne/testdo/cay_2032/auto/_User.java     |  75 +-
 .../testdo/compound/auto/_CharFkTestEntity.java |  74 +-
 .../testdo/compound/auto/_CharPkTestEntity.java |  90 ++-
 .../compound/auto/_CompoundFkTestEntity.java    |  74 +-
 .../compound/auto/_CompoundPkTestEntity.java    | 105 ++-
 .../testdo/date_time/auto/_CalendarEntity.java  |  66 +-
 .../testdo/date_time/auto/_DateTestEntity.java  |  96 ++-
 .../cayenne/testdo/db1/auto/_CrossdbM1E1.java   |  86 ++-
 .../cayenne/testdo/db2/auto/_CrossdbM2E1.java   |  75 +-
 .../cayenne/testdo/db2/auto/_CrossdbM2E2.java   |  83 ++-
 .../testdo/deleterules/auto/_DeleteCascade.java |  74 +-
 .../testdo/deleterules/auto/_DeleteDeny.java    |  74 +-
 .../testdo/deleterules/auto/_DeleteNullify.java |  74 +-
 .../testdo/deleterules/auto/_DeleteRule.java    |  97 ++-
 .../testdo/embeddable/auto/_EmbedEntity1.java   |  97 ++-
 .../testdo/enum_test/auto/_EnumEntity.java      |  67 +-
 .../extended_type/auto/_ExtendedTypeEntity.java |  67 +-
 .../generated/auto/_GeneratedColumnCompKey.java |  74 +-
 .../auto/_GeneratedColumnCompMaster.java        |  75 +-
 .../generated/auto/_GeneratedColumnDep.java     |  74 +-
 .../generated/auto/_GeneratedColumnTest2.java   |  67 +-
 .../auto/_GeneratedColumnTestEntity.java        |  74 +-
 .../testdo/generated/auto/_GeneratedF1.java     |  56 ++
 .../testdo/generated/auto/_GeneratedF2.java     |  56 ++
 .../testdo/inheritance/auto/_BaseEntity.java    |  83 ++-
 .../inheritance/auto/_DirectToSubEntity.java    |  60 +-
 .../testdo/inheritance/auto/_RelatedEntity.java |  71 +-
 .../testdo/inheritance/auto/_SubEntity.java     |  48 ++
 .../testdo/inheritance_flat/auto/_Group.java    |  65 +-
 .../inheritance_flat/auto/_GroupProperties.java |  89 ++-
 .../testdo/inheritance_flat/auto/_Role.java     | 109 ++-
 .../testdo/inheritance_flat/auto/_User.java     |  55 ++
 .../inheritance_flat/auto/_UserProperties.java  |  89 ++-
 .../auto/_AbstractPerson.java                   |  90 ++-
 .../inheritance_people/auto/_Address.java       |  74 +-
 .../inheritance_people/auto/_ClientCompany.java |  75 +-
 .../auto/_CustomerRepresentative.java           |  70 +-
 .../inheritance_people/auto/_Department.java    |  84 ++-
 .../inheritance_people/auto/_Employee.java      |  80 +-
 .../inheritance_people/auto/_Manager.java       |  56 ++
 .../inheritance_people/auto/_PersonNotes.java   |  74 +-
 .../inheritance_vertical/auto/_Iv1Root.java     |  82 ++-
 .../inheritance_vertical/auto/_Iv1Sub1.java     |  63 +-
 .../inheritance_vertical/auto/_Iv2Root.java     |  67 +-
 .../inheritance_vertical/auto/_Iv2Sub1.java     |  55 ++
 .../testdo/inheritance_vertical/auto/_Iv2X.java |  52 +-
 .../inheritance_vertical/auto/_IvAbstract.java  |  67 +-
 .../inheritance_vertical/auto/_IvBase.java      |  82 ++-
 .../auto/_IvBaseWithLock.java                   | 103 ++-
 .../inheritance_vertical/auto/_IvConcrete.java  |  80 +-
 .../inheritance_vertical/auto/_IvImpl.java      |  94 ++-
 .../auto/_IvImplWithLock.java                   |  95 ++-
 .../inheritance_vertical/auto/_IvOther.java     |  97 ++-
 .../inheritance_vertical/auto/_IvRoot.java      |  82 ++-
 .../inheritance_vertical/auto/_IvSub1.java      |  63 +-
 .../inheritance_vertical/auto/_IvSub1Sub1.java  |  63 +-
 .../inheritance_vertical/auto/_IvSub2.java      |  78 +-
 .../inheritance_vertical/auto/_IvSub3.java      |  56 +-
 .../auto/_Lifecycle.java                        |  67 +-
 .../testdo/lifecycles/auto/_Lifecycles.java     |  67 +-
 .../testdo/lob/auto/_BlobTestEntity.java        |  67 +-
 .../testdo/lob/auto/_ClobTestEntity.java        |  75 +-
 .../testdo/lob/auto/_ClobTestRelation.java      |  89 ++-
 .../testdo/lob/auto/_NClobTestEntity.java       |  67 +-
 .../testdo/locking/auto/_LockingHelper.java     |  74 +-
 .../locking/auto/_RelLockingTestEntity.java     |  84 ++-
 .../locking/auto/_SimpleLockingTestEntity.java  |  82 ++-
 .../testdo/map_to_many/auto/_IdMapToMany.java   |  60 +-
 .../map_to_many/auto/_IdMapToManyTarget.java    |  59 +-
 .../testdo/map_to_many/auto/_MapToMany.java     |  60 +-
 .../map_to_many/auto/_MapToManyTarget.java      |  74 +-
 .../meaningful_pk/auto/_MeaningfulPKDep.java    |  74 +-
 .../meaningful_pk/auto/_MeaningfulPKTest1.java  |  90 ++-
 .../meaningful_pk/auto/_MeaningfulPk.java       |  67 +-
 .../testdo/misc_types/auto/_ArraysEntity.java   | 112 ++-
 .../misc_types/auto/_CharacterEntity.java       |  67 +-
 .../misc_types/auto/_SerializableEntity.java    |  67 +-
 .../auto/_MixedPersistenceStrategy.java         |  90 ++-
 .../auto/_MixedPersistenceStrategy2.java        |  74 +-
 .../cayenne/testdo/mt/auto/_MtTable1.java       |  90 ++-
 .../testdo/mt/auto/_MtTable1Subclass1.java      |  63 +-
 .../testdo/mt/auto/_MtTable1Subclass2.java      |  63 +-
 .../cayenne/testdo/mt/auto/_MtTable2.java       |  83 ++-
 .../cayenne/testdo/mt/auto/_MtTable3.java       | 105 ++-
 .../cayenne/testdo/mt/auto/_MtTable4.java       |  60 +-
 .../cayenne/testdo/mt/auto/_MtTable5.java       |  60 +-
 .../testdo/no_pk/auto/_NoPkTestEntity.java      |  67 +-
 .../numeric_types/auto/_BigDecimalEntity.java   |  66 +-
 .../numeric_types/auto/_BigIntegerEntity.java   |  66 +-
 .../auto/_BitNumberTestEntity.java              |  67 +-
 .../numeric_types/auto/_BitTestEntity.java      |  67 +-
 .../numeric_types/auto/_BooleanTestEntity.java  |  67 +-
 .../numeric_types/auto/_DecimalPKTest1.java     |  82 ++-
 .../auto/_DecimalPKTestEntity.java              |  81 ++-
 .../testdo/numeric_types/auto/_LongEntity.java  |  67 +-
 .../numeric_types/auto/_SmallintTestEntity.java |  67 +-
 .../numeric_types/auto/_TinyintTestEntity.java  |  67 +-
 .../testdo/oneway/auto/_OnewayTable1.java       |  52 +-
 .../testdo/oneway/auto/_OnewayTable2.java       |  74 +-
 .../testdo/oneway/auto/_OnewayTable3.java       |  60 +-
 .../testdo/oneway/auto/_OnewayTable4.java       |  52 +-
 .../primitive/auto/_PrimitivesTestEntity.java   |  84 ++-
 .../testdo/qualified/auto/_Qualified1.java      |  90 ++-
 .../testdo/qualified/auto/_Qualified2.java      |  89 ++-
 .../testdo/quotemap/auto/_QuoteAdress.java      |  89 ++-
 .../testdo/quotemap/auto/_Quote_Person.java     | 133 +++-
 .../testdo/reflexive/auto/_Reflexive.java       |  84 ++-
 .../relationships/auto/_FkOfDifferentType.java  |  59 +-
 .../relationships/auto/_MeaningfulFK.java       |  74 +-
 .../relationships/auto/_ReflexiveAndToOne.java  |  93 ++-
 .../relationships/auto/_RelationshipHelper.java |  97 ++-
 .../relationships_activity/auto/_Activity.java  |  91 ++-
 .../auto/_ActivityResult.java                   |  97 ++-
 .../relationships_child_master/auto/_Child.java |  59 +-
 .../auto/_Master.java                           |  75 +-
 .../relationships_clob/auto/_ClobDetail.java    |  74 +-
 .../relationships_clob/auto/_ClobMaster.java    |  90 ++-
 .../auto/_CollectionToMany.java                 |  60 +-
 .../auto/_CollectionToManyTarget.java           |  59 +-
 .../auto/_DeleteRuleFlatA.java                  |  60 +-
 .../auto/_DeleteRuleFlatB.java                  |  60 +-
 .../auto/_DeleteRuleTest1.java                  |  59 +-
 .../auto/_DeleteRuleTest2.java                  |  71 +-
 .../auto/_DeleteRuleTest3.java                  |  59 +-
 .../auto/_FlattenedCircular.java                |  71 +-
 .../auto/_FlattenedTest1.java                   | 115 ++-
 .../auto/_FlattenedTest2.java                   |  84 ++-
 .../auto/_FlattenedTest3.java                   |  94 ++-
 .../auto/_FlattenedTest4.java                   |  74 +-
 .../auto/_FlattenedTest5.java                   |  74 +-
 .../auto/_SetToMany.java                        |  60 +-
 .../auto/_SetToManyTarget.java                  |  59 +-
 .../auto/_ToManyFkDep.java                      |  98 ++-
 .../auto/_ToManyFkRoot.java                     |  90 ++-
 .../auto/_ToManyRoot2.java                      |  75 +-
 .../relationships_to_one_fk/auto/_ToOneFK1.java |  59 +-
 .../relationships_to_one_fk/auto/_ToOneFK2.java |  59 +-
 .../return_types/auto/_ReturnTypesMap1.java     | 347 ++++++++-
 .../return_types/auto/_ReturnTypesMap2.java     | 108 ++-
 .../return_types/auto/_ReturnTypesMapLobs1.java |  78 +-
 .../testdo/soft_delete/auto/_SoftDelete.java    |  82 ++-
 .../table_primitives/auto/_TablePrimitives.java |  84 ++-
 .../cayenne/testdo/testmap/auto/_ArtGroup.java  |  95 ++-
 .../cayenne/testdo/testmap/auto/_Artist.java    | 112 ++-
 .../testdo/testmap/auto/_ArtistCallback.java    |  81 ++-
 .../testdo/testmap/auto/_ArtistExhibit.java     |  68 +-
 .../testdo/testmap/auto/_CompoundPainting.java  | 151 +++-
 .../auto/_CompoundPaintingLongNames.java        | 175 ++++-
 .../cayenne/testdo/testmap/auto/_Exhibit.java   |  99 ++-
 .../cayenne/testdo/testmap/auto/_Gallery.java   |  86 ++-
 .../_MeaningfulGeneratedColumnTestEntity.java   |  82 ++-
 .../testdo/testmap/auto/_NullTestEntity.java    |  67 +-
 .../cayenne/testdo/testmap/auto/_Painting.java  | 117 ++-
 .../cayenne/testdo/testmap/auto/_Painting1.java |  88 ++-
 .../testdo/testmap/auto/_PaintingInfo.java      |  89 ++-
 .../cayenne/testdo/testmap/auto/_ROArtist.java  |  82 ++-
 .../testdo/testmap/auto/_ROPainting.java        |  81 ++-
 .../testmap/auto/_RWCompoundPainting.java       |  96 ++-
 .../testdo/testmap/auto/_SubPainting.java       |  67 +-
 .../apache/cayenne/testdo/things/auto/_Bag.java |  89 ++-
 .../cayenne/testdo/things/auto/_Ball.java       |  94 ++-
 .../apache/cayenne/testdo/things/auto/_Box.java |  98 ++-
 .../cayenne/testdo/things/auto/_BoxInfo.java    |  70 +-
 .../cayenne/testdo/things/auto/_Thing.java      |  93 ++-
 .../cayenne/testdo/toone/auto/_TooneDep.java    |  59 +-
 .../cayenne/testdo/toone/auto/_TooneMaster.java |  59 +-
 .../auto/_Customer.java                         |  75 +-
 .../auto/_Product.java                          |  97 ++-
 .../cayenne/testdo/uuid/auto/_UuidPkEntity.java |  66 +-
 .../testdo/uuid/auto/_UuidTestEntity.java       |  66 +-
 .../testdo/weighted_sort/auto/_SortDep.java     |  59 +-
 .../testdo/weighted_sort/auto/_SortRoot.java    |  60 +-
 .../src/test/resources/testmap.map.xml          |   2 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 docs/doc/src/main/resources/UPGRADE.txt         |   5 +
 .../tools/CayenneGeneratorIntegrationTest.java  |  12 +-
 214 files changed, 16190 insertions(+), 1612 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/7b762e9a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7b762e9a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7b762e9a/cayenne-server/src/test/resources/testmap.map.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7b762e9a/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/RELEASE-NOTES.txt
index b2ee928,7a373a0..c42dad6
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@@ -13,11 -13,8 +13,12 @@@ Date
  ----------------------------------
  Changes/New Features:
  
 +CAY-2152 Redesign project file upgrade system
  CAY-2329 Update project dependencies
+ CAY-2330 Field based data objects
 +CAY-2335 New XML loading/saving mechanics with support of plugable handlers
 +CAY-2336 Support for comments in Modeler
 +CAY-2339 Compatibility module to support old versions of projects at runtime
  
  Bug Fixes:
  

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7b762e9a/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/UPGRADE.txt
index 2eee938,3594439..ddc72e4
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@@ -7,13 -7,11 +7,18 @@@ IMPORTANT: be sure to read all notes fo
  
  UPGRADING TO 4.1.M1
  
 +* Per CAY-2335 ServerRuntime by default will fail to load projects in case of version mismatch.
 +      You have two options:
 +      - update project via opening it in Cayenne Modeler
 +      - if you are unable to do so you can use new cayenne-project-compatibility module,
 +      to enable it simply add it as a dependency in Maven (or any other build system you use), however
 +      this module can support only versions created by Cayenne 3.1 or later.
 +
+ * Per CAY-2330 Field-based data objects are introduced and enabled by default.
+       Your existing code will continue to work, but in order to get benefits from this feature you should
+       regenerate code via Modeler ("Tools" -> "Generate Classes") or cgen tools in Maven/Ant/Gradle plugins.
+       Also note that serialization format of old data objects have changed, make sure you don't use serialization
+       form to store your objects.
  
  UPGRADING TO 4.0.B1