You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/12/18 18:21:03 UTC

[02/11] cayenne git commit: CAY-2176 Java 7 diamond class generation templates

CAY-2176 Java 7 diamond class generation templates

* updated cgen templates
* regenerated unit tests with the new templates and no String properties
* cleaned up String property refs in unit tests


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

Branch: refs/heads/master
Commit: bb981ae14325ec1a46ac0cfdab6bab6ca0eb9051
Parents: 832401b
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sun Dec 18 19:18:18 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sun Dec 18 20:00:33 2016 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/query/SQLTemplate.java   | 29 +++++++----
 .../cayenne/CayenneDataObjectInContextIT.java   | 17 ++-----
 .../cayenne/CayenneDataObjectValidationIT.java  |  4 +-
 .../cayenne/DataContextMaxIdQualifierIT.java    |  7 ++-
 .../cayenne/PersistenceByReachabilityIT.java    |  6 +--
 .../apache/cayenne/access/DataContextIT.java    | 41 +++++----------
 .../cayenne/access/DataContextOrderingIT.java   | 18 +++----
 .../cayenne/access/DataContextOuterJoinsIT.java | 46 ++++++++---------
 .../access/DataContextPrefetchExtrasIT.java     |  9 +---
 .../cayenne/access/DataContextPrefetchIT.java   | 52 +++++++++-----------
 .../DataContextPrefetchQualifierOverlapIT.java  | 13 ++---
 .../access/DataContextRefreshQueryIT.java       |  6 +--
 .../cayenne/access/DataContextRefreshingIT.java |  4 +-
 .../access/DataContextSQLTemplateIT.java        |  4 +-
 .../apache/cayenne/access/DataRowUtilsIT.java   | 10 +---
 .../cayenne/access/FlattenedPrefetchIT.java     | 24 +++------
 .../apache/cayenne/access/JointPrefetchIT.java  | 35 +++----------
 .../cayenne/access/NestedDataContextReadIT.java | 13 ++---
 .../access/NestedDataContextWriteIT.java        |  6 +--
 .../access/PrefetchProcessorTreeBuilderIT.java  | 11 ++---
 .../access/SimpleIdIncrementalFaultListIT.java  |  9 +---
 .../SimpleIdIncrementalFaultListPrefetchIT.java |  2 +-
 .../org/apache/cayenne/access/ToManyListIT.java |  4 +-
 .../select/DefaultSelectTranslatorIT.java       | 17 +++----
 .../apache/cayenne/map/MapLoaderLoadTest.java   |  4 +-
 .../query/SelectQueryFetchLimitOrderingIT.java  |  2 +-
 .../SelectQueryPrefetchRouterActionIT.java      |  8 +--
 .../cayenne/query/StatementFetchSizeIT.java     |  2 +-
 .../array_type/auto/_ArrayTestEntity.java       |  2 +-
 .../testdo/binary_pk/auto/_BinaryPKTest1.java   |  9 +---
 .../testdo/binary_pk/auto/_BinaryPKTest2.java   |  9 +---
 .../testdo/compound/auto/_CharFkTestEntity.java |  9 +---
 .../testdo/compound/auto/_CharPkTestEntity.java | 13 ++---
 .../compound/auto/_CompoundFkTestEntity.java    |  9 +---
 .../compound/auto/_CompoundPkTestEntity.java    | 17 ++-----
 .../cayenne/testdo/testmap/auto/_Artist.java    | 19 ++-----
 .../templates/v1_2/client-superclass.vm         |  8 +--
 .../templates/v1_2/embeddable-superclass.vm     |  2 +-
 .../resources/templates/v1_2/singleclass.vm     |  8 +--
 .../main/resources/templates/v1_2/superclass.vm |  8 +--
 .../cayenne/tools/CayenneGeneratorMojoTest.java |  2 +-
 41 files changed, 189 insertions(+), 329 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
index 62c7a8a..e8db56d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
@@ -19,16 +19,6 @@
 
 package org.apache.cayenne.query;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
 import org.apache.cayenne.access.QueryEngine;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -42,6 +32,16 @@ import org.apache.cayenne.util.XMLSerializable;
 import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.collections.Transformer;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+
 /**
  * A query that executes unchanged (except for template preprocessing) "raw" SQL
  * specified by the user. <h3>Template Script</h3>
@@ -672,6 +672,15 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery, XM
 	}
 
 	/**
+	 * Adds a prefetch with specified relationship path to the query.
+	 *
+	 * @since 4.0
+	 */
+	public void addPrefetch(PrefetchTreeNode prefetchElement) {
+		metaData.mergePrefetch(prefetchElement);
+	}
+
+	/**
 	 * @since 1.2
 	 */
 	public void removePrefetch(String prefetch) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectInContextIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectInContextIT.java b/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectInContextIT.java
index fe39834..a99918c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectInContextIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectInContextIT.java
@@ -22,7 +22,6 @@ package org.apache.cayenne;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
@@ -35,13 +34,7 @@ import org.junit.Test;
 
 import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class CayenneDataObjectInContextIT extends ServerCase {
@@ -213,9 +206,7 @@ public class CayenneDataObjectInContextIT extends ServerCase {
 
         tArtist.insert(7, "m6");
 
-        SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
-                Artist.ARTIST_NAME_PROPERTY,
-                "m6"));
+        SelectQuery q = new SelectQuery(Artist.class, Artist.ARTIST_NAME.eq("m6"));
 
         List<Artist> artists = context.performQuery(q);
         assertEquals(1, artists.size());
@@ -229,9 +220,7 @@ public class CayenneDataObjectInContextIT extends ServerCase {
 
         tArtist.insert(7, "m6");
 
-        SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
-                Artist.ARTIST_NAME_PROPERTY,
-                "m6"));
+        SelectQuery q = new SelectQuery(Artist.class, Artist.ARTIST_NAME.eq("m6"));
 
         Artist a1 = (Artist) Cayenne.objectForQuery(context, q);
         Artist a2 = (Artist) Cayenne.objectForQuery(context, q);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectValidationIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectValidationIT.java b/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectValidationIT.java
index 5eebeee..1e4c710 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectValidationIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/CayenneDataObjectValidationIT.java
@@ -87,7 +87,7 @@ public class CayenneDataObjectValidationIT extends ServerCase {
         assertEquals(1, failures.size());
 
         BeanValidationFailure failure = (BeanValidationFailure) failures.get(0);
-        assertEquals(Artist.ARTIST_NAME_PROPERTY, failure.getProperty());
+        assertEquals(Artist.ARTIST_NAME.getName(), failure.getProperty());
 
         // fix the problem and see if it goes away
         artist.setArtistName("aa");
@@ -119,7 +119,7 @@ public class CayenneDataObjectValidationIT extends ServerCase {
         assertEquals(1, failures.size());
 
         BeanValidationFailure failure = (BeanValidationFailure) failures.get(0);
-        assertEquals(Artist.ARTIST_NAME_PROPERTY, failure.getProperty());
+        assertEquals(Artist.ARTIST_NAME.getName(), failure.getProperty());
 
         // fix the problem and see if it goes away
         artist.setArtistName("aa");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/DataContextMaxIdQualifierIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/DataContextMaxIdQualifierIT.java b/cayenne-server/src/test/java/org/apache/cayenne/DataContextMaxIdQualifierIT.java
index 96c5759..42733b3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/DataContextMaxIdQualifierIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/DataContextMaxIdQualifierIT.java
@@ -21,7 +21,6 @@ package org.apache.cayenne;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
@@ -92,7 +91,7 @@ public class DataContextMaxIdQualifierIT extends ServerCase {
         runtime.getDataDomain().setMaxIdQualifierSize(10);
         
         final SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjointById());
 
         int queriesCount = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
 
@@ -110,7 +109,7 @@ public class DataContextMaxIdQualifierIT extends ServerCase {
         runtime.getDataDomain().setMaxIdQualifierSize(0);
 
         final SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjointById());
 
         int queriesCount = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
 
@@ -128,7 +127,7 @@ public class DataContextMaxIdQualifierIT extends ServerCase {
         runtime.getDataDomain().setMaxIdQualifierSize(-1);
 
         final SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjointById());
 
         int queriesCount = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/PersistenceByReachabilityIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/PersistenceByReachabilityIT.java b/cayenne-server/src/test/java/org/apache/cayenne/PersistenceByReachabilityIT.java
index ad545cb..42d0a22 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/PersistenceByReachabilityIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/PersistenceByReachabilityIT.java
@@ -84,7 +84,7 @@ public class PersistenceByReachabilityIT extends ServerCase {
         // this is the case where exception must be thrown as DataContexts are
         // different
         try {
-            doC2.addToManyTarget(Artist.PAINTING_ARRAY_PROPERTY, doC1, false);
+            doC2.addToManyTarget(Artist.PAINTING_ARRAY.getName(), doC1, false);
             fail("failed to detect relationship between objects in different DataContexts");
         }
         catch (CayenneRuntimeException ex) {
@@ -97,7 +97,7 @@ public class PersistenceByReachabilityIT extends ServerCase {
         Painting transientDO = context.newObject(Painting.class);
 
         Artist persistentDO = new Artist();
-        persistentDO.addToManyTarget(Artist.PAINTING_ARRAY_PROPERTY, transientDO, false);
+        persistentDO.addToManyTarget(Artist.PAINTING_ARRAY.getName(), transientDO, false);
 
         assertEquals(PersistenceState.NEW, transientDO.getPersistenceState());
     }
@@ -107,7 +107,7 @@ public class PersistenceByReachabilityIT extends ServerCase {
         Painting persistentDO = context.newObject(Painting.class);
 
         Artist transientDO = new Artist();
-        transientDO.addToManyTarget(Artist.PAINTING_ARRAY_PROPERTY, persistentDO, false);
+        transientDO.addToManyTarget(Artist.PAINTING_ARRAY.getName(), persistentDO, false);
 
         assertEquals(PersistenceState.NEW, transientDO.getPersistenceState());
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
index 69a1e79..e5068be 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
@@ -31,13 +31,11 @@ import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.ObjectIdQuery;
-import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.testmap.Artist;
@@ -64,19 +62,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class DataContextIT extends ServerCase {
@@ -167,8 +157,7 @@ public class DataContextIT extends ServerCase {
 	public void testCurrentSnapshot1() throws Exception {
 		createSingleArtistDataSet();
 
-		SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery query = new SelectQuery(Artist.class, Artist.ARTIST_NAME.eq("artist1"));
 		Artist artist = (Artist) context.performQuery(query).get(0);
 
 		DataRow snapshot = context.currentSnapshot(artist);
@@ -182,8 +171,7 @@ public class DataContextIT extends ServerCase {
 		createSingleArtistDataSet();
 
 		// test null values
-		SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery<Artist> query = new SelectQuery<>(Artist.class, Artist.ARTIST_NAME.eq("artist1"));
 		Artist artist = (Artist) context.performQuery(query).get(0);
 
 		artist.setArtistName(null);
@@ -204,8 +192,7 @@ public class DataContextIT extends ServerCase {
 		createSingleArtistDataSet();
 
 		// test null values
-		SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery query = new SelectQuery(Artist.class, Artist.ARTIST_NAME.eq("artist1"));
 		Artist artist = (Artist) context.performQuery(query).get(0);
 
 		// test FK relationship snapshotting
@@ -235,14 +222,14 @@ public class DataContextIT extends ServerCase {
 		ObjectId eId = new ObjectId("Exhibit", Exhibit.EXHIBIT_ID_PK_COLUMN, 2);
 		Exhibit e = (Exhibit) context.performQuery(new ObjectIdQuery(eId)).get(0);
 
-		assertTrue(e.readPropertyDirectly(Exhibit.TO_GALLERY_PROPERTY) instanceof Fault);
+		assertTrue(e.readPropertyDirectly(Exhibit.TO_GALLERY.getName()) instanceof Fault);
 
 		DataRow snapshot = context.currentSnapshot(e);
 
 		// assert that after taking a snapshot, we have FK in, but the
 		// relationship
 		// is still a Fault
-		assertTrue(e.readPropertyDirectly(Exhibit.TO_GALLERY_PROPERTY) instanceof Fault);
+		assertTrue(e.readPropertyDirectly(Exhibit.TO_GALLERY.getName()) instanceof Fault);
 		assertEquals(new Integer(33002), snapshot.get("GALLERY_ID"));
 	}
 
@@ -331,8 +318,7 @@ public class DataContextIT extends ServerCase {
 		// verify that the result is not messed up
 
 		SelectQuery query = new SelectQuery(Artist.class);
-		Ordering ordering = new Ordering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING_INSENSITIVE);
-		query.addOrdering(ordering);
+		query.addOrdering(Artist.ARTIST_NAME.ascInsensitive());
 		query.setDistinct(true);
 
 		List<Artist> objects = context.performQuery(query);
@@ -558,10 +544,9 @@ public class DataContextIT extends ServerCase {
 	public void testCommitChangesRO2() throws Exception {
 		createArtistsDataSet();
 
-		SelectQuery query = new SelectQuery(ROArtist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery query = new SelectQuery(ROArtist.class, Artist.ARTIST_NAME.eq("artist1"));
 		ROArtist a1 = (ROArtist) context.performQuery(query).get(0);
-		a1.writeProperty(ROArtist.ARTIST_NAME_PROPERTY, "abc");
+		a1.writeProperty(ROArtist.ARTIST_NAME.getName(), "abc");
 
 		try {
 			context.commitChanges();
@@ -577,8 +562,7 @@ public class DataContextIT extends ServerCase {
 
 		createArtistsDataSet();
 
-		SelectQuery query = new SelectQuery(ROArtist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery query = new SelectQuery(ROArtist.class, Artist.ARTIST_NAME.eq("artist1"));
 		ROArtist a1 = (ROArtist) context.performQuery(query).get(0);
 		context.deleteObjects(a1);
 
@@ -595,8 +579,7 @@ public class DataContextIT extends ServerCase {
 	public void testCommitChangesRO4() throws Exception {
 		createArtistsDataSet();
 
-		SelectQuery query = new SelectQuery(ROArtist.class, ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY,
-				"artist1"));
+		SelectQuery query = new SelectQuery(ROArtist.class, Artist.ARTIST_NAME.eq("artist1"));
 		ROArtist a1 = (ROArtist) context.performQuery(query).get(0);
 
 		Painting painting = context.newObject(Painting.class);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOrderingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOrderingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOrderingIT.java
index a66fd16..524411d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOrderingIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOrderingIT.java
@@ -19,9 +19,7 @@
 package org.apache.cayenne.access;
 
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
@@ -64,8 +62,8 @@ public class DataContextOrderingIT extends ServerCase {
         context.commitChanges();
 
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.DESCENDING);
-        query.addOrdering(Artist.DATE_OF_BIRTH_PROPERTY, SortOrder.DESCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.desc());
+        query.addOrdering(Artist.DATE_OF_BIRTH.desc());
 
         List<Artist> list = context.performQuery(query);
         assertEquals(3, list.size());
@@ -105,16 +103,14 @@ public class DataContextOrderingIT extends ServerCase {
 
         context.commitChanges();
 
-        SelectQuery query1 = new SelectQuery(Artist.class);
+        SelectQuery<Artist> query1 = new SelectQuery<>(Artist.class);
 
         // per CAY-1074, adding a to-many join to expression messes up the ordering
-        query1.andQualifier(ExpressionFactory.noMatchExp(
-                Artist.PAINTING_ARRAY_PROPERTY,
-                null));
-        query1.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.DESCENDING);
-        query1.addOrdering(Artist.DATE_OF_BIRTH_PROPERTY, SortOrder.DESCENDING);
+        query1.andQualifier(Artist.PAINTING_ARRAY.ne((List<Painting>) null));
+        query1.addOrdering(Artist.ARTIST_NAME.desc());
+        query1.addOrdering(Artist.DATE_OF_BIRTH.desc());
 
-        List<Artist> list1 = context.performQuery(query1);
+        List<Artist> list1 = query1.select(context);
         assertEquals(2, list1.size());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOuterJoinsIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOuterJoinsIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOuterJoinsIT.java
index 5c13490..3842a5f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOuterJoinsIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextOuterJoinsIT.java
@@ -20,9 +20,7 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -84,10 +82,9 @@ public class DataContextOuterJoinsIT extends ServerCase {
 		artistGroupHelper.insert(1, 33002);
 		artistGroupHelper.insert(1, 33004);
 
-		SelectQuery missingToManyQuery = new SelectQuery(Artist.class);
-		missingToManyQuery.andQualifier(ExpressionFactory.matchExp(Artist.GROUP_ARRAY_PROPERTY
-				+ Entity.OUTER_JOIN_INDICATOR, null));
-		missingToManyQuery.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		SelectQuery<Artist> missingToManyQuery = new SelectQuery<>(Artist.class);
+		missingToManyQuery.andQualifier(Artist.GROUP_ARRAY.outer().isNull());
+		missingToManyQuery.addOrdering(Artist.ARTIST_NAME.asc());
 
 		List<Artist> artists = context.performQuery(missingToManyQuery);
 		assertEquals(1, artists.size());
@@ -106,19 +103,17 @@ public class DataContextOuterJoinsIT extends ServerCase {
 		paintingHelper.insert(33002, 33002, "P2");
 
 		SelectQuery missingToManyQuery = new SelectQuery(Artist.class);
-		missingToManyQuery.andQualifier(ExpressionFactory.matchExp(Artist.PAINTING_ARRAY_PROPERTY
-				+ Entity.OUTER_JOIN_INDICATOR, null));
-		missingToManyQuery.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		missingToManyQuery.andQualifier(Artist.PAINTING_ARRAY.outer().isNull());
+		missingToManyQuery.addOrdering(Artist.ARTIST_NAME.asc());
 
 		List<Artist> artists = context.performQuery(missingToManyQuery);
 		assertEquals(2, artists.size());
 		assertEquals("BB1", artists.get(0).getArtistName());
 
-		SelectQuery mixedConditionQuery = new SelectQuery(Artist.class);
-		mixedConditionQuery.andQualifier(ExpressionFactory.matchExp(Artist.PAINTING_ARRAY_PROPERTY
-				+ Entity.OUTER_JOIN_INDICATOR, null));
-		mixedConditionQuery.orQualifier(ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY, "AA1"));
-		mixedConditionQuery.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		SelectQuery<Artist> mixedConditionQuery = new SelectQuery<>(Artist.class);
+		mixedConditionQuery.andQualifier(Artist.PAINTING_ARRAY.outer().isNull());
+		mixedConditionQuery.orQualifier(Artist.ARTIST_NAME.eq("AA1"));
+		mixedConditionQuery.addOrdering(Artist.ARTIST_NAME.asc());
 
 		artists = context.performQuery(mixedConditionQuery);
 		assertEquals(3, artists.size());
@@ -138,21 +133,20 @@ public class DataContextOuterJoinsIT extends ServerCase {
 		paintingHelper.insert(33001, 33001, "P1");
 		paintingHelper.insert(33002, 33002, "P2");
 
-		SelectQuery missingToManyQuery = new SelectQuery(Artist.class);
-		missingToManyQuery.andQualifier(Expression.fromString("paintingArray+ = null"));
-		missingToManyQuery.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		SelectQuery<Artist> missingToManyQuery = new SelectQuery<>(Artist.class);
+		missingToManyQuery.andQualifier(ExpressionFactory.exp("paintingArray+ = null"));
+		missingToManyQuery.addOrdering(Artist.ARTIST_NAME.asc());
 
-		List<Artist> artists = context.performQuery(missingToManyQuery);
+		List<Artist> artists = missingToManyQuery.select(context);
 		assertEquals(2, artists.size());
 		assertEquals("BB1", artists.get(0).getArtistName());
 
-		SelectQuery mixedConditionQuery = new SelectQuery(Artist.class);
-		mixedConditionQuery.andQualifier(ExpressionFactory.matchExp(Artist.PAINTING_ARRAY_PROPERTY
-				+ Entity.OUTER_JOIN_INDICATOR, null));
-		mixedConditionQuery.orQualifier(ExpressionFactory.matchExp(Artist.ARTIST_NAME_PROPERTY, "AA1"));
-		mixedConditionQuery.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		SelectQuery<Artist> mixedConditionQuery = new SelectQuery<>(Artist.class);
+		mixedConditionQuery.andQualifier(Artist.PAINTING_ARRAY.outer().isNull());
+		mixedConditionQuery.orQualifier(Artist.ARTIST_NAME.eq("AA1"));
+		mixedConditionQuery.addOrdering(Artist.ARTIST_NAME.asc());
 
-		artists = context.performQuery(mixedConditionQuery);
+		artists = mixedConditionQuery.select(context);
 		assertEquals(3, artists.size());
 		assertEquals("AA1", artists.get(0).getArtistName());
 		assertEquals("BB1", artists.get(1).getArtistName());
@@ -169,11 +163,11 @@ public class DataContextOuterJoinsIT extends ServerCase {
 		paintingHelper.insert(33002, 33002, "P2");
 		paintingHelper.insert(33003, null, "P3");
 
-		SelectQuery query = new SelectQuery(Painting.class);
+		SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
 
 		query.addOrdering("toArtist+.artistName", SortOrder.DESCENDING);
 
-		List<Artist> paintings = context.performQuery(query);
+		List<Painting> paintings = query.select(context);
 		assertEquals(3, paintings.size());
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 77fed66..efea9ec 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
@@ -28,7 +28,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.compound.CharFkTestEntity;
@@ -43,11 +42,7 @@ import org.junit.Test;
 
 import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Test prefetching of various obscure cases.
@@ -108,7 +103,7 @@ public class DataContextPrefetchExtrasIT extends ServerCase {
 
         SelectQuery q = new SelectQuery(CharPkTestEntity.class);
         q.addPrefetch("charFKs");
-        q.addOrdering(CharPkTestEntity.OTHER_COL_PROPERTY, SortOrder.ASCENDING);
+        q.addOrdering(CharPkTestEntity.OTHER_COL.asc());
 
         List<?> pks = context.performQuery(q);
         assertEquals(2, pks.size());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchIT.java
index aac94bf..4eb2295 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchIT.java
@@ -19,20 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.ValueHolder;
@@ -42,7 +28,6 @@ import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.QueryCacheStrategy;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
@@ -61,6 +46,15 @@ import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class DataContextPrefetchIT extends ServerCase {
 
@@ -186,7 +180,7 @@ public class DataContextPrefetchIT extends ServerCase {
 		params.put("name2", "artist3");
 		Expression e = ExpressionFactory.exp("artistName = $name1 or artistName = $name2");
 		SelectQuery<Artist> q = new SelectQuery("Artist", e.expWithParameters(params));
-		q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+		q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
 		final List<Artist> artists = context.select(q);
 
@@ -197,7 +191,7 @@ public class DataContextPrefetchIT extends ServerCase {
 				assertEquals(2, artists.size());
 
 				Artist a1 = artists.get(0);
-				List<?> toMany = (List<?>) a1.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY);
+				List<?> toMany = (List<?>) a1.readPropertyDirectly(Artist.PAINTING_ARRAY.getName());
 				assertNotNull(toMany);
 				assertFalse(((ValueHolder) toMany).isFault());
 				assertEquals(1, toMany.size());
@@ -206,7 +200,7 @@ public class DataContextPrefetchIT extends ServerCase {
 				assertEquals("p_" + a1.getArtistName(), p1.getPaintingTitle());
 
 				Artist a2 = artists.get(1);
-				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY);
+				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.PAINTING_ARRAY.getName());
 				assertNotNull(toMany2);
 				assertFalse(((ValueHolder) toMany2).isFault());
 				assertEquals(1, toMany2.size());
@@ -222,7 +216,7 @@ public class DataContextPrefetchIT extends ServerCase {
 		createTwoArtistsAndTwoPaintingsDataSet();
 
 		SelectQuery q = new SelectQuery(Artist.class);
-		q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+		q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
 		final List<Artist> artists = context.performQuery(q);
 
@@ -256,8 +250,8 @@ public class DataContextPrefetchIT extends ServerCase {
 		createTwoArtistsWithExhibitsDataSet();
 
 		SelectQuery q = new SelectQuery(Artist.class);
-		q.addPrefetch(Artist.ARTIST_EXHIBIT_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
-		q.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		q.addPrefetch(Artist.ARTIST_EXHIBIT_ARRAY.disjoint());
+		q.addOrdering(Artist.ARTIST_NAME.asc());
 
 		final List<Artist> artists = context.performQuery(q);
 
@@ -268,7 +262,7 @@ public class DataContextPrefetchIT extends ServerCase {
 
 				Artist a1 = artists.get(0);
 				assertEquals("artist2", a1.getArtistName());
-				List<?> toMany = (List<?>) a1.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY_PROPERTY);
+				List<?> toMany = (List<?>) a1.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY.getName());
 				assertNotNull(toMany);
 				assertFalse(((ValueHolder) toMany).isFault());
 				assertEquals(2, toMany.size());
@@ -279,7 +273,7 @@ public class DataContextPrefetchIT extends ServerCase {
 
 				Artist a2 = artists.get(1);
 				assertEquals("artist3", a2.getArtistName());
-				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY_PROPERTY);
+				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY.getName());
 				assertNotNull(toMany2);
 				assertFalse(((ValueHolder) toMany2).isFault());
 				assertEquals(3, toMany2.size());
@@ -341,8 +335,8 @@ public class DataContextPrefetchIT extends ServerCase {
 		createTwoArtistsWithExhibitsDataSet();
 
 		SelectQuery q = new SelectQuery(Artist.class);
-		q.addPrefetch("artistExhibitArray").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-		q.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+		q.addPrefetch(Artist.ARTIST_EXHIBIT_ARRAY.joint());
+		q.addOrdering(Artist.ARTIST_NAME.asc());
 
 		final List<Artist> artists = context.performQuery(q);
 
@@ -365,7 +359,7 @@ public class DataContextPrefetchIT extends ServerCase {
 
 				Artist a2 = artists.get(1);
 				assertEquals("artist3", a2.getArtistName());
-				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY_PROPERTY);
+				List<?> toMany2 = (List<?>) a2.readPropertyDirectly(Artist.ARTIST_EXHIBIT_ARRAY.getName());
 				assertNotNull(toMany2);
 				assertFalse(((ValueHolder) toMany2).isFault());
 				assertEquals(3, toMany2.size());
@@ -390,8 +384,8 @@ public class DataContextPrefetchIT extends ServerCase {
 		paintingEntity.removeRelationship("toArtist");
 
 		try {
-			SelectQuery q = new SelectQuery(Artist.class);
-			q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+			SelectQuery<Artist> q = new SelectQuery<>(Artist.class);
+			q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 			final List<Artist> result = context.performQuery(q);
 
 			queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
@@ -421,7 +415,7 @@ public class DataContextPrefetchIT extends ServerCase {
 
 			SelectQuery q = new SelectQuery(Artist.class);
 			q.setQualifier(ExpressionFactory.matchExp("artistName", "artist2"));
-			q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+			q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
 			final List<Artist> result = context.performQuery(q);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchQualifierOverlapIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchQualifierOverlapIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchQualifierOverlapIT.java
index bfc0b31..1880507 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchQualifierOverlapIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchQualifierOverlapIT.java
@@ -20,9 +20,7 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.testmap.Artist;
@@ -66,8 +64,7 @@ public class DataContextPrefetchQualifierOverlapIT extends ServerCase {
         SelectQuery query = new SelectQuery(Artist.class);
         query.andQualifier(ExpressionFactory
                 .likeExp("paintingArray.paintingTitle", "AB%"));
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
         List<Artist> result = context.performQuery(query);
         assertEquals(1, result.size());
@@ -83,8 +80,7 @@ public class DataContextPrefetchQualifierOverlapIT extends ServerCase {
         SelectQuery query = new SelectQuery(Artist.class);
         query.andQualifier(ExpressionFactory
                 .likeExp("paintingArray.paintingTitle", "AB%"));
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
         List<Artist> result = context.performQuery(query);
         assertEquals(1, result.size());
@@ -101,11 +97,10 @@ public class DataContextPrefetchQualifierOverlapIT extends ServerCase {
         query.andQualifier(ExpressionFactory.likeExp(
                 "paintingArray+.paintingTitle",
                 "AB%"));
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        query.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
         query.orQualifier(ExpressionFactory.likeExp("artistName", "A%"));
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.asc());
 
         List<Artist> result = context.performQuery(query);
         assertEquals(2, result.size());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryIT.java
index a4cb41e..b88b269 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryIT.java
@@ -131,9 +131,9 @@ public class DataContextRefreshQueryIT extends ServerCase {
         assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
         assertEquals(PersistenceState.HOLLOW, a2.getPersistenceState());
 
-        assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
+        assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY.getName()))
                 .isFault());
-        assertTrue(((ValueHolder) a2.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
+        assertTrue(((ValueHolder) a2.readProperty(Artist.PAINTING_ARRAY.getName()))
                 .isFault());
     }
 
@@ -209,7 +209,7 @@ public class DataContextRefreshQueryIT extends ServerCase {
 
         assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
 
-        assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
+        assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY.getName()))
                 .isFault());
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
index dc8bc8b..d74a7cd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
@@ -210,7 +210,7 @@ public class DataContextRefreshingIT extends ServerCase {
 
         // select using relationship prefetching
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
         artist = (Artist) context.performQuery(query).get(0);
         assertEquals(0, artist.getPaintingArray().size());
     }
@@ -232,7 +232,7 @@ public class DataContextRefreshingIT extends ServerCase {
         assertEquals(artist.getPaintingArray().size(), 0);
 
         // select using relationship prefetching
-        query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+        query.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
         artist = (Artist) context.performQuery(query).get(0);
         assertEquals(artist.getPaintingArray().size(), 1);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateIT.java
index d55111c..724a32f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateIT.java
@@ -107,8 +107,8 @@ public class DataContextSQLTemplateIT extends ServerCase {
 
 		EntityResult artistResult = new EntityResult(Artist.class);
 		artistResult.addDbField(Artist.ARTIST_ID_PK_COLUMN, "X");
-		artistResult.addObjectField(Artist.ARTIST_NAME_PROPERTY, "Y");
-		artistResult.addObjectField(Artist.DATE_OF_BIRTH_PROPERTY, "Z");
+		artistResult.addObjectField(Artist.ARTIST_NAME.getName(), "Y");
+		artistResult.addObjectField(Artist.DATE_OF_BIRTH.getName(), "Z");
 
 		SQLResult rsMap = new SQLResult();
 		rsMap.addEntityResult(artistResult);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
index c27f1a0..eae604d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.reflect.ArcProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
@@ -38,10 +37,7 @@ import org.junit.Test;
 
 import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class DataRowUtilsIT extends ServerCase {
@@ -119,9 +115,7 @@ public class DataRowUtilsIT extends ServerCase {
         context.commitChanges();
 
         tArtist.insert(119, "artist3");
-        SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
-                Artist.ARTIST_NAME_PROPERTY,
-                "artist3"));
+        SelectQuery query = new SelectQuery(Artist.class, Artist.ARTIST_NAME.eq("artist3"));
         Artist artist3 = (Artist) context.performQuery(query).get(0);
         assertNotSame(artist3, painting.getToArtist());
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java
index 99cfda4..61d4c93 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
@@ -38,15 +37,11 @@ import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.sql.Types;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class FlattenedPrefetchIT extends ServerCase {
@@ -121,7 +116,7 @@ public class FlattenedPrefetchIT extends ServerCase {
         createPrefetchDataSet1();
 
         SelectQuery q = new SelectQuery(Artist.class);
-        q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY);
+        q.addPrefetch(Artist.GROUP_ARRAY.disjoint());
 
         final List<Artist> objects = context.performQuery(q);
 
@@ -156,8 +151,8 @@ public class FlattenedPrefetchIT extends ServerCase {
         createPrefetchDataSet2();
 
         SelectQuery q = new SelectQuery(Painting.class);
-        q.addPrefetch(Painting.TO_ARTIST_PROPERTY);
-        q.addPrefetch(Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY);
+        q.addPrefetch(Painting.TO_ARTIST.disjoint());
+        q.addPrefetch(Painting.TO_ARTIST.dot(Artist.GROUP_ARRAY).disjoint());
 
         final List<Painting> objects = context.performQuery(q);
 
@@ -194,8 +189,7 @@ public class FlattenedPrefetchIT extends ServerCase {
         createPrefetchDataSet1();
 
         SelectQuery q = new SelectQuery(Artist.class);
-        q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        q.addPrefetch(Artist.GROUP_ARRAY.joint());
 
         final List<Artist> objects = context.performQuery(q);
 
@@ -231,12 +225,8 @@ public class FlattenedPrefetchIT extends ServerCase {
         createPrefetchDataSet2();
 
         SelectQuery q = new SelectQuery(Painting.class);
-        q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-        q
-                .addPrefetch(
-                        Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY)
-                .setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        q.addPrefetch(Painting.TO_ARTIST.joint());
+        q.addPrefetch(Painting.TO_ARTIST.dot(Artist.GROUP_ARRAY).joint());
 
         final List<Painting> objects = context.performQuery(q);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
index 2f2e702..0e3267c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/JointPrefetchIT.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.PrefetchTreeNode;
@@ -56,11 +55,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests joint prefetch handling by Cayenne access stack.
@@ -160,8 +155,7 @@ public class JointPrefetchIT extends ServerCase {
         q.setFetchLimit(2);
         q.setFetchOffset(0);
         q.addOrdering("db:ARTIST_ID", SortOrder.ASCENDING);
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        q.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
         final List<?> objects = context.performQuery(q);
 
@@ -253,11 +247,7 @@ public class JointPrefetchIT extends ServerCase {
                         + "FROM ARTIST t0, PAINTING t1 "
                         + "WHERE t0.ARTIST_ID = t1.ARTIST_ID");
 
-        PrefetchTreeNode prefetch = q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
-        assertEquals(
-                "Default semantics for SQLTemplate is assumed to be joint.",
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS,
-                prefetch.getSemantics());
+        q.addPrefetch(Artist.PAINTING_ARRAY.joint());
         q.setFetchingDataRows(false);
 
         final List<?> objects = context.performQuery(q);
@@ -379,8 +369,7 @@ public class JointPrefetchIT extends ServerCase {
 
         // query with to-many joint prefetches
         SelectQuery q = new SelectQuery(Artist.class);
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        q.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
         final List<?> objects = context.performQuery(q);
 
@@ -415,12 +404,9 @@ public class JointPrefetchIT extends ServerCase {
 
         // query with to-many joint prefetches and qualifier that doesn't match
         // prefetch....
-        Expression qualifier = ExpressionFactory.matchExp(
-                Artist.ARTIST_NAME_PROPERTY,
-                "artist1");
+        Expression qualifier = Artist.ARTIST_NAME.eq("artist1");
         SelectQuery q = new SelectQuery(Artist.class, qualifier);
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        q.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
         final List<?> objects = context.performQuery(q);
 
@@ -456,13 +442,8 @@ public class JointPrefetchIT extends ServerCase {
         createJointPrefetchDataSet2();
 
         // query with to-many joint prefetches
-        SelectQuery q = new SelectQuery(Artist.class);
-        q
-                .addPrefetch(
-                        Artist.PAINTING_ARRAY_PROPERTY
-                                + "."
-                                + Painting.TO_GALLERY_PROPERTY)
-                .setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        SelectQuery<Artist> q = new SelectQuery<>(Artist.class);
+        q.addPrefetch(Artist.PAINTING_ARRAY.dot(Painting.TO_GALLERY).joint());
 
         final DataContext context = this.context;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextReadIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextReadIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextReadIT.java
index cac997d..6b5f098 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextReadIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextReadIT.java
@@ -170,19 +170,20 @@ public class NestedDataContextReadIT extends ServerCase {
         assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
         assertEquals(PersistenceState.NEW, _new.getPersistenceState());
 
-        List<?> objects = child.performQuery(new SelectQuery(Artist.class));
+        List<Artist> objects = child.performQuery(new SelectQuery(Artist.class));
         assertEquals("All but NEW object must have been included", 4, objects.size());
 
         Iterator<?> it = objects.iterator();
-        while (it.hasNext()) {
-            DataObject next = (DataObject) it.next();
+
+        for (Artist next : objects) {
             assertEquals(PersistenceState.COMMITTED, next.getPersistenceState());
 
             int id = Cayenne.intPKForObject(next);
             if (id == 33003) {
-                assertEquals("MODDED", next.readProperty(Artist.ARTIST_NAME_PROPERTY));
+                assertEquals("MODDED", next.getArtistName());
             }
         }
+
     }
 
     @Test
@@ -345,8 +346,8 @@ public class NestedDataContextReadIT extends ServerCase {
         final ObjectContext child = runtime.newContext(context);
 
         SelectQuery q = new SelectQuery(Artist.class);
-        q.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+        q.addOrdering(Artist.ARTIST_NAME.asc());
+        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
         final List<?> results = child.performQuery(q);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextWriteIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextWriteIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextWriteIT.java
index 9c27d5a..bb188ad 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextWriteIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/NestedDataContextWriteIT.java
@@ -194,7 +194,7 @@ public class NestedDataContextWriteIT extends ServerCase {
 
         // make sure we fetch in predictable order
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.asc());
         List<?> objects = childContext.performQuery(query);
 
         assertEquals(4, objects.size());
@@ -269,7 +269,7 @@ public class NestedDataContextWriteIT extends ServerCase {
 
         // make sure we fetch in predictable order
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.asc());
         List<?> objects = childContext.performQuery(query);
 
         assertEquals(4, objects.size());
@@ -306,7 +306,7 @@ public class NestedDataContextWriteIT extends ServerCase {
 
         // make sure we fetch in predictable order
         SelectQuery query = new SelectQuery(Artist.class);
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.asc());
         List<?> objects = childContext.performQuery(query);
 
         assertEquals(4, objects.size());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilderIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilderIT.java
index f7814fe..a32e384 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilderIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilderIT.java
@@ -131,14 +131,9 @@ public class PrefetchProcessorTreeBuilderIT extends ServerCase {
         Map<Object, Object> extraRows = new HashMap<Object, Object>();
 
         PrefetchTreeNode tree = new PrefetchTreeNode();
-        tree.addPath(Artist.PAINTING_ARRAY_PROPERTY).setPhantom(false);
-        tree.addPath(
-                Artist.PAINTING_ARRAY_PROPERTY
-                        + "."
-                        + Painting.TO_GALLERY_PROPERTY
-                        + "."
-                        + Gallery.EXHIBIT_ARRAY_PROPERTY).setPhantom(false);
-        tree.addPath(Artist.ARTIST_EXHIBIT_ARRAY_PROPERTY).setPhantom(false);
+        tree.addPath(Artist.PAINTING_ARRAY.getName()).setPhantom(false);
+        tree.addPath(Artist.PAINTING_ARRAY.dot(Painting.TO_GALLERY).dot(Gallery.EXHIBIT_ARRAY).getName()).setPhantom(false);
+        tree.addPath(Artist.ARTIST_EXHIBIT_ARRAY.getName()).setPhantom(false);
 
         QueryMetadata metadata = new MockQueryMetadata() {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListIT.java
index d4e62bd..09eb017 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListIT.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.DataObject;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -39,11 +38,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class SimpleIdIncrementalFaultListIT extends ServerCase {
@@ -214,7 +209,7 @@ public class SimpleIdIncrementalFaultListIT extends ServerCase {
     public void testSort() throws Exception {
         SimpleIdIncrementalFaultList<?> list = prepareList(6);
 
-        new Ordering(Artist.ARTIST_NAME_PROPERTY, SortOrder.DESCENDING).orderList(list);
+        Artist.ARTIST_NAME.desc().orderList(list);
 
         Iterator<?> it = list.iterator();
         Artist previousArtist = null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListPrefetchIT.java
index 6e87b09..2fbef86 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListPrefetchIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListPrefetchIT.java
@@ -101,7 +101,7 @@ public class SimpleIdIncrementalFaultListPrefetchIT extends ServerCase {
 
         createArtistsDataSet();
 
-        Expression e = ExpressionFactory.likeExp(Artist.ARTIST_NAME_PROPERTY, "artist1%");
+        Expression e = Artist.ARTIST_NAME.like("artist1%");
         SelectQuery q = new SelectQuery("Artist", e);
         q.setPageSize(4);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/ToManyListIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ToManyListIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ToManyListIT.java
index 715e7e3..7058ba7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/ToManyListIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/ToManyListIT.java
@@ -45,14 +45,14 @@ public class ToManyListIT extends ServerCase {
 
     private ToManyList createForNewArtist() {
         Artist artist = context.newObject(Artist.class);
-        return new ToManyList(artist, Artist.PAINTING_ARRAY_PROPERTY);
+        return new ToManyList(artist, Artist.PAINTING_ARRAY.getName());
     }
 
     private ToManyList createForExistingArtist() {
         Artist artist = context.newObject(Artist.class);
         artist.setArtistName("aa");
         context.commitChanges();
-        return new ToManyList(artist, Artist.PAINTING_ARRAY_PROPERTY);
+        return new ToManyList(artist, Artist.PAINTING_ARRAY.getName());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
index 612f13a..0608abc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
@@ -19,14 +19,6 @@
 
 package org.apache.cayenne.access.translator.select;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Date;
-import java.util.List;
-
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
@@ -50,6 +42,11 @@ import org.apache.cayenne.unit.di.server.ServerCase;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class DefaultSelectTranslatorIT extends ServerCase {
 
@@ -435,7 +432,7 @@ public class DefaultSelectTranslatorIT extends ServerCase {
 	public void testCreateSqlString10() throws Exception {
 		// query with to-many joint prefetches
 		SelectQuery q = new SelectQuery(Artist.class);
-		q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+		q.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
 		DefaultSelectTranslator transl = new DefaultSelectTranslator(q, dataNode.getAdapter(),
 				dataNode.getEntityResolver());
@@ -459,7 +456,7 @@ public class DefaultSelectTranslatorIT extends ServerCase {
 	public void testCreateSqlString11() throws Exception {
 		// query with joint prefetches and other joins
 		SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.exp("paintingArray.paintingTitle = 'a'"));
-		q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+		q.addPrefetch(Artist.PAINTING_ARRAY.joint());
 
 		DefaultSelectTranslator transl = new DefaultSelectTranslator(q, dataNode.getAdapter(),
 				dataNode.getEntityResolver());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
index cae7d85..41529da 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
@@ -144,12 +144,12 @@ public class MapLoaderLoadTest {
         assertEquals(2, queryWithOrdering.getOrderings().size());
 
         Ordering artistNameOrdering = queryWithOrdering.getOrderings().get(0);
-        assertEquals(Artist.ARTIST_NAME_PROPERTY, artistNameOrdering.getSortSpecString());
+        assertEquals(Artist.ARTIST_NAME.getName(), artistNameOrdering.getSortSpecString());
         assertFalse(artistNameOrdering.isAscending());
         assertTrue(artistNameOrdering.isCaseInsensitive());
 
         Ordering dobOrdering = queryWithOrdering.getOrderings().get(1);
-        assertEquals(Artist.DATE_OF_BIRTH_PROPERTY, dobOrdering.getSortSpecString());
+        assertEquals(Artist.DATE_OF_BIRTH.getName(), dobOrdering.getSortSpecString());
         assertTrue(dobOrdering.isAscending());
         assertFalse(dobOrdering.isCaseInsensitive());
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
index 5ded018..926488d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
@@ -66,7 +66,7 @@ public class SelectQueryFetchLimitOrderingIT extends ServerCase {
         creatArtistsDataSet();
 
         SelectQuery query = new SelectQuery("Artist");
-        query.addOrdering(Artist.ARTIST_NAME_PROPERTY, SortOrder.ASCENDING);
+        query.addOrdering(Artist.ARTIST_NAME.asc());
 
         query.setFetchLimit(4);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
index f02efe3..6655cc0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
@@ -45,7 +45,7 @@ public class SelectQueryPrefetchRouterActionIT extends ServerCase {
     public void testPaintings1() {
         ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
         SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.matchExp("artistName", "abc"));
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
         SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
 
@@ -63,8 +63,8 @@ public class SelectQueryPrefetchRouterActionIT extends ServerCase {
     public void testPrefetchPaintings2() {
         ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
 
-        SelectQuery q = new SelectQuery(Artist.class, Expression.fromString("artistName = 'abc' or artistName = 'xyz'"));
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+        SelectQuery<Artist> q = new SelectQuery<>(Artist.class, ExpressionFactory.exp("artistName = 'abc' or artistName = 'xyz'"));
+        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
 
         SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
 
@@ -93,6 +93,6 @@ public class SelectQueryPrefetchRouterActionIT extends ServerCase {
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
 
         assertSame(galleryEntity, prefetch.getRoot());
-        assertEquals(Expression.fromString("db:paintingArray.toArtist.ARTIST_NAME = 'abc'"), prefetch.getQualifier());
+        assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 'abc'"), prefetch.getQualifier());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
index 0002a7f..764070e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
@@ -66,7 +66,7 @@ public class StatementFetchSizeIT extends ServerCase {
         ObjectId id = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 1);
         RelationshipQuery relationshipQuery = new RelationshipQuery(
                 id,
-                Artist.PAINTING_ARRAY_PROPERTY,
+                Artist.PAINTING_ARRAY.getName(),
                 true);
         relationshipQuery.setStatementFetchSize(10);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 4e55dd7..e4d22ae 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
@@ -15,7 +15,7 @@ public abstract class _ArrayTestEntity extends CayenneDataObject {
 
     public static final String ID_PK_COLUMN = "ID";
 
-    public static final Property<Double[]> DOUBLE_ARRAY = new Property<Double[]>("doubleArray");
+    public static final Property<Double[]> DOUBLE_ARRAY = new Property<>("doubleArray");
 
     public void setDoubleArray(Double[] doubleArray) {
         writeProperty("doubleArray", doubleArray);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 643892a..e2f656a 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
@@ -16,15 +16,10 @@ public abstract class _BinaryPKTest1 extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String NAME_PROPERTY = "name";
-    @Deprecated
-    public static final String BINARY_PKDETAILS_PROPERTY = "binaryPKDetails";
-
     public static final String BIN_ID_PK_COLUMN = "BIN_ID";
 
-    public static final Property<String> NAME = new Property<String>("name");
-    public static final Property<List<BinaryPKTest2>> BINARY_PKDETAILS = new Property<List<BinaryPKTest2>>("binaryPKDetails");
+    public static final Property<String> NAME = new Property<>("name");
+    public static final Property<List<BinaryPKTest2>> BINARY_PKDETAILS = new Property<>("binaryPKDetails");
 
     public void setName(String name) {
         writeProperty("name", name);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 6279946..bd5c716 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
@@ -14,15 +14,10 @@ public abstract class _BinaryPKTest2 extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String DETAIL_NAME_PROPERTY = "detailName";
-    @Deprecated
-    public static final String TO_BINARY_PKMASTER_PROPERTY = "toBinaryPKMaster";
-
     public static final String ID_PK_COLUMN = "ID";
 
-    public static final Property<String> DETAIL_NAME = new Property<String>("detailName");
-    public static final Property<BinaryPKTest1> TO_BINARY_PKMASTER = new Property<BinaryPKTest1>("toBinaryPKMaster");
+    public static final Property<String> DETAIL_NAME = new Property<>("detailName");
+    public static final Property<BinaryPKTest1> TO_BINARY_PKMASTER = new Property<>("toBinaryPKMaster");
 
     public void setDetailName(String detailName) {
         writeProperty("detailName", detailName);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 08982d4..3dd2663 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
@@ -14,15 +14,10 @@ public abstract class _CharFkTestEntity extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String NAME_PROPERTY = "name";
-    @Deprecated
-    public static final String TO_CHAR_PK_PROPERTY = "toCharPK";
-
     public static final String PK_PK_COLUMN = "PK";
 
-    public static final Property<String> NAME = new Property<String>("name");
-    public static final Property<CharPkTestEntity> TO_CHAR_PK = new Property<CharPkTestEntity>("toCharPK");
+    public static final Property<String> NAME = new Property<>("name");
+    public static final Property<CharPkTestEntity> TO_CHAR_PK = new Property<>("toCharPK");
 
     public void setName(String name) {
         writeProperty("name", name);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 5711aaf..6a3eabd 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
@@ -16,18 +16,11 @@ public abstract class _CharPkTestEntity extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String OTHER_COL_PROPERTY = "otherCol";
-    @Deprecated
-    public static final String PK_COL_PROPERTY = "pkCol";
-    @Deprecated
-    public static final String CHAR_FKS_PROPERTY = "charFKs";
-
     public static final String PK_COL_PK_COLUMN = "PK_COL";
 
-    public static final Property<String> OTHER_COL = new Property<String>("otherCol");
-    public static final Property<String> PK_COL = new Property<String>("pkCol");
-    public static final Property<List<CharFkTestEntity>> CHAR_FKS = new Property<List<CharFkTestEntity>>("charFKs");
+    public static final Property<String> OTHER_COL = new Property<>("otherCol");
+    public static final Property<String> PK_COL = new Property<>("pkCol");
+    public static final Property<List<CharFkTestEntity>> CHAR_FKS = new Property<>("charFKs");
 
     public void setOtherCol(String otherCol) {
         writeProperty("otherCol", otherCol);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 5032419..404a9a0 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
@@ -14,15 +14,10 @@ public abstract class _CompoundFkTestEntity extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String NAME_PROPERTY = "name";
-    @Deprecated
-    public static final String TO_COMPOUND_PK_PROPERTY = "toCompoundPk";
-
     public static final String PKEY_PK_COLUMN = "PKEY";
 
-    public static final Property<String> NAME = new Property<String>("name");
-    public static final Property<CompoundPkTestEntity> TO_COMPOUND_PK = new Property<CompoundPkTestEntity>("toCompoundPk");
+    public static final Property<String> NAME = new Property<>("name");
+    public static final Property<CompoundPkTestEntity> TO_COMPOUND_PK = new Property<>("toCompoundPk");
 
     public void setName(String name) {
         writeProperty("name", name);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 c6ca8ef..295d14c 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
@@ -16,22 +16,13 @@ public abstract class _CompoundPkTestEntity extends CayenneDataObject {
 
     private static final long serialVersionUID = 1L; 
 
-    @Deprecated
-    public static final String KEY1_PROPERTY = "key1";
-    @Deprecated
-    public static final String KEY2_PROPERTY = "key2";
-    @Deprecated
-    public static final String NAME_PROPERTY = "name";
-    @Deprecated
-    public static final String COMPOUND_FK_ARRAY_PROPERTY = "compoundFkArray";
-
     public static final String KEY1_PK_COLUMN = "KEY1";
     public static final String KEY2_PK_COLUMN = "KEY2";
 
-    public static final Property<String> KEY1 = new Property<String>("key1");
-    public static final Property<String> KEY2 = new Property<String>("key2");
-    public static final Property<String> NAME = new Property<String>("name");
-    public static final Property<List<CompoundFkTestEntity>> COMPOUND_FK_ARRAY = new Property<List<CompoundFkTestEntity>>("compoundFkArray");
+    public static final Property<String> KEY1 = new Property<>("key1");
+    public static final Property<String> KEY2 = new Property<>("key2");
+    public static final Property<String> NAME = new Property<>("name");
+    public static final Property<List<CompoundFkTestEntity>> COMPOUND_FK_ARRAY = new Property<>("compoundFkArray");
 
     public void setKey1(String key1) {
         writeProperty("key1", key1);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/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 feb1676..f7a9cba 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,14 +1,14 @@
 package org.apache.cayenne.testdo.testmap.auto;
 
-import java.util.Date;
-import java.util.List;
-
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.testdo.testmap.ArtGroup;
 import org.apache.cayenne.testdo.testmap.ArtistExhibit;
 import org.apache.cayenne.testdo.testmap.Painting;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * Class _Artist was generated by Cayenne.
  * It is probably a good idea to avoid changing this class manually,
@@ -17,18 +17,7 @@ import org.apache.cayenne.testdo.testmap.Painting;
  */
 public abstract class _Artist extends CayenneDataObject {
 
-    private static final long serialVersionUID = 1L; 
-
-    @Deprecated
-    public static final String ARTIST_NAME_PROPERTY = "artistName";
-    @Deprecated
-    public static final String DATE_OF_BIRTH_PROPERTY = "dateOfBirth";
-    @Deprecated
-    public static final String ARTIST_EXHIBIT_ARRAY_PROPERTY = "artistExhibitArray";
-    @Deprecated
-    public static final String GROUP_ARRAY_PROPERTY = "groupArray";
-    @Deprecated
-    public static final String PAINTING_ARRAY_PROPERTY = "paintingArray";
+    private static final long serialVersionUID = 1L;
 
     public static final String ARTIST_ID_PK_COLUMN = "ARTIST_ID";
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-tools/src/main/resources/templates/v1_2/client-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/resources/templates/v1_2/client-superclass.vm b/cayenne-tools/src/main/resources/templates/v1_2/client-superclass.vm
index bd457fa..f7c1c9d 100644
--- a/cayenne-tools/src/main/resources/templates/v1_2/client-superclass.vm
+++ b/cayenne-tools/src/main/resources/templates/v1_2/client-superclass.vm
@@ -76,19 +76,19 @@ public abstract class ${superClassName} extends ${baseClassName} {
 #end
 ## Create Properties
 #foreach( $attr in ${object.DeclaredAttributes} )
-    public static final Property<$importUtils.formatJavaType(${attr.Type}, false)> ${stringUtils.capitalizedAsConstant($attr.Name)} = new Property<$importUtils.formatJavaType(${attr.Type}, false)>("${attr.Name}");
+    public static final Property<$importUtils.formatJavaType(${attr.Type}, false)> ${stringUtils.capitalizedAsConstant($attr.Name)} = new Property<>("${attr.Name}");
 #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)} = new Property<$type>("${rel.Name}");
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = new Property<>("${rel.Name}");
 #else
     #set( $type = "$importUtils.formatJavaType($rel.CollectionType)<$importUtils.formatJavaType($rel.TargetEntity.ClientClassName)>" )
-    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = new Property<$type>("${rel.Name}");
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($rel.Name)} = new Property<>("${rel.Name}");
 #end
 #else
-    public static final Property<$importUtils.formatJavaType(${rel.TargetEntity.ClientClassName})> ${stringUtils.capitalizedAsConstant($rel.Name)} = new Property<$importUtils.formatJavaType(${rel.TargetEntity.ClientClassName})>("${rel.Name}");
+    public static final Property<$importUtils.formatJavaType(${rel.TargetEntity.ClientClassName})> ${stringUtils.capitalizedAsConstant($rel.Name)} = new Property<>("${rel.Name}");
 #end
 #end
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bb981ae1/cayenne-tools/src/main/resources/templates/v1_2/embeddable-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/resources/templates/v1_2/embeddable-superclass.vm b/cayenne-tools/src/main/resources/templates/v1_2/embeddable-superclass.vm
index 8dd6a4c..f4de6c7 100644
--- a/cayenne-tools/src/main/resources/templates/v1_2/embeddable-superclass.vm
+++ b/cayenne-tools/src/main/resources/templates/v1_2/embeddable-superclass.vm
@@ -63,7 +63,7 @@ public abstract class ${superClassName} extends ${baseClassName} {
 #end
 ## Create Properties
 #foreach( $attr in ${object.Attributes} )
-    public static final Property<$importUtils.formatJavaType(${attr.Type}, false)> ${stringUtils.capitalizedAsConstant($attr.Name)} = new Property<$importUtils.formatJavaType(${attr.Type}, false)>("${attr.Name}");
+    public static final Property<$importUtils.formatJavaType(${attr.Type}, false)> ${stringUtils.capitalizedAsConstant($attr.Name)} = new Property<>("${attr.Name}");
 #end
 
     // special properties injected by Cayenne