diff --git a/src/main/java/com/google/gwtorm/client/Column.java b/src/main/java/com/google/gwtorm/client/Column.java
index 8ed6f0d..a3e4f45 100644
--- a/src/main/java/com/google/gwtorm/client/Column.java
+++ b/src/main/java/com/google/gwtorm/client/Column.java
@@ -21,11 +21,10 @@
 
 /**
  * Annotation marking an entity field for persistence in the data store.
- * <p>
- * Fields marked with <code>Column</code> must not be final and must not be
- * private. Fields which might be accessed cross-packages (such as those
- * declared in a common Key type like {@link StringKey}) must be declared with
- * public access so generated code can access them directly.
+ *
+ * <p>Fields marked with <code>Column</code> must not be final and must not be private. Fields which
+ * might be accessed cross-packages (such as those declared in a common Key type like {@link
+ * StringKey}) must be declared with public access so generated code can access them directly.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
@@ -36,18 +35,12 @@
   /** @return unique identity of this field within its parent object. */
   int id();
 
-  /**
-   * @return name of the column in the data store. Defaults to the field name.
-   */
+  /** @return name of the column in the data store. Defaults to the field name. */
   String name() default "";
 
-  /**
-   * @return maximum length (in characters). Only valid for String.
-   */
+  /** @return maximum length (in characters). Only valid for String. */
   int length() default 0;
 
-  /**
-   * @return is a value required. Defaults to true (NOT NULL).
-   */
+  /** @return is a value required. Defaults to true (NOT NULL). */
   boolean notNull() default true;
 }
diff --git a/src/main/java/com/google/gwtorm/client/CompoundKey.java b/src/main/java/com/google/gwtorm/client/CompoundKey.java
index 0087ccb..1c66d18 100644
--- a/src/main/java/com/google/gwtorm/client/CompoundKey.java
+++ b/src/main/java/com/google/gwtorm/client/CompoundKey.java
@@ -18,21 +18,17 @@
 
 /**
  * Abstract key type composed of other keys.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
  *
  * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
  */
 @SuppressWarnings("serial")
-public abstract class CompoundKey<P extends Key<?>> implements Key<P>,
-    Serializable {
+public abstract class CompoundKey<P extends Key<?>> implements Key<P>, Serializable {
   /** @return the member key components, minus the parent key. */
   public abstract Key<?>[] members();
 
-  /**
-   * @return the parent key instance; null if this is a root level key.
-   */
+  /** @return the parent key instance; null if this is a root level key. */
   @Override
   public P getParentKey() {
     return null;
diff --git a/src/main/java/com/google/gwtorm/client/IntKey.java b/src/main/java/com/google/gwtorm/client/IntKey.java
index f64493b..08c90e0 100644
--- a/src/main/java/com/google/gwtorm/client/IntKey.java
+++ b/src/main/java/com/google/gwtorm/client/IntKey.java
@@ -18,25 +18,20 @@
 
 /**
  * Abstract key type using a single integer value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
  *
  * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
  */
 @SuppressWarnings("serial")
 public abstract class IntKey<P extends Key<?>> implements Key<P>, Serializable {
-  /**
-   * @return id of the entity instance.
-   */
+  /** @return id of the entity instance. */
   public abstract int get();
 
   /** @param newValue the new value of this key. */
   protected abstract void set(int newValue);
 
-  /**
-   * @return the parent key instance; null if this is a root level key.
-   */
+  /** @return the parent key instance; null if this is a root level key. */
   @Override
   public P getParentKey() {
     return null;
diff --git a/src/main/java/com/google/gwtorm/client/Key.java b/src/main/java/com/google/gwtorm/client/Key.java
index b5b3d3a..69a2248 100644
--- a/src/main/java/com/google/gwtorm/client/Key.java
+++ b/src/main/java/com/google/gwtorm/client/Key.java
@@ -16,10 +16,9 @@
 
 /**
  * Generic type for an entity key.
- * <p>
- * Although not required, entities should make their primary key type implement
- * this interface, permitting traversal up through the containment hierarchy of
- * the entity keys.
+ *
+ * <p>Although not required, entities should make their primary key type implement this interface,
+ * permitting traversal up through the containment hierarchy of the entity keys.
  *
  * @param <P> type of the parent key. If no parent, use {@link Key} itself.
  */
diff --git a/src/main/java/com/google/gwtorm/client/KeyUtil.java b/src/main/java/com/google/gwtorm/client/KeyUtil.java
index c4b4551..d815ea6 100644
--- a/src/main/java/com/google/gwtorm/client/KeyUtil.java
+++ b/src/main/java/com/google/gwtorm/client/KeyUtil.java
@@ -20,12 +20,11 @@
 
   /**
    * Set the encoder implementation to a valid implementation.
-   * <p>
-   * Server-side code needs to set the encoder to a
-   * {@link com.google.gwtorm.server.StandardKeyEncoder} instance prior to
-   * invoking any methods in this class. Typically this is done by the
-   * {@link com.google.gwtorm.server.SchemaFactory} implementation's static
-   * initializer.
+   *
+   * <p>Server-side code needs to set the encoder to a {@link
+   * com.google.gwtorm.server.StandardKeyEncoder} instance prior to invoking any methods in this
+   * class. Typically this is done by the {@link com.google.gwtorm.server.SchemaFactory}
+   * implementation's static initializer.
    */
   public static void setEncoderImpl(final Encoder e) {
     ENCODER_IMPL = e;
@@ -37,8 +36,8 @@
    * @param <T> type of the key entity.
    * @param a first key to test; may be null.
    * @param b second key to test; may be null.
-   * @return true if both <code>a</code> and <code>b</code> are null, or if both
-   *         are not-null and <code>a.equals(b)</code> is true. Otherwise false.
+   * @return true if both <code>a</code> and <code>b</code> are null, or if both are not-null and
+   *     <code>a.equals(b)</code> is true. Otherwise false.
    */
   public static <T extends Key<?>> boolean eq(final T a, final T b) {
     if (a == b) {
@@ -52,11 +51,10 @@
 
   /**
    * Encode a string to be safe for use within a URL like string.
-   * <p>
-   * The returned encoded string has URL component characters escaped with hex
-   * escapes (e.g. ' ' is '+' and '%' is '%25'). The special character '/' is
-   * left literal. The comma character (',') is always encoded, permitting
-   * multiple encoded string values to be joined together safely.
+   *
+   * <p>The returned encoded string has URL component characters escaped with hex escapes (e.g. ' '
+   * is '+' and '%' is '%25'). The special character '/' is left literal. The comma character (',')
+   * is always encoded, permitting multiple encoded string values to be joined together safely.
    *
    * @param e the string to encode, must not be null.
    * @return the encoded string.
@@ -90,17 +88,16 @@
     if (comma < 0 && parent != null) {
       throw new IllegalArgumentException("Not enough components: " + in);
     }
-    assert(parent != null);
+    assert (parent != null);
     parent.fromString(in.substring(0, comma));
     return decode(in.substring(comma + 1));
   }
 
-  public static abstract class Encoder {
+  public abstract static class Encoder {
     public abstract String encode(String e);
 
     public abstract String decode(String e);
   }
 
-  private KeyUtil() {
-  }
+  private KeyUtil() {}
 }
diff --git a/src/main/java/com/google/gwtorm/client/LongKey.java b/src/main/java/com/google/gwtorm/client/LongKey.java
index 986285e..a983064 100644
--- a/src/main/java/com/google/gwtorm/client/LongKey.java
+++ b/src/main/java/com/google/gwtorm/client/LongKey.java
@@ -18,25 +18,20 @@
 
 /**
  * Abstract key type using a single long value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
  *
  * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
  */
 @SuppressWarnings("serial")
 public abstract class LongKey<P extends Key<?>> implements Key<P>, Serializable {
-  /**
-   * @return id of the entity instance.
-   */
+  /** @return id of the entity instance. */
   public abstract long get();
 
   /** @param newValue the new value of this key. */
   protected abstract void set(long newValue);
 
-  /**
-   * @return the parent key instance; null if this is a root level key.
-   */
+  /** @return the parent key instance; null if this is a root level key. */
   @Override
   public P getParentKey() {
     return null;
diff --git a/src/main/java/com/google/gwtorm/client/RowVersion.java b/src/main/java/com/google/gwtorm/client/RowVersion.java
index 3cae45c..e9c0d3a 100644
--- a/src/main/java/com/google/gwtorm/client/RowVersion.java
+++ b/src/main/java/com/google/gwtorm/client/RowVersion.java
@@ -21,16 +21,14 @@
 
 /**
  * Annotation marking a field as the row version used for optimistic locking.
- * <p>
- * Fields marked with <code>RowVersion</code> must also be marked with
- * {@link Column} and must be of type <code>int</code>. The field will be
- * automatically incremented during INSERT and UPDATE operations, and will be
- * tested during UPDATE and DELETE operations. Concurrent modifications of the
- * same entity fail as the row version won't match.
- * <p>
- * At most one RowVersion annotation should appear in any entity.
+ *
+ * <p>Fields marked with <code>RowVersion</code> must also be marked with {@link Column} and must be
+ * of type <code>int</code>. The field will be automatically incremented during INSERT and UPDATE
+ * operations, and will be tested during UPDATE and DELETE operations. Concurrent modifications of
+ * the same entity fail as the row version won't match.
+ *
+ * <p>At most one RowVersion annotation should appear in any entity.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
-public @interface RowVersion {
-}
+public @interface RowVersion {}
diff --git a/src/main/java/com/google/gwtorm/client/ShortKey.java b/src/main/java/com/google/gwtorm/client/ShortKey.java
index abda6d1..efc7f57 100644
--- a/src/main/java/com/google/gwtorm/client/ShortKey.java
+++ b/src/main/java/com/google/gwtorm/client/ShortKey.java
@@ -18,26 +18,20 @@
 
 /**
  * Abstract key type using a single short value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
  *
  * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
  */
 @SuppressWarnings("serial")
-public abstract class ShortKey<P extends Key<?>> implements Key<P>,
-    Serializable {
-  /**
-   * @return id of the entity instance.
-   */
+public abstract class ShortKey<P extends Key<?>> implements Key<P>, Serializable {
+  /** @return id of the entity instance. */
   public abstract short get();
 
   /** @param newValue the new value of this key. */
   protected abstract void set(short newValue);
 
-  /**
-   * @return the parent key instance; null if this is a root level key.
-   */
+  /** @return the parent key instance; null if this is a root level key. */
   @Override
   public P getParentKey() {
     return null;
diff --git a/src/main/java/com/google/gwtorm/client/StringKey.java b/src/main/java/com/google/gwtorm/client/StringKey.java
index a4dcf4c..e56661f 100644
--- a/src/main/java/com/google/gwtorm/client/StringKey.java
+++ b/src/main/java/com/google/gwtorm/client/StringKey.java
@@ -18,26 +18,21 @@
 
 /**
  * Abstract key type using a single string value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
  *
  * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
  */
 @SuppressWarnings("serial")
-public abstract class StringKey<P extends Key<?>> implements Key<P>,
-    Serializable, Comparable<StringKey<?>> {
-  /**
-   * @return name of the entity instance.
-   */
+public abstract class StringKey<P extends Key<?>>
+    implements Key<P>, Serializable, Comparable<StringKey<?>> {
+  /** @return name of the entity instance. */
   public abstract String get();
 
   /** @param newValue the new value of this key. */
   protected abstract void set(String newValue);
 
-  /**
-   * @return the parent key instance; null if this is a root level key.
-   */
+  /** @return the parent key instance; null if this is a root level key. */
   @Override
   public P getParentKey() {
     return null;
@@ -60,8 +55,7 @@
     }
 
     final StringKey<P> q = cast(b);
-    return get().equals(q.get())
-        && KeyUtil.eq(getParentKey(), q.getParentKey());
+    return get().equals(q.get()) && KeyUtil.eq(getParentKey(), q.getParentKey());
   }
 
   @Override
diff --git a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
index 9cfe6f5..de65541 100644
--- a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
@@ -25,13 +25,6 @@
 import com.google.gwtorm.server.CodeGenSupport;
 import com.google.gwtorm.server.GeneratedClassLoader;
 import com.google.gwtorm.server.OrmException;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -39,6 +32,11 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 /** Generates a concrete implementation of an {@link Access} extension. */
 class AccessGen implements Opcodes {
@@ -68,13 +66,11 @@
   private String implTypeName;
   private Type entityType;
 
-  AccessGen(final GeneratedClassLoader loader,
-      final RelationModel rm, final SqlDialect sd) {
+  AccessGen(final GeneratedClassLoader loader, final RelationModel rm, final SqlDialect sd) {
     classLoader = loader;
     model = rm;
     dialect = sd;
-    entityType =
-        Type.getObjectType(model.getEntityTypeClassName().replace('.', '/'));
+    entityType = Type.getObjectType(model.getEntityTypeClassName().replace('.', '/'));
   }
 
   public Class<?> create() throws OrmException {
@@ -106,8 +102,8 @@
 
     if (model.getPrimaryKey() != null) {
       implementKeyQuery(model.getPrimaryKey());
-      if ((model.getPrimaryKey().getField().isNested() || !model
-          .getPrimaryKey().getField().getPrimitiveType().isPrimitive())
+      if ((model.getPrimaryKey().getField().isNested()
+              || !model.getPrimaryKey().getField().getPrimitiveType().isPrimitive())
           && model.getPrimaryKey().getAllLeafColumns().size() == 1) {
         overrideGetMany();
       }
@@ -134,21 +130,27 @@
   private void init() {
     superTypeName = Type.getInternalName(JdbcAccess.class);
     implClassName =
-        model.getEntityTypeClassName() + "_Access_" + model.getMethodName()
-            + "_" + Util.createRandomName();
+        model.getEntityTypeClassName()
+            + "_Access_"
+            + model.getMethodName()
+            + "_"
+            + Util.createRandomName();
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
-        superTypeName, new String[] {model.getAccessInterfaceName().replace(
-            '.', '/')});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        superTypeName,
+        new String[] {model.getAccessInterfaceName().replace('.', '/')});
   }
 
   private void implementConstructor() {
     final String consName = "<init>";
     final String consDesc =
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
-            .getType(JdbcSchema.class)});
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(JdbcSchema.class)});
     final MethodVisitor mv;
     mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
     mv.visitCode();
@@ -160,12 +162,14 @@
     mv.visitEnd();
   }
 
-  private void implementGetString(final String methodName,
-      final String returnValue) {
+  private void implementGetString(final String methodName, final String returnValue) {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
-            .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            methodName,
+            Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     mv.visitLdcInsn(returnValue);
     mv.visitInsn(ARETURN);
@@ -175,8 +179,12 @@
 
   private void implementGetRelationID() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getRelationID", Type
-            .getMethodDescriptor(Type.INT_TYPE, new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getRelationID",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     new CodeGenSupport(mv).push(model.getRelationID());
     mv.visitInsn(IRETURN);
@@ -184,12 +192,14 @@
     mv.visitEnd();
   }
 
-  private void implementMissingGetString(final String methodName,
-      final String why) {
+  private void implementMissingGetString(final String methodName, final String why) {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
-            .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            methodName,
+            Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     throwUnsupported(mv, model.getMethodName() + " does not support " + why);
     mv.visitInsn(RETURN);
@@ -202,25 +212,34 @@
     mv.visitTypeInsn(NEW, eType.getInternalName());
     mv.visitInsn(DUP);
     mv.visitLdcInsn(message);
-    mv.visitMethodInsn(INVOKESPECIAL, eType.getInternalName(), "<init>", Type
-        .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
-            .getType(String.class)}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        eType.getInternalName(),
+        "<init>",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(String.class)}));
     mv.visitInsn(ATHROW);
   }
 
   private void implementPrimaryKey() {
     final KeyModel pk = model.getPrimaryKey();
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "primaryKey", Type
-            .getMethodDescriptor(Type.getType(Key.class), new Type[] {Type
-                .getType(Object.class)}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "primaryKey",
+            Type.getMethodDescriptor(
+                Type.getType(Key.class), new Type[] {Type.getType(Object.class)}),
+            null,
+            null);
     mv.visitCode();
     if (pk != null && pk.getField().isNested()) {
       final ColumnModel pkf = pk.getField();
       mv.visitVarInsn(ALOAD, 1);
       mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
-      mv.visitFieldInsn(GETFIELD, entityType.getInternalName(), pkf
-          .getFieldName(), CodeGenSupport.toType(pkf).getDescriptor());
+      mv.visitFieldInsn(
+          GETFIELD,
+          entityType.getInternalName(),
+          pkf.getFieldName(),
+          CodeGenSupport.toType(pkf).getDescriptor());
     } else {
       mv.visitInsn(ACONST_NULL);
     }
@@ -233,18 +252,24 @@
     final KeyModel pk = model.getPrimaryKey();
 
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "get", Type.getMethodDescriptor(
-            Type.getType(Object.class), new Type[] {Type.getType(Key.class)}),
-            null, new String[] {Type.getType(OrmException.class)
-                .getInternalName()});
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "get",
+            Type.getMethodDescriptor(
+                Type.getType(Object.class), new Type[] {Type.getType(Key.class)}),
+            null,
+            new String[] {Type.getType(OrmException.class).getInternalName()});
     mv.visitCode();
     if (pk != null && pk.getField().isNested()) {
       final Type keyType = CodeGenSupport.toType(pk.getField());
       mv.visitVarInsn(ALOAD, 0);
       mv.visitVarInsn(ALOAD, 1);
       mv.visitTypeInsn(CHECKCAST, keyType.getInternalName());
-      mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, pk.getName(), Type
-          .getMethodDescriptor(entityType, new Type[] {keyType}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          implTypeName,
+          pk.getName(),
+          Type.getMethodDescriptor(entityType, new Type[] {keyType}));
       mv.visitInsn(ARETURN);
     } else {
       throwUnsupported(mv, model.getMethodName() + " does not support get(Key)");
@@ -255,13 +280,19 @@
 
   private void implementNewEntityInstance() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "newEntityInstance", Type
-            .getMethodDescriptor(Type.getType(Object.class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "newEntityInstance",
+            Type.getMethodDescriptor(Type.getType(Object.class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     mv.visitTypeInsn(NEW, entityType.getInternalName());
     mv.visitInsn(DUP);
-    mv.visitMethodInsn(INVOKESPECIAL, entityType.getInternalName(), "<init>",
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        entityType.getInternalName(),
+        "<init>",
         Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
@@ -270,11 +301,14 @@
 
   private void implementBindOne(final DmlType type) {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, type.methodName, Type
-            .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-                Type.getType(PreparedStatement.class),
-                Type.getType(Object.class)}), null, new String[] {Type.getType(
-            SQLException.class).getInternalName()});
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            type.methodName,
+            Type.getMethodDescriptor(
+                Type.VOID_TYPE,
+                new Type[] {Type.getType(PreparedStatement.class), Type.getType(Object.class)}),
+            null,
+            new String[] {Type.getType(SQLException.class).getInternalName()});
     mv.visitCode();
 
     if (type != DmlType.INSERT && model.getPrimaryKey() == null) {
@@ -331,8 +365,8 @@
     mv.visitEnd();
   }
 
-  private void doBindOne(final MethodVisitor mv, final CodeGenSupport cgs,
-      final ColumnModel field) {
+  private void doBindOne(
+      final MethodVisitor mv, final CodeGenSupport cgs, final ColumnModel field) {
     if (field.isNested() && field.isNotNull()) {
       for (final ColumnModel c : field.getAllLeafColumns()) {
         doBindOne(mv, cgs, c);
@@ -368,11 +402,14 @@
 
   private void implementBindOneFetch() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "bindOneFetch", Type
-            .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-                Type.getType(ResultSet.class), Type.getType(Object.class)}),
-            null, new String[] {Type.getType(SQLException.class)
-                .getInternalName()});
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "bindOneFetch",
+            Type.getMethodDescriptor(
+                Type.VOID_TYPE,
+                new Type[] {Type.getType(ResultSet.class), Type.getType(Object.class)}),
+            null,
+            new String[] {Type.getType(SQLException.class).getInternalName()});
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 2);
@@ -382,8 +419,7 @@
     final CodeGenSupport cgs = new CodeGenSupport(mv);
     cgs.setEntityType(entityType);
 
-    if (model.getPrimaryKey() != null
-        && model.getPrimaryKey().getField().isNested()) {
+    if (model.getPrimaryKey() != null && model.getPrimaryKey().getField().isNested()) {
       final ColumnModel pkf = model.getPrimaryKey().getField();
       final Type vType = CodeGenSupport.toType(pkf);
       final int oldIdx = cgs.getColumnIndex();
@@ -391,8 +427,11 @@
       cgs.fieldSetBegin();
       mv.visitTypeInsn(NEW, vType.getInternalName());
       mv.visitInsn(DUP);
-      mv.visitMethodInsn(INVOKESPECIAL, vType.getInternalName(), "<init>", Type
-          .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          vType.getInternalName(),
+          "<init>",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
       cgs.fieldSetEnd();
       cgs.resetColumnIndex(oldIdx);
     }
@@ -410,8 +449,11 @@
     mv.visitEnd();
   }
 
-  private void doFetchOne(final MethodVisitor mv, final CodeGenSupport cgs,
-      final ColumnModel field, final int reportLiveInto) {
+  private void doFetchOne(
+      final MethodVisitor mv,
+      final CodeGenSupport cgs,
+      final ColumnModel field,
+      final int reportLiveInto) {
     if (field.isNested()) {
       int oldIdx = cgs.getColumnIndex();
       final Type vType = CodeGenSupport.toType(field);
@@ -429,8 +471,11 @@
       cgs.fieldSetBegin();
       mv.visitTypeInsn(NEW, vType.getInternalName());
       mv.visitInsn(DUP);
-      mv.visitMethodInsn(INVOKESPECIAL, vType.getInternalName(), "<init>", Type
-          .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          vType.getInternalName(),
+          "<init>",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
       cgs.fieldSetEnd();
 
       cgs.resetColumnIndex(oldIdx);
@@ -465,8 +510,7 @@
 
     } else {
       final int dupTo;
-      if (reportLiveInto >= 0
-          && CodeGenSupport.toType(field).getSort() == Type.OBJECT) {
+      if (reportLiveInto >= 0 && CodeGenSupport.toType(field).getSort() == Type.OBJECT) {
         dupTo = cgs.newLocal();
       } else {
         dupTo = -1;
@@ -484,9 +528,11 @@
           cgs.freeLocal(dupTo);
         } else {
           cgs.pushSqlHandle();
-          mv.visitMethodInsn(INVOKEINTERFACE, Type.getType(ResultSet.class)
-              .getInternalName(), "wasNull", Type.getMethodDescriptor(
-              Type.BOOLEAN_TYPE, new Type[] {}));
+          mv.visitMethodInsn(
+              INVOKEINTERFACE,
+              Type.getType(ResultSet.class).getInternalName(),
+              "wasNull",
+              Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
           mv.visitJumpInsn(IFNE, wasnull);
         }
         mv.visitIincInsn(reportLiveInto, 1);
@@ -501,8 +547,7 @@
     query.append(model.getSelectSql(dialect, REL_ALIAS));
     query.append(" WHERE ");
     int nth = 1;
-    for (final Iterator<ColumnModel> i = info.getAllLeafColumns().iterator(); i
-        .hasNext();) {
+    for (final Iterator<ColumnModel> i = info.getAllLeafColumns().iterator(); i.hasNext(); ) {
       final ColumnModel c = i.next();
       query.append(REL_ALIAS);
       query.append('.');
@@ -515,39 +560,46 @@
     }
 
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
-            .getMethodDescriptor(entityType, new Type[] {keyType}), null,
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            info.getName(),
+            Type.getMethodDescriptor(entityType, new Type[] {keyType}),
+            null,
             new String[] {Type.getType(OrmException.class).getInternalName()});
     mv.visitCode();
 
     final int keyvar = 1, psvar = keyvar + keyType.getSize();
     mv.visitVarInsn(ALOAD, 0);
     mv.visitLdcInsn(query.toString());
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareStatement", Type
-        .getMethodDescriptor(Type.getType(PreparedStatement.class),
-            new Type[] {Type.getType(String.class)}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "prepareStatement",
+        Type.getMethodDescriptor(
+            Type.getType(PreparedStatement.class), new Type[] {Type.getType(String.class)}));
     mv.visitVarInsn(ASTORE, psvar);
 
-    final CodeGenSupport cgs = new CodeGenSupport(mv) {
-      @Override
-      public void pushSqlHandle() {
-        mv.visitVarInsn(ALOAD, psvar);
-      }
+    final CodeGenSupport cgs =
+        new CodeGenSupport(mv) {
+          @Override
+          public void pushSqlHandle() {
+            mv.visitVarInsn(ALOAD, psvar);
+          }
 
-      @Override
-      public void pushFieldValue() {
-        appendGetField(getFieldReference());
-      }
+          @Override
+          public void pushFieldValue() {
+            appendGetField(getFieldReference());
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        if (c.getParent() == null) {
-          loadVar(keyType, keyvar);
-        } else {
-          super.appendGetField(c);
-        }
-      }
-    };
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            if (c.getParent() == null) {
+              loadVar(keyType, keyvar);
+            } else {
+              super.appendGetField(c);
+            }
+          }
+        };
     for (final ColumnModel c : info.getAllLeafColumns()) {
       cgs.setFieldReference(c);
       dialect.getSqlTypeInfo(c).generatePreparedStatementSet(cgs);
@@ -555,9 +607,12 @@
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, psvar);
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryOne", Type
-        .getMethodDescriptor(Type.getType(Object.class), new Type[] {Type
-            .getType(PreparedStatement.class)}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "queryOne",
+        Type.getMethodDescriptor(
+            Type.getType(Object.class), new Type[] {Type.getType(PreparedStatement.class)}));
     mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
@@ -576,10 +631,13 @@
     query.append(" IN");
 
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getBySqlIn", Type
-            .getMethodDescriptor(Type
-                .getType(com.google.gwtorm.server.ResultSet.class),
-                new Type[] {Type.getType(Collection.class)}), null,
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getBySqlIn",
+            Type.getMethodDescriptor(
+                Type.getType(com.google.gwtorm.server.ResultSet.class),
+                new Type[] {Type.getType(Collection.class)}),
+            null,
             new String[] {Type.getType(OrmException.class).getInternalName()});
     mv.visitCode();
 
@@ -592,15 +650,21 @@
     mv.visitVarInsn(ALOAD, 0);
     mv.visitLdcInsn(query.toString());
     mv.visitVarInsn(ALOAD, keyset);
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareBySqlIn", Type
-        .getMethodDescriptor(Type.getType(PreparedStatement.class), new Type[] {
-            Type.getType(String.class), Type.getType(Collection.class)}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "prepareBySqlIn",
+        Type.getMethodDescriptor(
+            Type.getType(PreparedStatement.class),
+            new Type[] {Type.getType(String.class), Type.getType(Collection.class)}));
     mv.visitVarInsn(ASTORE, psvar);
 
     mv.visitVarInsn(ALOAD, keyset);
-    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Collection.class),
-        "iterator", Type.getMethodDescriptor(Type.getType(Iterator.class),
-            new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        Type.getInternalName(Collection.class),
+        "iterator",
+        Type.getMethodDescriptor(Type.getType(Iterator.class), new Type[] {}));
     mv.visitVarInsn(ASTORE, itrvar);
 
     mv.visitInsn(ICONST_1);
@@ -610,43 +674,48 @@
     final Label again = new Label();
     mv.visitLabel(again);
     mv.visitVarInsn(ALOAD, itrvar);
-    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class),
-        "hasNext", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        Type.getInternalName(Iterator.class),
+        "hasNext",
+        Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
     mv.visitJumpInsn(IFEQ, endbind);
 
     mv.visitVarInsn(ALOAD, itrvar);
-    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class),
-        "next", Type.getMethodDescriptor(Type.getType(Object.class),
-            new Type[] {}));
-    mv.visitTypeInsn(CHECKCAST, CodeGenSupport.toType(pk.getField())
-        .getInternalName());
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        Type.getInternalName(Iterator.class),
+        "next",
+        Type.getMethodDescriptor(Type.getType(Object.class), new Type[] {}));
+    mv.visitTypeInsn(CHECKCAST, CodeGenSupport.toType(pk.getField()).getInternalName());
     mv.visitVarInsn(ASTORE, keyvar);
 
-    final CodeGenSupport cgs = new CodeGenSupport(mv) {
-      @Override
-      public void pushSqlHandle() {
-        mv.visitVarInsn(ALOAD, psvar);
-      }
+    final CodeGenSupport cgs =
+        new CodeGenSupport(mv) {
+          @Override
+          public void pushSqlHandle() {
+            mv.visitVarInsn(ALOAD, psvar);
+          }
 
-      @Override
-      public void pushFieldValue() {
-        appendGetField(getFieldReference());
-      }
+          @Override
+          public void pushFieldValue() {
+            appendGetField(getFieldReference());
+          }
 
-      @Override
-      public void pushColumnIndex() {
-        mv.visitVarInsn(ILOAD, colvar);
-      }
+          @Override
+          public void pushColumnIndex() {
+            mv.visitVarInsn(ILOAD, colvar);
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        if (c.getParent() == null) {
-          mv.visitVarInsn(ALOAD, keyvar);
-        } else {
-          super.appendGetField(c);
-        }
-      }
-    };
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            if (c.getParent() == null) {
+              mv.visitVarInsn(ALOAD, keyvar);
+            } else {
+              super.appendGetField(c);
+            }
+          }
+        };
 
     cgs.setFieldReference(pkcol);
     dialect.getSqlTypeInfo(pkcol).generatePreparedStatementSet(cgs);
@@ -656,8 +725,12 @@
     mv.visitLabel(endbind);
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, psvar);
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryList", Type
-        .getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class),
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "queryList",
+        Type.getMethodDescriptor(
+            Type.getType(com.google.gwtorm.server.ResultSet.class),
             new Type[] {Type.getType(PreparedStatement.class)}));
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
@@ -683,42 +756,48 @@
 
     final int psvar = nextVar++;
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
-            .getMethodDescriptor(Type
-                .getType(com.google.gwtorm.server.ResultSet.class), pTypes),
-            null, new String[] {Type.getType(OrmException.class)
-                .getInternalName()});
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            info.getName(),
+            Type.getMethodDescriptor(
+                Type.getType(com.google.gwtorm.server.ResultSet.class), pTypes),
+            null,
+            new String[] {Type.getType(OrmException.class).getInternalName()});
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitLdcInsn(info.getSelectSql(dialect, REL_ALIAS));
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareStatement", Type
-        .getMethodDescriptor(Type.getType(PreparedStatement.class),
-            new Type[] {Type.getType(String.class)}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "prepareStatement",
+        Type.getMethodDescriptor(
+            Type.getType(PreparedStatement.class), new Type[] {Type.getType(String.class)}));
     mv.visitVarInsn(ASTORE, psvar);
 
     final int argIdx[] = new int[] {0};
-    final CodeGenSupport cgs = new CodeGenSupport(mv) {
-      @Override
-      public void pushSqlHandle() {
-        mv.visitVarInsn(ALOAD, psvar);
-      }
+    final CodeGenSupport cgs =
+        new CodeGenSupport(mv) {
+          @Override
+          public void pushSqlHandle() {
+            mv.visitVarInsn(ALOAD, psvar);
+          }
 
-      @Override
-      public void pushFieldValue() {
-        appendGetField(getFieldReference());
-      }
+          @Override
+          public void pushFieldValue() {
+            appendGetField(getFieldReference());
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        final int n = argIdx[0];
-        if (c == pCols.get(n)) {
-          loadVar(pTypes[n], pVars[n]);
-        } else {
-          super.appendGetField(c);
-        }
-      }
-    };
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            final int n = argIdx[0];
+            if (c == pCols.get(n)) {
+              loadVar(pTypes[n], pVars[n]);
+            } else {
+              super.appendGetField(c);
+            }
+          }
+        };
     for (final ColumnModel c : pCols) {
       if (c.isNested()) {
         for (final ColumnModel n : c.getAllLeafColumns()) {
@@ -737,18 +816,19 @@
         mv.visitVarInsn(ALOAD, psvar);
         if (hasLimitParam) {
           if (dialect.selectHasLimit()) {
-            CodeGenSupport cgs2 = new CodeGenSupport(mv) {
-              @Override
-              public void pushSqlHandle() {
-                mv.visitVarInsn(ALOAD, psvar);
-              }
+            CodeGenSupport cgs2 =
+                new CodeGenSupport(mv) {
+                  @Override
+                  public void pushSqlHandle() {
+                    mv.visitVarInsn(ALOAD, psvar);
+                  }
 
-              @Override
-              public void pushFieldValue() {
-                final int n = argIdx[0];
-                loadVar(pTypes[n], pVars[n]);
-              }
-            };
+                  @Override
+                  public void pushFieldValue() {
+                    final int n = argIdx[0];
+                    loadVar(pTypes[n], pVars[n]);
+                  }
+                };
             cgs2.resetColumnIndex(cgs.getColumnIndex() + 1);
             dialect.getSqlTypeInfo(Integer.TYPE).generatePreparedStatementSet(cgs2);
           }
@@ -756,16 +836,22 @@
         } else {
           cgs.push(info.getStaticLimit());
         }
-        mv.visitMethodInsn(INVOKEINTERFACE, Type.getType(
-            PreparedStatement.class).getInternalName(), "setMaxRows", Type
-            .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
+        mv.visitMethodInsn(
+            INVOKEINTERFACE,
+            Type.getType(PreparedStatement.class).getInternalName(),
+            "setMaxRows",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
       }
     }
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, psvar);
-    mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryList", Type
-        .getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class),
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        superTypeName,
+        "queryList",
+        Type.getMethodDescriptor(
+            Type.getType(com.google.gwtorm.server.ResultSet.class),
             new Type[] {Type.getType(PreparedStatement.class)}));
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
diff --git a/src/main/java/com/google/gwtorm/jdbc/Database.java b/src/main/java/com/google/gwtorm/jdbc/Database.java
index 0de0f11..2db2833 100644
--- a/src/main/java/com/google/gwtorm/jdbc/Database.java
+++ b/src/main/java/com/google/gwtorm/jdbc/Database.java
@@ -26,24 +26,21 @@
 import com.google.gwtorm.server.SchemaFactory;
 import com.google.gwtorm.server.SchemaGen;
 import com.google.gwtorm.server.StandardKeyEncoder;
-
 import java.sql.Connection;
 import java.sql.SQLException;
-
 import javax.sql.DataSource;
 
 /**
  * Constructor for application {@link Schema} extensions.
- * <p>
- * Applications should use the Database class to create instances of their
- * Schema extension interface, and thus open and connect to the JDBC data store.
- * <p>
- * Creating a new Database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their Database instance for the live of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>Applications should use the Database class to create instances of their Schema extension
+ * interface, and thus open and connect to the JDBC data store.
+ *
+ * <p>Creating a new Database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their Database instance for the live of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
  *
  * @param <T>
  */
@@ -62,11 +59,10 @@
    *
    * @param ds JDBC connection information
    * @param schema application extension of the Schema interface to implement.
-   * @throws OrmException the schema interface is incorrectly defined, or the
-   *         driver class is not available through the current class loader.
+   * @throws OrmException the schema interface is incorrectly defined, or the driver class is not
+   *     available through the current class loader.
    */
-  public Database(final DataSource ds, final Class<T> schema)
-      throws OrmException {
+  public Database(final DataSource ds, final Class<T> schema) throws OrmException {
     dataSource = ds;
 
     SqlDialect dialect;
@@ -89,16 +85,21 @@
   }
 
   @SuppressWarnings({"unchecked", "rawtypes"})
-  private Class<T> generate(final SqlDialect dialect,
-      final GeneratedClassLoader loader) throws OrmException {
-    return new SchemaGen(loader, schemaModel, getClass(), JdbcSchema.class,
-        new SchemaGen.AccessGenerator() {
-          @Override
-          public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
-              throws OrmException {
-            return new AccessGen(loader, rm, dialect).create();
-          }
-        }).create();
+  private Class<T> generate(final SqlDialect dialect, final GeneratedClassLoader loader)
+      throws OrmException {
+    return new SchemaGen(
+            loader,
+            schemaModel,
+            getClass(),
+            JdbcSchema.class,
+            new SchemaGen.AccessGenerator() {
+              @Override
+              public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
+                  throws OrmException {
+                return new AccessGen(loader, rm, dialect).create();
+              }
+            })
+        .create();
   }
 
   SqlDialect getDialect() {
@@ -113,9 +114,8 @@
    * Open a new connection to the database and get a Schema wrapper.
    *
    * @return a new JDBC connection, wrapped up in the application's Schema.
-   * @throws OrmException the connection could not be opened to the database.
-   *         The JDBC exception detail should be examined to determine the root
-   *         cause of the connection failure.
+   * @throws OrmException the connection could not be opened to the database. The JDBC exception
+   *     detail should be examined to determine the root cause of the connection failure.
    */
   @Override
   public T open() throws OrmException {
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
index 7335427..c1ca085 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
@@ -22,7 +22,6 @@
 import com.google.gwtorm.server.ListResultSet;
 import com.google.gwtorm.server.OrmConcurrencyException;
 import com.google.gwtorm.server.OrmException;
-
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -32,8 +31,7 @@
 import java.util.List;
 
 /** Internal base class for implementations of {@link Access}. */
-public abstract class JdbcAccess<T, K extends Key<?>> extends
-    AbstractAccess<T, K> {
+public abstract class JdbcAccess<T, K extends Key<?>> extends AbstractAccess<T, K> {
   private final JdbcSchema schema;
 
   protected JdbcAccess(final JdbcSchema s) {
@@ -66,30 +64,30 @@
       case 0:
         // Nothing requested, nothing to return.
         //
-        return new ListResultSet<>(Collections.<T> emptyList());
+        return new ListResultSet<>(Collections.<T>emptyList());
 
-      case 1: {
-        // Only one key requested, use a faster equality lookup.
-        //
-        final T entity = get(keySet.iterator().next());
-        if (entity != null) {
-          return new ListResultSet<>(Collections.singletonList(entity));
+      case 1:
+        {
+          // Only one key requested, use a faster equality lookup.
+          //
+          final T entity = get(keySet.iterator().next());
+          if (entity != null) {
+            return new ListResultSet<>(Collections.singletonList(entity));
+          }
+          return new ListResultSet<>(Collections.<T>emptyList());
         }
-        return new ListResultSet<>(Collections.<T> emptyList());
-      }
 
       default:
         return getBySqlIn(keySet);
     }
   }
 
-  protected com.google.gwtorm.server.ResultSet<T> getBySqlIn(
-      final Collection<K> keys) throws OrmException {
+  protected com.google.gwtorm.server.ResultSet<T> getBySqlIn(final Collection<K> keys)
+      throws OrmException {
     return super.get(keys);
   }
 
-  protected PreparedStatement prepareStatement(final String sql)
-      throws OrmException {
+  protected PreparedStatement prepareStatement(final String sql) throws OrmException {
     try {
       return schema.getConnection().prepareStatement(sql);
     } catch (SQLException e) {
@@ -97,8 +95,8 @@
     }
   }
 
-  protected PreparedStatement prepareBySqlIn(final String sql,
-      final Collection<K> keys) throws OrmException {
+  protected PreparedStatement prepareBySqlIn(final String sql, final Collection<K> keys)
+      throws OrmException {
     final int n = keys.size();
     final StringBuilder buf = new StringBuilder(sql.length() + n << 1 + 1);
     buf.append(sql);
@@ -138,15 +136,15 @@
     }
   }
 
-  protected com.google.gwtorm.server.ResultSet<T> queryList(
-      final PreparedStatement ps) throws OrmException {
+  protected com.google.gwtorm.server.ResultSet<T> queryList(final PreparedStatement ps)
+      throws OrmException {
     final ResultSet rs;
     try {
       rs = ps.executeQuery();
       if (!rs.next()) {
         rs.close();
         ps.close();
-        return new ListResultSet<>(Collections.<T> emptyList());
+        return new ListResultSet<>(Collections.<T>emptyList());
       }
     } catch (SQLException err) {
       try {
@@ -174,8 +172,8 @@
     }
   }
 
-  private void insertIndividually(Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void insertIndividually(Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       boolean concurrencyViolationDetected = false;
@@ -199,8 +197,8 @@
     }
   }
 
-  private void insertAsBatch(final Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void insertAsBatch(final Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       int cnt = 0;
@@ -235,8 +233,8 @@
     }
   }
 
-  private void updateIndividually(Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void updateIndividually(Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       boolean concurrencyViolationDetected = false;
@@ -260,8 +258,8 @@
     }
   }
 
-  private void updateAsBatch(final Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void updateAsBatch(final Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       int cnt = 0;
@@ -285,11 +283,9 @@
    * Attempt to update instances.
    *
    * @param instances the instances to attempt to update
-   * @return collection of instances that cannot be updated as they are not yet
-   *         existing
+   * @return collection of instances that cannot be updated as they are not yet existing
    */
-  private Collection<T> attemptUpdate(final Iterable<T> instances)
-      throws OrmException {
+  private Collection<T> attemptUpdate(final Iterable<T> instances) throws OrmException {
     if (schema.getDialect().canDetermineIndividualBatchUpdateCounts()) {
       return attemptUpdateAsBatch(instances);
     } else {
@@ -297,8 +293,7 @@
     }
   }
 
-  private Collection<T> attemptUpdatesIndividually(Iterable<T> instances)
-      throws OrmException {
+  private Collection<T> attemptUpdatesIndividually(Iterable<T> instances) throws OrmException {
     Collection<T> inserts = null;
     try {
       PreparedStatement ps = null;
@@ -314,7 +309,8 @@
             if (inserts == null) {
               inserts = new ArrayList<>();
             }
-            inserts.add(o);          }
+            inserts.add(o);
+          }
           allInstances.add(o);
         }
       } finally {
@@ -342,8 +338,7 @@
     }
   }
 
-  private Collection<T> attemptUpdateAsBatch(final Iterable<T> instances)
-      throws OrmException {
+  private Collection<T> attemptUpdateAsBatch(final Iterable<T> instances) throws OrmException {
     Collection<T> inserts = null;
     try {
       PreparedStatement ps = null;
@@ -405,8 +400,8 @@
     }
   }
 
-  private void deleteIndividually(Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void deleteIndividually(Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       boolean concurrencyViolationDetected = false;
@@ -430,8 +425,8 @@
     }
   }
 
-  private void deleteAsBatch(final Iterable<T> instances) throws SQLException,
-      OrmConcurrencyException {
+  private void deleteAsBatch(final Iterable<T> instances)
+      throws SQLException, OrmConcurrencyException {
     PreparedStatement ps = null;
     try {
       int cnt = 0;
@@ -459,7 +454,7 @@
 
     final int numberOfRowsUpdated = schema.getDialect().executeBatch(ps);
     if (numberOfRowsUpdated != cnt) {
-        throw new OrmConcurrencyException();
+      throw new OrmConcurrencyException();
     }
   }
 
@@ -497,15 +492,11 @@
 
   protected abstract String getDeleteOneSql();
 
-  protected abstract void bindOneInsert(PreparedStatement ps, T entity)
-      throws SQLException;
+  protected abstract void bindOneInsert(PreparedStatement ps, T entity) throws SQLException;
 
-  protected abstract void bindOneUpdate(PreparedStatement ps, T entity)
-      throws SQLException;
+  protected abstract void bindOneUpdate(PreparedStatement ps, T entity) throws SQLException;
 
-  protected abstract void bindOneDelete(PreparedStatement ps, T entity)
-      throws SQLException;
+  protected abstract void bindOneDelete(PreparedStatement ps, T entity) throws SQLException;
 
-  protected abstract void bindOneFetch(ResultSet rs, T entity)
-      throws SQLException;
+  protected abstract void bindOneFetch(ResultSet rs, T entity) throws SQLException;
 }
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java b/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
index b310535..e9750da 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
@@ -16,7 +16,6 @@
 
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java b/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
index af9a49b..6e26b4d 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
@@ -17,7 +17,6 @@
 import com.google.gwtorm.client.Key;
 import com.google.gwtorm.server.AbstractResultSet;
 import com.google.gwtorm.server.OrmRuntimeException;
-
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
index 1173140..0a84978 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
@@ -26,7 +26,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.Schema;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.HashSet;
@@ -111,8 +110,7 @@
     }
   }
 
-  private void createSequences(final StatementExecutor e) throws OrmException,
-      SQLException {
+  private void createSequences(final StatementExecutor e) throws OrmException, SQLException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
 
@@ -124,8 +122,7 @@
     }
   }
 
-  private void createRelations(final StatementExecutor e) throws SQLException,
-      OrmException {
+  private void createRelations(final StatementExecutor e) throws SQLException, OrmException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
     Set<String> have = dialect.listTables(getConnection());
@@ -139,8 +136,9 @@
   private void addColumns(final StatementExecutor e, final RelationModel rel)
       throws SQLException, OrmException {
     final SqlDialect dialect = dbDef.getDialect();
-    Set<String> have = dialect.listColumns( //
-        getConnection(), rel.getRelationName().toLowerCase());
+    Set<String> have =
+        dialect.listColumns( //
+            getConnection(), rel.getRelationName().toLowerCase());
     for (final ColumnModel c : rel.getColumns()) {
       if (!have.contains(c.getColumnName().toLowerCase())) {
         dialect.addColumn(e, rel.getRelationName(), c);
@@ -148,16 +146,15 @@
     }
   }
 
-  public void renameTable(final StatementExecutor e, String from, String to)
-      throws OrmException {
+  public void renameTable(final StatementExecutor e, String from, String to) throws OrmException {
     Preconditions.checkNotNull(e);
     Preconditions.checkNotNull(from);
     Preconditions.checkNotNull(to);
     getDialect().renameTable(e, from, to);
   }
 
-  public void renameField(final StatementExecutor e, String table, String from,
-      String to) throws OrmException {
+  public void renameField(final StatementExecutor e, String table, String from, String to)
+      throws OrmException {
     final RelationModel rel = findRelationModel(table);
     if (rel == null) {
       throw new OrmException("Relation " + table + " not defined");
@@ -169,8 +166,8 @@
     getDialect().renameColumn(e, table, from, col);
   }
 
-  public void renameColumn(final StatementExecutor e, String table, String from,
-      String to) throws OrmException {
+  public void renameColumn(final StatementExecutor e, String table, String from, String to)
+      throws OrmException {
     final RelationModel rel = findRelationModel(table);
     if (rel == null) {
       throw new OrmException("Relation " + table + " not defined");
@@ -205,8 +202,7 @@
     }
   }
 
-  private void pruneSequences(final StatementExecutor e) throws SQLException,
-      OrmException {
+  private void pruneSequences(final StatementExecutor e) throws SQLException, OrmException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
     HashSet<String> want = new HashSet<>();
@@ -220,8 +216,7 @@
     }
   }
 
-  private void pruneRelations(final StatementExecutor e) throws SQLException,
-      OrmException {
+  private void pruneRelations(final StatementExecutor e) throws SQLException, OrmException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
     HashSet<String> want = new HashSet<>();
@@ -242,8 +237,9 @@
     for (final ColumnModel c : rel.getColumns()) {
       want.add(c.getColumnName().toLowerCase());
     }
-    for (String column : dialect.listColumns( //
-        getConnection(), rel.getRelationName().toLowerCase())) {
+    for (String column :
+        dialect.listColumns( //
+            getConnection(), rel.getRelationName().toLowerCase())) {
       if (!want.contains(column)) {
         dialect.dropColumn(e, rel.getRelationName(), column);
       }
diff --git a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
index 2536e50..abefb66 100644
--- a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
+++ b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
@@ -28,7 +28,6 @@
 import java.util.List;
 import java.util.Properties;
 import java.util.logging.Logger;
-
 import javax.sql.DataSource;
 
 /** A simple non-pooling DataSource representation. */
@@ -40,14 +39,13 @@
 
   /**
    * Create a non-pooling data source.
-   * <p>
-   * The JDBC properties information must define at least <code>url</code> and
-   * <code>driver</code>, but may also include driver specific properties such
-   * as <code>username</code> and <code>password</code>.
+   *
+   * <p>The JDBC properties information must define at least <code>url</code> and <code>driver
+   * </code>, but may also include driver specific properties such as <code>username</code> and
+   * <code>password</code>.
    *
    * @param dbInfo JDBC connection information. The property table is copied.
-   * @throws SQLException the driver class is not available through the current
-   *         class loader.
+   * @throws SQLException the driver class is not available through the current class loader.
    */
   public SimpleDataSource(final Properties dbInfo) throws SQLException {
     connectionInfo = new Properties();
@@ -90,8 +88,7 @@
     logWriter = new PrintWriter(System.out);
   }
 
-  private static SQLException badClasspath(final String classpath,
-      final MalformedURLException e1) {
+  private static SQLException badClasspath(final String classpath, final MalformedURLException e1) {
     final SQLException sqle;
     sqle = new SQLException("Invalid driver classpath " + classpath);
     sqle.initCause(e1);
@@ -107,8 +104,7 @@
   }
 
   @Override
-  public Connection getConnection(String user, String password)
-      throws SQLException {
+  public Connection getConnection(String user, String password) throws SQLException {
     if (driver != null) {
       final Properties info = new Properties(connectionInfo);
       if (user != null) {
@@ -138,8 +134,7 @@
   }
 
   @Override
-  public void setLoginTimeout(int seconds) {
-  }
+  public void setLoginTimeout(int seconds) {}
 
   @Override
   public boolean isWrapperFor(Class<?> iface) {
@@ -156,8 +151,8 @@
     throw new SQLFeatureNotSupportedException();
   }
 
-  private static synchronized Driver loadDriver(final String driver,
-      final ClassLoader loader) throws SQLException {
+  private static synchronized Driver loadDriver(final String driver, final ClassLoader loader)
+      throws SQLException {
     // I've seen some drivers (*cough* Informix *cough*) which won't load
     // on multiple threads at the same time. Forcing our code to synchronize
     // around loading the driver ensures we won't ever ask for the same driver
diff --git a/src/main/java/com/google/gwtorm/nosql/AccessGen.java b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
index 0a8bbd9..41de1a6 100644
--- a/src/main/java/com/google/gwtorm/nosql/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
@@ -27,18 +27,16 @@
 import com.google.gwtorm.server.GeneratedClassLoader;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
-
-import org.antlr.runtime.tree.Tree;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import org.antlr.runtime.tree.Tree;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 /** Generates a concrete implementation of a {@link NoSqlAccess} extension. */
 class AccessGen implements Opcodes {
@@ -50,8 +48,7 @@
   private static final Type byteArray = Type.getType(byte[].class);
   private static final Type ormException = Type.getType(OrmException.class);
   private static final Type resultSet = Type.getType(ResultSet.class);
-  private static final Type indexKeyBuilder =
-      Type.getType(IndexKeyBuilder.class);
+  private static final Type indexKeyBuilder = Type.getType(IndexKeyBuilder.class);
 
   private static final String F_OBJECT_CODEC = "objectCodec";
   private static final String F_INDEXES = "indexes";
@@ -68,16 +65,17 @@
   private String implClassName;
   private String implTypeName;
 
-  AccessGen(final GeneratedClassLoader loader, final RelationModel rm,
+  AccessGen(
+      final GeneratedClassLoader loader,
+      final RelationModel rm,
       final Class<? extends NoSqlSchema> schemaClazz,
-      @SuppressWarnings("rawtypes")
-      final Class<? extends NoSqlAccess> accessClazz) throws OrmException {
+      @SuppressWarnings("rawtypes") final Class<? extends NoSqlAccess> accessClazz)
+      throws OrmException {
     classLoader = loader;
     model = rm;
 
     try {
-      modelClass =
-          Class.forName(model.getEntityTypeClassName(), true, classLoader);
+      modelClass = Class.forName(model.getEntityTypeClassName(), true, classLoader);
     } catch (ClassNotFoundException cnfe) {
       throw new OrmException("Cannot locate model class", cnfe);
     }
@@ -88,8 +86,7 @@
 
     key = model.getPrimaryKey();
     if (key == null) {
-      throw new OrmException("Relation " + rm.getMethodName()
-          + " has no primary key");
+      throw new OrmException("Relation " + rm.getMethodName() + " has no primary key");
     }
   }
 
@@ -187,52 +184,69 @@
 
   private void init() {
     implClassName =
-        model.getEntityTypeClassName() + "_Access_" + model.getMethodName()
-            + "_" + Util.createRandomName();
+        model.getEntityTypeClassName()
+            + "_Access_"
+            + model.getMethodName()
+            + "_"
+            + Util.createRandomName();
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
-        accessType.getInternalName(), new String[] {model
-            .getAccessInterfaceName().replace('.', '/')});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        accessType.getInternalName(),
+        new String[] {model.getAccessInterfaceName().replace('.', '/')});
   }
 
   private void implementStaticFields() {
-    cw.visitField(ACC_PRIVATE | ACC_STATIC, F_OBJECT_CODEC,
-        protobufCodec.getDescriptor(), null, null).visitEnd();
-    cw.visitField(ACC_PRIVATE | ACC_STATIC, F_INDEXES,
-        Type.getType(IndexFunction[].class).getDescriptor(), null, null)
+    cw.visitField(
+            ACC_PRIVATE | ACC_STATIC, F_OBJECT_CODEC, protobufCodec.getDescriptor(), null, null)
+        .visitEnd();
+    cw.visitField(
+            ACC_PRIVATE | ACC_STATIC,
+            F_INDEXES,
+            Type.getType(IndexFunction[].class).getDescriptor(),
+            null,
+            null)
         .visitEnd();
 
     for (final QueryModel q : model.getQueries()) {
       if (needsIndexFunction(q)) {
-        cw.visitField(ACC_PRIVATE | ACC_STATIC, "index_" + q.getName(),
-            indexFunction.getDescriptor(), null, null).visitEnd();
+        cw.visitField(
+                ACC_PRIVATE | ACC_STATIC,
+                "index_" + q.getName(),
+                indexFunction.getDescriptor(),
+                null,
+                null)
+            .visitEnd();
       }
     }
   }
 
   private void implementConstructor() {
     final String consName = "<init>";
-    final String consDesc =
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {schemaType});
-    final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+    final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {schemaType});
+    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
     mv.visitCode();
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, 1);
-    mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), consName,
-        consDesc);
+    mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), consName, consDesc);
     mv.visitInsn(RETURN);
     mv.visitMaxs(-1, -1);
     mv.visitEnd();
   }
 
-  private void implementGetString(final String methodName,
-      final String returnValue) {
+  private void implementGetString(final String methodName, final String returnValue) {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
-            .getMethodDescriptor(string, new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            methodName,
+            Type.getMethodDescriptor(string, new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     mv.visitLdcInsn(returnValue);
     mv.visitInsn(ARETURN);
@@ -242,8 +256,12 @@
 
   private void implementGetRelationID() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getRelationID", Type
-            .getMethodDescriptor(Type.INT_TYPE, new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getRelationID",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     new CodeGenSupport(mv).push(model.getRelationID());
     mv.visitInsn(IRETURN);
@@ -253,11 +271,14 @@
 
   private void implementGetObjectCodec() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getObjectCodec", Type
-            .getMethodDescriptor(protobufCodec, new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getObjectCodec",
+            Type.getMethodDescriptor(protobufCodec, new Type[] {}),
+            null,
+            null);
     mv.visitCode();
-    mv.visitFieldInsn(GETSTATIC, implTypeName, F_OBJECT_CODEC, protobufCodec
-        .getDescriptor());
+    mv.visitFieldInsn(GETSTATIC, implTypeName, F_OBJECT_CODEC, protobufCodec.getDescriptor());
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
     mv.visitEnd();
@@ -265,12 +286,15 @@
 
   private void implementGetIndexes() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getIndexes", Type
-            .getMethodDescriptor(Type.getType(IndexFunction[].class),
-                new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getIndexes",
+            Type.getMethodDescriptor(Type.getType(IndexFunction[].class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
-    mv.visitFieldInsn(GETSTATIC, implTypeName, F_INDEXES, Type.getType(
-        IndexFunction[].class).getDescriptor());
+    mv.visitFieldInsn(
+        GETSTATIC, implTypeName, F_INDEXES, Type.getType(IndexFunction[].class).getDescriptor());
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
     mv.visitEnd();
@@ -279,12 +303,19 @@
   private void implementPrimaryKey() {
     final ColumnModel f = key.getField();
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "primaryKey", Type
-            .getMethodDescriptor(ormKey, new Type[] {object}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "primaryKey",
+            Type.getMethodDescriptor(ormKey, new Type[] {object}),
+            null,
+            null);
     mv.visitCode();
     mv.visitVarInsn(ALOAD, 1);
     mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
-    mv.visitFieldInsn(GETFIELD, entityType.getInternalName(), f.getFieldName(),
+    mv.visitFieldInsn(
+        GETFIELD,
+        entityType.getInternalName(),
+        f.getFieldName(),
         CodeGenSupport.toType(f).getDescriptor());
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
@@ -295,17 +326,19 @@
     final List<ColumnModel> pCols = Collections.singletonList(key.getField());
     final Type argType = CodeGenSupport.toType(key.getField());
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "encodePrimaryKey", Type
-            .getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder,
-                ormKey}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "encodePrimaryKey",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder, ormKey}),
+            null,
+            null);
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 2);
     mv.visitTypeInsn(CHECKCAST, argType.getInternalName());
     mv.visitVarInsn(ASTORE, 2);
 
-    final QueryCGS cgs =
-        new QueryCGS(mv, new Type[] {argType}, pCols, new int[] {2}, 1);
+    final QueryCGS cgs = new QueryCGS(mv, new Type[] {argType}, pCols, new int[] {2}, 1);
     for (ColumnModel f : pCols) {
       IndexFunctionGen.encodeField(new QueryModel.OrderBy(f, false), mv, cgs);
     }
@@ -318,15 +351,21 @@
   private void implementKeyQuery(KeyModel key) {
     final Type keyType = CodeGenSupport.toType(key.getField());
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, key.getName(), Type
-            .getMethodDescriptor(entityType, new Type[] {keyType}), null,
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            key.getName(),
+            Type.getMethodDescriptor(entityType, new Type[] {keyType}),
+            null,
             new String[] {Type.getType(OrmException.class).getInternalName()});
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, 1);
-    mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), "get", Type
-        .getMethodDescriptor(object, new Type[] {ormKey}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        accessType.getInternalName(),
+        "get",
+        Type.getMethodDescriptor(object, new Type[] {ormKey}));
     mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
 
     mv.visitInsn(ARETURN);
@@ -352,8 +391,11 @@
     }
 
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
-            .getMethodDescriptor(resultSet, pTypes), null,
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            info.getName(),
+            Type.getMethodDescriptor(resultSet, pTypes),
+            null,
             new String[] {ormException.getInternalName()});
     mv.visitCode();
 
@@ -364,8 +406,11 @@
     final int fromBuf = nextVar++;
     mv.visitTypeInsn(NEW, indexKeyBuilder.getInternalName());
     mv.visitInsn(DUP);
-    mv.visitMethodInsn(INVOKESPECIAL, indexKeyBuilder.getInternalName(),
-        "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        indexKeyBuilder.getInternalName(),
+        "<init>",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     mv.visitVarInsn(ASTORE, fromBuf);
 
     QueryCGS cgs = new QueryCGS(mv, pTypes, pCols, pVars, fromBuf);
@@ -376,8 +421,11 @@
     final int toBuf = nextVar++;
     mv.visitTypeInsn(NEW, indexKeyBuilder.getInternalName());
     mv.visitInsn(DUP);
-    mv.visitMethodInsn(INVOKESPECIAL, indexKeyBuilder.getInternalName(),
-        "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        indexKeyBuilder.getInternalName(),
+        "<init>",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     mv.visitVarInsn(ASTORE, toBuf);
 
     cgs = new QueryCGS(mv, pTypes, pCols, pVars, toBuf);
@@ -388,17 +436,23 @@
     //
     mv.visitVarInsn(ALOAD, 0);
     if (needsIndexFunction(info)) {
-      mv.visitFieldInsn(GETSTATIC, implTypeName, "index_" + info.getName(),
-          indexFunction.getDescriptor());
+      mv.visitFieldInsn(
+          GETSTATIC, implTypeName, "index_" + info.getName(), indexFunction.getDescriptor());
     }
 
     mv.visitVarInsn(ALOAD, fromBuf);
-    mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-        "toByteArray", Type.getMethodDescriptor(byteArray, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        indexKeyBuilder.getInternalName(),
+        "toByteArray",
+        Type.getMethodDescriptor(byteArray, new Type[] {}));
 
     mv.visitVarInsn(ALOAD, toBuf);
-    mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-        "toByteArray", Type.getMethodDescriptor(byteArray, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        indexKeyBuilder.getInternalName(),
+        "toByteArray",
+        Type.getMethodDescriptor(byteArray, new Type[] {}));
 
     // Set the limit on the number of results.
     //
@@ -417,16 +471,22 @@
     cgs.push(info.hasOrderBy() ? 1 : 0);
 
     if (needsIndexFunction(info)) {
-      mv.visitMethodInsn(INVOKEVIRTUAL, accessType.getInternalName(),
-          "scanIndex", Type.getMethodDescriptor(resultSet, new Type[] {
-              indexFunction, byteArray, byteArray, Type.INT_TYPE,
-              Type.BOOLEAN_TYPE}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          accessType.getInternalName(),
+          "scanIndex",
+          Type.getMethodDescriptor(
+              resultSet,
+              new Type[] {indexFunction, byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
     } else {
       // No where and no order by clause? Use the primary key instead.
       //
-      mv.visitMethodInsn(INVOKEVIRTUAL, accessType.getInternalName(),
-          "scanPrimaryKey", Type.getMethodDescriptor(resultSet, new Type[] {
-              byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          accessType.getInternalName(),
+          "scanPrimaryKey",
+          Type.getMethodDescriptor(
+              resultSet, new Type[] {byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
     }
 
     mv.visitInsn(ARETURN);
@@ -438,8 +498,9 @@
     return info.hasWhere() || info.hasOrderBy();
   }
 
-  private void encodeFields(QueryModel qm, List<Tree> query, MethodVisitor mv,
-      QueryCGS cgs, boolean fromKey) throws OrmException {
+  private void encodeFields(
+      QueryModel qm, List<Tree> query, MethodVisitor mv, QueryCGS cgs, boolean fromKey)
+      throws OrmException {
     final boolean toKey = !fromKey;
     Tree lastNode = null;
 
@@ -490,9 +551,13 @@
           break;
 
         default:
-          throw new OrmException("Unsupported query token in "
-              + model.getMethodName() + "." + qm.getName() + ": "
-              + node.toStringTree());
+          throw new OrmException(
+              "Unsupported query token in "
+                  + model.getMethodName()
+                  + "."
+                  + qm.getName()
+                  + ": "
+                  + node.toStringTree());
       }
 
       cgs.nextParameter();
@@ -501,13 +566,16 @@
 
   private void checkLastNode(QueryModel qm, Tree lastNode) throws OrmException {
     if (lastNode != null) {
-      throw new OrmException(lastNode.getText() + " must be last operator in "
-          + model.getMethodName() + "." + qm.getName());
+      throw new OrmException(
+          lastNode.getText()
+              + " must be last operator in "
+              + model.getMethodName()
+              + "."
+              + qm.getName());
     }
   }
 
-  private void encodeField(Tree node, MethodVisitor mv, QueryCGS cgs)
-      throws OrmException {
+  private void encodeField(Tree node, MethodVisitor mv, QueryCGS cgs) throws OrmException {
     ColumnModel f = ((QueryParser.Column) node.getChild(0)).getField();
     IndexFunctionGen.encodeField(new QueryModel.OrderBy(f, false), mv, cgs);
   }
@@ -520,29 +588,31 @@
     switch (node.getType()) {
       case 0: // nil node used to join other nodes together
       case QueryParser.WHERE:
-      case QueryParser.AND: {
-        List<Tree> res = new ArrayList<>();
-        for (int i = 0; i < node.getChildCount(); i++) {
-          res.addAll(compareOpsOnly(node.getChild(i)));
+      case QueryParser.AND:
+        {
+          List<Tree> res = new ArrayList<>();
+          for (int i = 0; i < node.getChildCount(); i++) {
+            res.addAll(compareOpsOnly(node.getChild(i)));
+          }
+          return res;
         }
-        return res;
-      }
 
       case QueryParser.GT:
       case QueryParser.GE:
       case QueryParser.EQ:
       case QueryParser.LE:
-      case QueryParser.LT: {
-        final Tree lhs = node.getChild(0);
-        final Tree rhs = node.getChild(1);
-        if (lhs.getType() != QueryParser.ID) {
-          throw new OrmException("Unsupported query token");
+      case QueryParser.LT:
+        {
+          final Tree lhs = node.getChild(0);
+          final Tree rhs = node.getChild(1);
+          if (lhs.getType() != QueryParser.ID) {
+            throw new OrmException("Unsupported query token");
+          }
+          if (rhs.getType() == QueryParser.PLACEHOLDER) {
+            return Collections.singletonList(node);
+          }
+          break;
         }
-        if (rhs.getType() == QueryParser.PLACEHOLDER) {
-          return Collections.singletonList(node);
-        }
-        break;
-      }
 
       case QueryParser.ORDER:
       case QueryParser.LIMIT:
@@ -561,8 +631,8 @@
     private final int bufvar;
     private int currentp;
 
-    private QueryCGS(MethodVisitor method, Type[] pTypes,
-        List<ColumnModel> pCols, int[] pVars, int bufvar) {
+    private QueryCGS(
+        MethodVisitor method, Type[] pTypes, List<ColumnModel> pCols, int[] pVars, int bufvar) {
       super(method);
       this.pTypes = pTypes;
       this.pCols = pCols;
diff --git a/src/main/java/com/google/gwtorm/nosql/CounterShard.java b/src/main/java/com/google/gwtorm/nosql/CounterShard.java
index 4761bce..5c5ccb3 100644
--- a/src/main/java/com/google/gwtorm/nosql/CounterShard.java
+++ b/src/main/java/com/google/gwtorm/nosql/CounterShard.java
@@ -20,20 +20,18 @@
 
 /**
  * A single slice of an incrementing counter.
- * <p>
- * <b>This shard class is not thread safe.</b> Implementors using this type must
- * perform synchronization through external mechanisms such as a row-level lock.
- * <p>
- * NoSQL implementations can use this object to store counters and keep track of
- * their values within {@code nextLong(String)}. To improve allocation
- * performance counters may be sliced into shards, with allocation coming out of
- * a randomly selected shard, and each shard being replenished from a master
- * shard when it {@link #isEmpty()}.
+ *
+ * <p><b>This shard class is not thread safe.</b> Implementors using this type must perform
+ * synchronization through external mechanisms such as a row-level lock.
+ *
+ * <p>NoSQL implementations can use this object to store counters and keep track of their values
+ * within {@code nextLong(String)}. To improve allocation performance counters may be sliced into
+ * shards, with allocation coming out of a randomly selected shard, and each shard being replenished
+ * from a master shard when it {@link #isEmpty()}.
  */
 public class CounterShard {
   /** Standard encoder/decoder for this class. */
-  public static final ProtobufCodec<CounterShard> CODEC =
-      CodecFactory.encoder(CounterShard.class);
+  public static final ProtobufCodec<CounterShard> CODEC = CodecFactory.encoder(CounterShard.class);
 
   /** Current value in this shard, this is the next to assign out. */
   @Column(id = 1)
@@ -43,8 +41,7 @@
   @Column(id = 2)
   protected long max;
 
-  protected CounterShard() {
-  }
+  protected CounterShard() {}
 
   /**
    * Create a new shard with a specific starting value, with no maximum.
@@ -59,8 +56,8 @@
    * Create a new shard with a specific starting point and maximum.
    *
    * @param next the first value this shard will hand out.
-   * @param max the highest value the shard will stop at. The shard will not
-   *        actually hand out this value.
+   * @param max the highest value the shard will stop at. The shard will not actually hand out this
+   *     value.
    */
   public CounterShard(long next, long max) {
     this.current = next;
@@ -76,8 +73,7 @@
    * Obtain the next value from this shard.
    *
    * @return the next value
-   * @throws IllegalStateException the shard {@link #isEmpty()} and cannot hand
-   *         out any more values.
+   * @throws IllegalStateException the shard {@link #isEmpty()} and cannot hand out any more values.
    */
   public long next() {
     if (isEmpty()) {
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexFunction.java b/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
index edc83b9..951bb70 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
@@ -16,13 +16,12 @@
 
 /**
  * A function to produce a NoSQL secondary index key from an object.
- * <p>
- * An index function computes a row key for a secondary index table by appending
- * the relevant values to the builder's internal buffer in the order they are
- * referenced in the query.
- * <p>
- * Typically an IndexFunction is automatically code generated at runtime by
- * {@link IndexFunctionGen}.
+ *
+ * <p>An index function computes a row key for a secondary index table by appending the relevant
+ * values to the builder's internal buffer in the order they are referenced in the query.
+ *
+ * <p>Typically an IndexFunction is automatically code generated at runtime by {@link
+ * IndexFunctionGen}.
  *
  * @param <T> type of the object the index record references.
  */
@@ -32,10 +31,10 @@
 
   /**
    * Should this object exist in the index?
-   * <p>
-   * Objects that shouldn't appear in this index are skipped because field
-   * values are currently {@code null}, or because one or more field values do
-   * not match the constants used in the query that defines the index.
+   *
+   * <p>Objects that shouldn't appear in this index are skipped because field values are currently
+   * {@code null}, or because one or more field values do not match the constants used in the query
+   * that defines the index.
    *
    * @param object the object to read fields from.
    * @return true if the object should be indexed by this index.
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
index ecded5d..73ab914 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
@@ -21,14 +21,6 @@
 import com.google.gwtorm.server.CodeGenSupport;
 import com.google.gwtorm.server.GeneratedClassLoader;
 import com.google.gwtorm.server.OrmException;
-
-import org.antlr.runtime.tree.Tree;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,13 +28,18 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import org.antlr.runtime.tree.Tree;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 /** Generates {@link IndexFunction} implementations. */
 class IndexFunctionGen<T> implements Opcodes {
   private static final Type string = Type.getType(String.class);
   private static final Type object = Type.getType(Object.class);
-  private static final Type indexKeyBuilder =
-      Type.getType(IndexKeyBuilder.class);
+  private static final Type indexKeyBuilder = Type.getType(IndexKeyBuilder.class);
 
   private final GeneratedClassLoader classLoader;
   private final QueryModel query;
@@ -55,8 +52,7 @@
   private String implClassName;
   private String implTypeName;
 
-  IndexFunctionGen(final GeneratedClassLoader loader, final QueryModel qm,
-      final Class<T> t) {
+  IndexFunctionGen(final GeneratedClassLoader loader, final QueryModel qm, final Class<T> t) {
     classLoader = loader;
     query = qm;
 
@@ -149,21 +145,23 @@
   private void init() {
     superTypeName = Type.getInternalName(IndexFunction.class);
     implClassName =
-        pojo.getName() + "_IndexFunction_" + query.getName() + "_"
-            + Util.createRandomName();
+        pojo.getName() + "_IndexFunction_" + query.getName() + "_" + Util.createRandomName();
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
-        superTypeName, new String[] {});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        superTypeName,
+        new String[] {});
   }
 
   private void implementConstructor() {
     final String consName = "<init>";
-    final String consDesc =
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
-    final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+    final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
+    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
@@ -176,9 +174,12 @@
 
   private void implementGetName() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getName", Type
-            .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "getName",
+            Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
     mv.visitLdcInsn(query.getName());
     mv.visitInsn(ARETURN);
@@ -188,8 +189,12 @@
 
   private void implementIncludes() throws OrmException {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "includes", Type.getMethodDescriptor(
-            Type.BOOLEAN_TYPE, new Type[] {object}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "includes",
+            Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}),
+            null,
+            null);
     mv.visitCode();
     final IncludeCGS cgs = new IncludeCGS(mv);
     cgs.setEntityType(pojoType);
@@ -219,8 +224,8 @@
     mv.visitEnd();
   }
 
-  private static void checkNotNullFields(Collection<ColumnModel> myFields,
-      Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs)
+  private static void checkNotNullFields(
+      Collection<ColumnModel> myFields, Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs)
       throws OrmException {
     for (ColumnModel f : myFields) {
       if (f.isNested()) {
@@ -231,8 +236,8 @@
     }
   }
 
-  private static void checkNotNullScalar(MethodVisitor mv,
-      Set<ColumnModel> checked, IncludeCGS cgs, ColumnModel f)
+  private static void checkNotNullScalar(
+      MethodVisitor mv, Set<ColumnModel> checked, IncludeCGS cgs, ColumnModel f)
       throws OrmException {
     checkParentNotNull(f.getParent(), checked, mv, cgs);
     cgs.setFieldReference(f);
@@ -247,36 +252,40 @@
         break;
 
       case Type.ARRAY:
-      case Type.OBJECT: {
-        if (f.getPrimitiveType() == byte[].class) {
-          cgs.pushFieldValue();
-          mv.visitJumpInsn(IFNULL, cgs.no);
+      case Type.OBJECT:
+        {
+          if (f.getPrimitiveType() == byte[].class) {
+            cgs.pushFieldValue();
+            mv.visitJumpInsn(IFNULL, cgs.no);
 
-        } else if (f.getPrimitiveType() == String.class) {
-          cgs.pushFieldValue();
-          mv.visitJumpInsn(IFNULL, cgs.no);
+          } else if (f.getPrimitiveType() == String.class) {
+            cgs.pushFieldValue();
+            mv.visitJumpInsn(IFNULL, cgs.no);
 
-        } else if (f.getPrimitiveType() == java.sql.Timestamp.class
-            || f.getPrimitiveType() == java.util.Date.class
-            || f.getPrimitiveType() == java.sql.Date.class) {
-          cgs.pushFieldValue();
-          mv.visitJumpInsn(IFNULL, cgs.no);
+          } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+              || f.getPrimitiveType() == java.util.Date.class
+              || f.getPrimitiveType() == java.sql.Date.class) {
+            cgs.pushFieldValue();
+            mv.visitJumpInsn(IFNULL, cgs.no);
 
-        } else {
-          throw new OrmException("Type " + f.getPrimitiveType()
-              + " not supported for field " + f.getPathToFieldName());
+          } else {
+            throw new OrmException(
+                "Type "
+                    + f.getPrimitiveType()
+                    + " not supported for field "
+                    + f.getPathToFieldName());
+          }
+          break;
         }
-        break;
-      }
 
       default:
-        throw new OrmException("Type " + f.getPrimitiveType()
-            + " not supported for field " + f.getPathToFieldName());
+        throw new OrmException(
+            "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
     }
   }
 
-  private static void checkParentNotNull(ColumnModel f,
-      Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs) {
+  private static void checkParentNotNull(
+      ColumnModel f, Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs) {
     if (f != null && checked.add(f)) {
       checkParentNotNull(f.getParent(), checked, mv, cgs);
       cgs.setFieldReference(f);
@@ -285,10 +294,9 @@
     }
   }
 
-  private void checkConstants(Tree node, MethodVisitor mv, IncludeCGS cgs)
-      throws OrmException {
+  private void checkConstants(Tree node, MethodVisitor mv, IncludeCGS cgs) throws OrmException {
     switch (node.getType()) {
-      // These don't impact the constant evaluation
+        // These don't impact the constant evaluation
       case QueryParser.ORDER:
       case QueryParser.LIMIT:
         break;
@@ -305,52 +313,55 @@
       case QueryParser.LE:
       case QueryParser.GT:
       case QueryParser.GE:
-      case QueryParser.EQ: {
-        final Tree lhs = node.getChild(0);
-        final Tree rhs = node.getChild(1);
-        if (lhs.getType() != QueryParser.ID) {
-          throw new OrmException("Unsupported query token");
-        }
+      case QueryParser.EQ:
+        {
+          final Tree lhs = node.getChild(0);
+          final Tree rhs = node.getChild(1);
+          if (lhs.getType() != QueryParser.ID) {
+            throw new OrmException("Unsupported query token");
+          }
 
-        cgs.setFieldReference(((QueryParser.Column) lhs).getField());
-        switch (rhs.getType()) {
-          case QueryParser.PLACEHOLDER:
-            // Parameter evaluated at runtime
-            break;
+          cgs.setFieldReference(((QueryParser.Column) lhs).getField());
+          switch (rhs.getType()) {
+            case QueryParser.PLACEHOLDER:
+              // Parameter evaluated at runtime
+              break;
 
-          case QueryParser.TRUE:
-            cgs.pushFieldValue();
-            mv.visitJumpInsn(IFEQ, cgs.no);
-            break;
-
-          case QueryParser.FALSE:
-            cgs.pushFieldValue();
-            mv.visitJumpInsn(IFNE, cgs.no);
-            break;
-
-          case QueryParser.CONSTANT_INTEGER:
-            cgs.pushFieldValue();
-            cgs.push(Integer.parseInt(rhs.getText()));
-            mv.visitJumpInsn(IF_ICMPNE, cgs.no);
-            break;
-
-          case QueryParser.CONSTANT_STRING:
-            if (cgs.getFieldReference().getPrimitiveType() == Character.TYPE) {
-              cgs.push(dequote(rhs.getText()).charAt(0));
+            case QueryParser.TRUE:
               cgs.pushFieldValue();
-              mv.visitJumpInsn(IF_ICMPNE, cgs.no);
-            } else {
-              mv.visitLdcInsn(dequote(rhs.getText()));
-              cgs.pushFieldValue();
-              mv.visitMethodInsn(INVOKEVIRTUAL, string.getInternalName(),
-                  "equals", Type.getMethodDescriptor(Type.BOOLEAN_TYPE,
-                      new Type[] {object}));
               mv.visitJumpInsn(IFEQ, cgs.no);
-            }
-            break;
+              break;
+
+            case QueryParser.FALSE:
+              cgs.pushFieldValue();
+              mv.visitJumpInsn(IFNE, cgs.no);
+              break;
+
+            case QueryParser.CONSTANT_INTEGER:
+              cgs.pushFieldValue();
+              cgs.push(Integer.parseInt(rhs.getText()));
+              mv.visitJumpInsn(IF_ICMPNE, cgs.no);
+              break;
+
+            case QueryParser.CONSTANT_STRING:
+              if (cgs.getFieldReference().getPrimitiveType() == Character.TYPE) {
+                cgs.push(dequote(rhs.getText()).charAt(0));
+                cgs.pushFieldValue();
+                mv.visitJumpInsn(IF_ICMPNE, cgs.no);
+              } else {
+                mv.visitLdcInsn(dequote(rhs.getText()));
+                cgs.pushFieldValue();
+                mv.visitMethodInsn(
+                    INVOKEVIRTUAL,
+                    string.getInternalName(),
+                    "equals",
+                    Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
+                mv.visitJumpInsn(IFEQ, cgs.no);
+              }
+              break;
+          }
+          break;
         }
-        break;
-      }
 
       default:
         throw new OrmException("Unsupported query token " + node.toStringTree());
@@ -363,8 +374,12 @@
 
   private void implementEncode() throws OrmException {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {indexKeyBuilder, object}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "encode",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder, object}),
+            null,
+            null);
     mv.visitCode();
     final EncodeCGS cgs = new EncodeCGS(mv);
     cgs.setEntityType(pojoType);
@@ -380,8 +395,9 @@
     mv.visitEnd();
   }
 
-  static void encodeFields(Collection<QueryModel.OrderBy> myFields,
-      final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+  static void encodeFields(
+      Collection<QueryModel.OrderBy> myFields, final MethodVisitor mv, final EncodeCGS cgs)
+      throws OrmException {
     Iterator<QueryModel.OrderBy> i = myFields.iterator();
     while (i.hasNext()) {
       QueryModel.OrderBy f = i.next();
@@ -392,8 +408,8 @@
     }
   }
 
-  static void encodeField(QueryModel.OrderBy f, final MethodVisitor mv,
-      final EncodeCGS cgs) throws OrmException {
+  static void encodeField(QueryModel.OrderBy f, final MethodVisitor mv, final EncodeCGS cgs)
+      throws OrmException {
     if (f.column.isNested()) {
       encodeFields(orderByLeaves(Collections.singletonList(f)), mv, cgs);
     } else {
@@ -401,8 +417,8 @@
     }
   }
 
-  private static void encodeScalar(QueryModel.OrderBy f, final MethodVisitor mv,
-      final EncodeCGS cgs) throws OrmException {
+  private static void encodeScalar(
+      QueryModel.OrderBy f, final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
     String method = f.descending ? "desc" : "add";
     ColumnModel c = f.column;
     cgs.setFieldReference(c);
@@ -416,56 +432,73 @@
         cgs.pushBuilder();
         cgs.pushFieldValue();
         mv.visitInsn(I2L);
-        mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-            method, Type.getMethodDescriptor(Type.VOID_TYPE,
-                new Type[] {Type.LONG_TYPE}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            indexKeyBuilder.getInternalName(),
+            method,
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
         break;
 
       case Type.LONG:
         cgs.pushBuilder();
         cgs.pushFieldValue();
-        mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-            method, Type.getMethodDescriptor(Type.VOID_TYPE,
-                new Type[] {Type.LONG_TYPE}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            indexKeyBuilder.getInternalName(),
+            method,
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
         break;
 
       case Type.ARRAY:
-      case Type.OBJECT: {
-        if (c.getPrimitiveType() == byte[].class) {
-          cgs.pushBuilder();
-          cgs.pushFieldValue();
-          mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-              method, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
-                  .getType(byte[].class)}));
+      case Type.OBJECT:
+        {
+          if (c.getPrimitiveType() == byte[].class) {
+            cgs.pushBuilder();
+            cgs.pushFieldValue();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                indexKeyBuilder.getInternalName(),
+                method,
+                Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(byte[].class)}));
 
-        } else if (c.getPrimitiveType() == String.class) {
-          cgs.pushBuilder();
-          cgs.pushFieldValue();
-          mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-              method, Type.getMethodDescriptor(Type.VOID_TYPE,
-                  new Type[] {string}));
+          } else if (c.getPrimitiveType() == String.class) {
+            cgs.pushBuilder();
+            cgs.pushFieldValue();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                indexKeyBuilder.getInternalName(),
+                method,
+                Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
 
-        } else if (c.getPrimitiveType() == java.sql.Timestamp.class
-            || c.getPrimitiveType() == java.util.Date.class
-            || c.getPrimitiveType() == java.sql.Date.class) {
-          cgs.pushBuilder();
-          cgs.pushFieldValue();
-          String tsType = Type.getType(c.getPrimitiveType()).getInternalName();
-          mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
-              .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
-          mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-              method, Type.getMethodDescriptor(Type.VOID_TYPE,
-                  new Type[] {Type.LONG_TYPE}));
-        } else {
-          throw new OrmException("Type " + c.getPrimitiveType()
-              + " not supported for field " + c.getPathToFieldName());
+          } else if (c.getPrimitiveType() == java.sql.Timestamp.class
+              || c.getPrimitiveType() == java.util.Date.class
+              || c.getPrimitiveType() == java.sql.Date.class) {
+            cgs.pushBuilder();
+            cgs.pushFieldValue();
+            String tsType = Type.getType(c.getPrimitiveType()).getInternalName();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                tsType,
+                "getTime",
+                Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                indexKeyBuilder.getInternalName(),
+                method,
+                Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
+          } else {
+            throw new OrmException(
+                "Type "
+                    + c.getPrimitiveType()
+                    + " not supported for field "
+                    + c.getPathToFieldName());
+          }
+          break;
         }
-        break;
-      }
 
       default:
-        throw new OrmException("Type " + c.getPrimitiveType()
-            + " not supported for field " + c.getPathToFieldName());
+        throw new OrmException(
+            "Type " + c.getPrimitiveType() + " not supported for field " + c.getPathToFieldName());
     }
   }
 
@@ -489,20 +522,29 @@
 
     void infinity() {
       pushBuilder();
-      mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-          "infinity", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          indexKeyBuilder.getInternalName(),
+          "infinity",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     }
 
     void delimiter() {
       pushBuilder();
-      mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-          "delimiter", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          indexKeyBuilder.getInternalName(),
+          "delimiter",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     }
 
     void nul() {
       pushBuilder();
-      mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
-          "nul", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          indexKeyBuilder.getInternalName(),
+          "nul",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
     }
 
     void pushBuilder() {
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java b/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
index 2bed6ce..6df8866 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
@@ -14,46 +14,41 @@
 
 package com.google.gwtorm.nosql;
 
-
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
 
 /**
  * Encoder support for {@link IndexFunction} computed strings.
- * <p>
- * This class provides a string that may contain multiple values, using
- * delimiters between fields and big-endian encoded numerics. Sorting the
- * resulting strings using unsigned byte orderings produces a stable sorting.
- * <p>
- * The encoding used by this class relies on having 258 tokens. To get the extra
- * 2 tokens within a 256 byte range, escapes are used according to the following
- * simple table:
+ *
+ * <p>This class provides a string that may contain multiple values, using delimiters between fields
+ * and big-endian encoded numerics. Sorting the resulting strings using unsigned byte orderings
+ * produces a stable sorting.
+ *
+ * <p>The encoding used by this class relies on having 258 tokens. To get the extra 2 tokens within
+ * a 256 byte range, escapes are used according to the following simple table:
+ *
  * <ul>
- * <li>delimiter = \x00\x01
- * <li>byte \x00 = \x00\xff
- * <li>byte \xff = \xff\x00
- * <li>infinity = \xff\xff
+ *   <li>delimiter = \x00\x01
+ *   <li>byte \x00 = \x00\xff
+ *   <li>byte \xff = \xff\x00
+ *   <li>infinity = \xff\xff
  * </ul>
- * <p>
- * Integers are encoded as variable length big-endian values, skipping leading
- * zero bytes, prefixed by the number of bytes used to encode them. Therefore 0
- * is encoded as "\x00", and 256 is encoded as "\x02\x01\x00". Negative values
- * are encoded in their twos complement encoding and therefore sort after the
- * maximum positive value.
- * <p>
- * Strings and byte arrays supplied by the caller have their \x00 and \xff
- * values escaped according to the table above, but are otherwise written as-is
- * without a length prefix.
- * <p>
- * Callers are responsible for inserting {@link #delimiter()} markers at the
- * appropriate positions in the sequence.
+ *
+ * <p>Integers are encoded as variable length big-endian values, skipping leading zero bytes,
+ * prefixed by the number of bytes used to encode them. Therefore 0 is encoded as "\x00", and 256 is
+ * encoded as "\x02\x01\x00". Negative values are encoded in their twos complement encoding and
+ * therefore sort after the maximum positive value.
+ *
+ * <p>Strings and byte arrays supplied by the caller have their \x00 and \xff values escaped
+ * according to the table above, but are otherwise written as-is without a length prefix.
+ *
+ * <p>Callers are responsible for inserting {@link #delimiter()} markers at the appropriate
+ * positions in the sequence.
  */
 public class IndexKeyBuilder {
   private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
 
-  /**
-   * Add a delimiter marker to the string.
-   */
+  /** Add a delimiter marker to the string. */
   public void delimiter() {
     buf.write(0x00);
     buf.write(0x01);
@@ -61,8 +56,8 @@
 
   /**
    * Add the special infinity symbol to the string.
-   * <p>
-   * The infinity symbol sorts after all other values in the same position.
+   *
+   * <p>The infinity symbol sorts after all other values in the same position.
    */
   public void infinity() {
     buf.write(0xff);
@@ -71,9 +66,8 @@
 
   /**
    * Add \0 to the string.
-   * <p>
-   * \0 can be used during searches to enforce greater then or less then clauses
-   * in a query.
+   *
+   * <p>\0 can be used during searches to enforce greater then or less then clauses in a query.
    */
   public void nul() {
     buf.write(0x00);
@@ -81,9 +75,9 @@
 
   /**
    * Add a raw sequence of bytes.
-   * <p>
-   * The bytes 0x00 and 0xff are escaped by this method according to the
-   * encoding table described in the class documentation.
+   *
+   * <p>The bytes 0x00 and 0xff are escaped by this method according to the encoding table described
+   * in the class documentation.
    *
    * @param bin array to copy from.
    * @param pos first index to copy.
@@ -125,9 +119,9 @@
 
   /**
    * Add a raw sequence of bytes.
-   * <p>
-   * The bytes 0x00 and 0xff are escaped by this method according to the
-   * encoding table described in the class documentation.
+   *
+   * <p>The bytes 0x00 and 0xff are escaped by this method according to the encoding table described
+   * in the class documentation.
    *
    * @param bin the complete array to copy.
    */
@@ -204,9 +198,9 @@
 
   /**
    * Add a byte array as-is, without escaping.
-   * <p>
-   * This should only be used the byte array came from a prior index key and the
-   * caller is trying to create a new key with this key embedded at the end.
+   *
+   * <p>This should only be used the byte array came from a prior index key and the caller is trying
+   * to create a new key with this key embedded at the end.
    *
    * @param bin the binary to append as-is, without further escaping.
    */
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexRow.java b/src/main/java/com/google/gwtorm/nosql/IndexRow.java
index 4986e3a..b4fa059 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexRow.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexRow.java
@@ -20,20 +20,17 @@
 
 /**
  * Data value stored in a NoSQL secondary index row.
- * <p>
- * Instances of this object can be used inside of the data portion of a
- * secondary index row, and may either contain the key of the primary data row,
- * or a copy of the primary object data.
- * <p>
- * The {@link #timestamp} field can be used to fossil collect secondary index
- * rows that no longer match the primary data row and which are older than the
- * longest expected transaction. These fossil rows may have occurred due to an
- * aborted, but partially applied transaction.
+ *
+ * <p>Instances of this object can be used inside of the data portion of a secondary index row, and
+ * may either contain the key of the primary data row, or a copy of the primary object data.
+ *
+ * <p>The {@link #timestamp} field can be used to fossil collect secondary index rows that no longer
+ * match the primary data row and which are older than the longest expected transaction. These
+ * fossil rows may have occurred due to an aborted, but partially applied transaction.
  */
 public class IndexRow {
   /** Standard encoder/decoder for this class. */
-  public static final ProtobufCodec<IndexRow> CODEC =
-      CodecFactory.encoder(IndexRow.class);
+  public static final ProtobufCodec<IndexRow> CODEC = CodecFactory.encoder(IndexRow.class);
 
   /**
    * Create an index row to reference the primary data row by key.
@@ -51,9 +48,9 @@
 
   /**
    * Clock of the last time this index row was touched.
-   * <p>
-   * Invalid rows older than a certain time interval may be subject to automatic
-   * background pruning during data retrieval operations.
+   *
+   * <p>Invalid rows older than a certain time interval may be subject to automatic background
+   * pruning during data retrieval operations.
    */
   @Column(id = 1)
   protected long timestamp;
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java b/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
index 9ca1423..c43deaf 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
@@ -22,53 +22,51 @@
 import com.google.gwtorm.server.ResultSet;
 
 /** Internal base class for implementations of {@link Access}. */
-public abstract class NoSqlAccess<T, K extends Key<?>> extends
-    AbstractAccess<T, K> {
-  protected NoSqlAccess(final NoSqlSchema s) {
-  }
+public abstract class NoSqlAccess<T, K extends Key<?>> extends AbstractAccess<T, K> {
+  protected NoSqlAccess(final NoSqlSchema s) {}
 
   /**
    * Scan a range of keys from the data rows and return any matching objects.
-   * <p>
-   * All NoSQL implementations must provide their own variant of this method.
-   * <p>
-   * To fetch a single record with a scan, set {@code toKey} to the same array
-   * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
-   * should validate that the returned ResultSet contains no more than 1 row.
+   *
+   * <p>All NoSQL implementations must provide their own variant of this method.
+   *
+   * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+   * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+   * ResultSet contains no more than 1 row.
    *
    * @param fromKey key to start the scan on. This is inclusive.
    * @param toKey key to stop the scan on. This is exclusive.
    * @param limit maximum number of results to return, 0 for unlimited.
-   * @param order if true the order will be preserved, false if the result order
-   *        order can be arbitrary.
-   * @return result set for the requested range. The result set may be lazily
-   *         filled, or filled completely.
+   * @param order if true the order will be preserved, false if the result order order can be
+   *     arbitrary.
+   * @return result set for the requested range. The result set may be lazily filled, or filled
+   *     completely.
    * @throws OrmException an error occurred preventing the scan from completing.
    */
-  protected abstract ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey,
-      int limit, boolean order) throws OrmException;
+  protected abstract ResultSet<T> scanPrimaryKey(
+      byte[] fromKey, byte[] toKey, int limit, boolean order) throws OrmException;
 
   /**
    * Scan a range of keys and return any matching objects.
-   * <p>
-   * All NoSQL implementations must provide their own variant of this method.
-   * <p>
-   * To fetch a single record with a scan, set {@code toKey} to the same array
-   * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
-   * should validate that the returned ResultSet contains no more than 1 row.
+   *
+   * <p>All NoSQL implementations must provide their own variant of this method.
+   *
+   * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+   * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+   * ResultSet contains no more than 1 row.
    *
    * @param index definition of the index the scan occurs over.
    * @param fromKey key to start the scan on. This is inclusive.
    * @param toKey key to stop the scan on. This is exclusive.
    * @param limit maximum number of results to return, 0 for unlimited.
-   * @param order if true the order will be preserved, false if the result order
-   *        order can be arbitrary.
-   * @return result set for the requested range. The result set may be lazily
-   *         filled, or filled completely.
+   * @param order if true the order will be preserved, false if the result order order can be
+   *     arbitrary.
+   * @return result set for the requested range. The result set may be lazily filled, or filled
+   *     completely.
    * @throws OrmException an error occurred preventing the scan from completing.
    */
-  protected abstract ResultSet<T> scanIndex(IndexFunction<T> index,
-      byte[] fromKey, byte[] toKey, int limit, boolean order)
+  protected abstract ResultSet<T> scanIndex(
+      IndexFunction<T> index, byte[] fromKey, byte[] toKey, int limit, boolean order)
       throws OrmException;
 
   // -- These are all provided by AccessGen when it builds a subclass --
@@ -78,10 +76,9 @@
 
   /**
    * Get the indexes that support query functions.
-   * <p>
-   * This array may be a subset of the total query functions. This can occur
-   * when two or more queries can be efficiently answered by performing a range
-   * scan over the same index.
+   *
+   * <p>This array may be a subset of the total query functions. This can occur when two or more
+   * queries can be efficiently answered by performing a range scan over the same index.
    *
    * @return indexes needed to support queries.
    */
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
index 927df32..414e297 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
@@ -28,20 +28,19 @@
 
 /**
  * Base class for NoSQL typed databases.
- * <p>
- * Applications should use the database class to create instances of their
- * Schema extension interface, and thus open and connect to the data store.
- * <p>
- * Creating a new database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their database instance for the life of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
- * <p>
- * This class must be further extended by the NoSQL implementation to configure
- * the connectivity with the data store and supply the correct subclass of
- * {@link NoSqlSchema} that knows how to interact with the data store.
+ *
+ * <p>Applications should use the database class to create instances of their Schema extension
+ * interface, and thus open and connect to the data store.
+ *
+ * <p>Creating a new database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their database instance for the life of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>This class must be further extended by the NoSQL implementation to configure the connectivity
+ * with the data store and supply the correct subclass of {@link NoSqlSchema} that knows how to
+ * interact with the data store.
  *
  * @param <T> type of the application's Schema.
  * @param <S> type of the implementation's base for Schema implementations.
@@ -60,18 +59,17 @@
   /**
    * Initialize a new database and generate the implementation.
    *
-   * @param schemaBaseType class that the generated Schema implementation should
-   *        extend in order to provide data store connectivity.
-   * @param accessBaseType class that the generated Access implementations
-   *        should extend in order to provide single-relation access for each
-   *        schema instance.
-   * @param appSchema the application schema interface that must be implemented
-   *        and constructed on demand.
-   * @throws OrmException the schema cannot be created because of an annotation
-   *         error in the interface definitions.
+   * @param schemaBaseType class that the generated Schema implementation should extend in order to
+   *     provide data store connectivity.
+   * @param accessBaseType class that the generated Access implementations should extend in order to
+   *     provide single-relation access for each schema instance.
+   * @param appSchema the application schema interface that must be implemented and constructed on
+   *     demand.
+   * @throws OrmException the schema cannot be created because of an annotation error in the
+   *     interface definitions.
    */
-  protected NoSqlDatabase(final Class<S> schemaBaseType,
-      final Class<A> accessBaseType, final Class<T> appSchema)
+  protected NoSqlDatabase(
+      final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
       throws OrmException {
     schemaModel = new JavaSchemaModel(appSchema);
     final GeneratedClassLoader loader = newLoader(appSchema);
@@ -90,18 +88,24 @@
   }
 
   @SuppressWarnings("unchecked")
-  private Class<T> generate(final Class<S> schemaBaseType,
-      final Class<A> accessBaseType, final GeneratedClassLoader loader)
+  private Class<T> generate(
+      final Class<S> schemaBaseType,
+      final Class<A> accessBaseType,
+      final GeneratedClassLoader loader)
       throws OrmException {
-    return new SchemaGen(loader, schemaModel, getClass(), schemaBaseType,
-        new SchemaGen.AccessGenerator() {
-          @Override
-          public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
-              throws OrmException {
-            return new AccessGen(loader, rm, schemaBaseType, accessBaseType)
-                .create();
-          }
-        }).create();
+    return new SchemaGen(
+            loader,
+            schemaModel,
+            getClass(),
+            schemaBaseType,
+            new SchemaGen.AccessGenerator() {
+              @Override
+              public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
+                  throws OrmException {
+                return new AccessGen(loader, rm, schemaBaseType, accessBaseType).create();
+              }
+            })
+        .create();
   }
 
   private static <T> GeneratedClassLoader newLoader(final Class<T> schema) {
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java b/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
index 349f5b5..f6203d1 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
@@ -21,8 +21,7 @@
 
 /** Internal base class for implementations of {@link Schema}. */
 public abstract class NoSqlSchema extends AbstractSchema {
-  protected NoSqlSchema(final NoSqlDatabase<?, ?, ?> d) {
-  }
+  protected NoSqlSchema(final NoSqlDatabase<?, ?, ?> d) {}
 
   @Override
   public void pruneSchema(StatementExecutor e) throws OrmException {
diff --git a/src/main/java/com/google/gwtorm/nosql/RelationCodec.java b/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
index 84add28..d2585a6 100644
--- a/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
+++ b/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
@@ -19,7 +19,6 @@
 import com.google.protobuf.CodedOutputStream;
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.WireFormat;
-
 import java.io.EOFException;
 import java.io.IOException;
 
@@ -28,10 +27,9 @@
   /**
    * Pop the field number from the stream and return it.
    *
-   * @param in the stream to pop the field number from. The caller is
-   *        responsible for making sure the underlying stream had a mark set for
-   *        at least 8 bytes so the tag can be examined, reset, and later read
-   *        again during mergeFrom or decode.
+   * @param in the stream to pop the field number from. The caller is responsible for making sure
+   *     the underlying stream had a mark set for at least 8 bytes so the tag can be examined,
+   *     reset, and later read again during mergeFrom or decode.
    * @return the field number of the relation.
    * @throws IOException the stream cannot be read.
    */
@@ -71,7 +69,7 @@
   @Override
   public void mergeFrom(CodedInputStream in, T obj) throws IOException {
     boolean found = false;
-    for (;;) {
+    for (; ; ) {
       int tag = in.readTag();
       if (tag == 0) {
         if (found) {
@@ -91,8 +89,8 @@
           in.popLimit(oldLimit);
           found = true;
         } else {
-          throw new InvalidProtocolBufferException("Field " + fieldId
-              + " should be length delimited (wire type 2)");
+          throw new InvalidProtocolBufferException(
+              "Field " + fieldId + " should be length delimited (wire type 2)");
         }
       } else {
         in.skipField(tag);
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
index ecfef33..fe2b3bd 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
@@ -28,7 +28,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
 import com.google.protobuf.ByteString;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,8 +37,7 @@
 import java.util.Map.Entry;
 
 /** Base implementation for {@link Access} in a {@link GenericDatabase}. */
-public abstract class GenericAccess<T, K extends Key<?>> extends
-    NoSqlAccess<T, K> {
+public abstract class GenericAccess<T, K extends Key<?>> extends NoSqlAccess<T, K> {
   /** Maximum number of results to cache to improve updates on upsert. */
   private static final int MAX_SZ = 64;
 
@@ -54,12 +52,13 @@
   @SuppressWarnings("serial")
   protected LinkedHashMap<K, byte[]> cache() {
     if (cache == null) {
-      cache = new LinkedHashMap<K, byte[]>(8) {
-        @Override
-        protected boolean removeEldestEntry(Entry<K, byte[]> entry) {
-          return MAX_SZ <= size();
-        }
-      };
+      cache =
+          new LinkedHashMap<K, byte[]>(8) {
+            @Override
+            protected boolean removeEldestEntry(Entry<K, byte[]> entry) {
+              return MAX_SZ <= size();
+            }
+          };
     }
     return cache;
   }
@@ -70,8 +69,7 @@
    * @param key the primary key instance; must not be null.
    * @return the entity; null if no entity has this key.
    * @throws OrmException the data lookup failed.
-   * @throws OrmDuplicateKeyException more than one row was identified in the
-   *         key scan.
+   * @throws OrmDuplicateKeyException more than one row was identified in the key scan.
    */
   @Override
   public T get(K key) throws OrmException, OrmDuplicateKeyException {
@@ -87,29 +85,31 @@
 
   @Override
   public ResultSet<T> get(final Iterable<K> keys) throws OrmException {
-    final ResultSet<Row> rs = db.fetchRows(new Iterable<byte[]>() {
-      @Override
-      public Iterator<byte[]> iterator() {
-        return new Iterator<byte[]>() {
-          private final Iterator<K> i = keys.iterator();
+    final ResultSet<Row> rs =
+        db.fetchRows(
+            new Iterable<byte[]>() {
+              @Override
+              public Iterator<byte[]> iterator() {
+                return new Iterator<byte[]>() {
+                  private final Iterator<K> i = keys.iterator();
 
-          @Override
-          public boolean hasNext() {
-            return i.hasNext();
-          }
+                  @Override
+                  public boolean hasNext() {
+                    return i.hasNext();
+                  }
 
-          @Override
-          public byte[] next() {
-            return dataRowKey(i.next());
-          }
+                  @Override
+                  public byte[] next() {
+                    return dataRowKey(i.next());
+                  }
 
-          @Override
-          public void remove() {
-            throw new UnsupportedOperationException();
-          }
-        };
-      }
-    });
+                  @Override
+                  public void remove() {
+                    throw new UnsupportedOperationException();
+                  }
+                };
+              }
+            });
 
     final Iterator<Row> i = rs.iterator();
     return new AbstractResultSet<T>() {
@@ -139,15 +139,15 @@
    * @param fromKey key to start the scan on. This is inclusive.
    * @param toKey key to stop the scan on. This is exclusive.
    * @param limit maximum number of results to return.
-   * @param order if true the order will be preserved, false if the result order
-   *        order can be arbitrary.
-   * @return result set for the requested range. The result set may be lazily
-   *         filled, or filled completely.
+   * @param order if true the order will be preserved, false if the result order order can be
+   *     arbitrary.
+   * @return result set for the requested range. The result set may be lazily filled, or filled
+   *     completely.
    * @throws OrmException an error occurred preventing the scan from completing.
    */
   @Override
-  protected ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey,
-      int limit, boolean order) throws OrmException {
+  protected ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey, int limit, boolean order)
+      throws OrmException {
     IndexKeyBuilder b;
 
     b = new IndexKeyBuilder();
@@ -193,15 +193,16 @@
    * @param fromKey key to start the scan on. This is inclusive.
    * @param toKey key to stop the scan on. This is exclusive.
    * @param limit maximum number of results to return.
-   * @param order if true the order will be preserved, false if the result order
-   *        order can be arbitrary.
-   * @return result set for the requested range. The result set may be lazily
-   *         filled, or filled completely.
+   * @param order if true the order will be preserved, false if the result order order can be
+   *     arbitrary.
+   * @return result set for the requested range. The result set may be lazily filled, or filled
+   *     completely.
    * @throws OrmException an error occurred preventing the scan from completing.
    */
   @Override
-  protected ResultSet<T> scanIndex(IndexFunction<T> idx, byte[] fromKey,
-      byte[] toKey, int limit, boolean order) throws OrmException {
+  protected ResultSet<T> scanIndex(
+      IndexFunction<T> idx, byte[] fromKey, byte[] toKey, int limit, boolean order)
+      throws OrmException {
     final long now = System.currentTimeMillis();
     IndexKeyBuilder b;
 
@@ -224,7 +225,8 @@
     final ArrayList<T> res = new ArrayList<>();
     byte[] lastKey = fromKey;
 
-    SCAN: for (;;) {
+    SCAN:
+    for (; ; ) {
       List<CandidateRow> scanned;
       if (0 < limit) {
         scanned = new ArrayList<>(limit);
@@ -275,7 +277,9 @@
           // drop the row out of the index.
           //
           if (!idxRow.hasData()) {
-            db.maybeFossilCollectIndexRow(now, idxRow.getIndexKey(), //
+            db.maybeFossilCollectIndexRow(
+                now,
+                idxRow.getIndexKey(), //
                 idxRow.getIndexRow());
             continue;
           }
@@ -293,7 +297,9 @@
               break SCAN;
             }
           } else {
-            db.maybeFossilCollectIndexRow(now, idxRow.getIndexKey(), //
+            db.maybeFossilCollectIndexRow(
+                now,
+                idxRow.getIndexKey(), //
                 idxRow.getIndexRow());
           }
         }
@@ -387,15 +393,14 @@
 
   /**
    * Insert secondary index rows for an object about to be written.
-   * <p>
-   * Insert or update operations should invoke this method before the main data
-   * row is written, allowing the secondary index rows to be put into the data
-   * store before the main data row arrives. Compatible scan implementations
-   * (such as {@link #scanIndex(IndexFunction, byte[], byte[], int, boolean)}
-   * above) will ignore these rows for a short time period.
    *
-   * @param oldObj an old copy of the object; if non-null this may be used to
-   *        avoid writing unnecessary secondary index rows that already exist.
+   * <p>Insert or update operations should invoke this method before the main data row is written,
+   * allowing the secondary index rows to be put into the data store before the main data row
+   * arrives. Compatible scan implementations (such as {@link #scanIndex(IndexFunction, byte[],
+   * byte[], int, boolean)} above) will ignore these rows for a short time period.
+   *
+   * @param oldObj an old copy of the object; if non-null this may be used to avoid writing
+   *     unnecessary secondary index rows that already exist.
    * @param newObj the new (or updated) object being stored. Must not be null.
    * @throws OrmException the data store is unable to update an index row.
    */
@@ -414,11 +419,10 @@
   /**
    * Remove old secondary index rows that are no longer valid for an object.
    *
-   * @param oldObj an old copy of the object, prior to the current update taking
-   *        place. If null the method does nothing and simply returns.
-   * @param newObj the new copy of the object. Index rows that are still valid
-   *        for {@code #newObj} are left alone. If null, all index rows for
-   *        {@code oldObj} are removed.
+   * @param oldObj an old copy of the object, prior to the current update taking place. If null the
+   *     method does nothing and simply returns.
+   * @param newObj the new copy of the object. Index rows that are still valid for {@code #newObj}
+   *     are left alone. If null, all index rows for {@code oldObj} are removed.
    * @throws OrmException the data store is unable to remove an index row.
    */
   protected void pruneOldIndexes(final T oldObj, T newObj) throws OrmException {
@@ -445,8 +449,7 @@
   }
 
   @Override
-  public T atomicUpdate(K key, final AtomicUpdate<T> update)
-      throws OrmException {
+  public T atomicUpdate(K key, final AtomicUpdate<T> update) throws OrmException {
     final IndexKeyBuilder b = new IndexKeyBuilder();
     b.add(getRelationName());
     b.delimiter();
@@ -455,28 +458,30 @@
     try {
       @SuppressWarnings("unchecked")
       final T[] res = (T[]) new Object[3];
-      db.atomicUpdate(b.toByteArray(), new AtomicUpdate<byte[]>() {
-        @Override
-        public byte[] update(byte[] data) {
-          if (data != null) {
-            final T oldObj = getObjectCodec().decode(data);
-            final T newObj = getObjectCodec().decode(data);
-            res[0] = update.update(newObj);
-            res[1] = oldObj;
-            res[2] = newObj;
-            try {
-              writeNewIndexes(oldObj, newObj);
-            } catch (OrmException err) {
-              throw new IndexException(err);
-            }
-            return getObjectCodec().encodeToByteString(newObj).toByteArray();
+      db.atomicUpdate(
+          b.toByteArray(),
+          new AtomicUpdate<byte[]>() {
+            @Override
+            public byte[] update(byte[] data) {
+              if (data != null) {
+                final T oldObj = getObjectCodec().decode(data);
+                final T newObj = getObjectCodec().decode(data);
+                res[0] = update.update(newObj);
+                res[1] = oldObj;
+                res[2] = newObj;
+                try {
+                  writeNewIndexes(oldObj, newObj);
+                } catch (OrmException err) {
+                  throw new IndexException(err);
+                }
+                return getObjectCodec().encodeToByteString(newObj).toByteArray();
 
-          } else {
-            res[0] = null;
-            return null;
-          }
-        }
-      });
+              } else {
+                res[0] = null;
+                return null;
+              }
+            }
+          });
       if (res[0] != null) {
         pruneOldIndexes(res[1], res[2]);
       }
@@ -488,10 +493,10 @@
 
   /**
    * Determine if an object still matches the index row.
-   * <p>
-   * This method checks that the object's fields still match the criteria
-   * necessary for it to be part of the index defined by {@code f}. It also
-   * formats the index key and validates it is still identical to {@code exp}.
+   *
+   * <p>This method checks that the object's fields still match the criteria necessary for it to be
+   * part of the index defined by {@code f}. It also formats the index key and validates it is still
+   * identical to {@code exp}.
    *
    * @param f the function that defines the index.
    * @param obj the object instance being tested; must not be null.
@@ -504,9 +509,9 @@
 
   /**
    * Generate the row key for the object's primary data row.
-   * <p>
-   * The default implementation uses the relation name, a delimiter, and then
-   * the encoded primary key.
+   *
+   * <p>The default implementation uses the relation name, a delimiter, and then the encoded primary
+   * key.
    *
    * @param key key of the object.
    * @return the object's data row key.
@@ -521,14 +526,13 @@
 
   /**
    * Generate the row key for an object's secondary index row.
-   * <p>
-   * The default implementation uses the relation name, '.', the index name, a
-   * delimiter, the indexed fields encoded, a delimiter, and then the encoded
-   * primary key (without the relation name prefix).
-   * <p>
-   * The object's primary key is always appended onto the end of the secondary
-   * index row key to ensure that objects with the same field values still get
-   * distinct rows in the secondary index.
+   *
+   * <p>The default implementation uses the relation name, '.', the index name, a delimiter, the
+   * indexed fields encoded, a delimiter, and then the encoded primary key (without the relation
+   * name prefix).
+   *
+   * <p>The object's primary key is always appended onto the end of the secondary index row key to
+   * ensure that objects with the same field values still get distinct rows in the secondary index.
    *
    * @param idx function that describes the index.
    * @param obj the object the index record should reference.
@@ -548,9 +552,9 @@
 
   /**
    * Generate the data to store in a secondary index row for an object.
-   * <p>
-   * The default implementation of this method stores the encoded primary key,
-   * and the current system timestamp.
+   *
+   * <p>The default implementation of this method stores the encoded primary key, and the current
+   * system timestamp.
    *
    * @param obj the object the index record should reference.
    * @return the encoded secondary index row data.
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
index 7b946e2..42b6a23 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
@@ -18,68 +18,65 @@
 import com.google.gwtorm.nosql.NoSqlSchema;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.Schema;
-
 import java.util.concurrent.TimeUnit;
 
 /**
  * Base class for generic NoSQL typed databases.
- * <p>
- * The generic types provide basic NoSQL implementation assuming a handful of
- * primitive operations are available inside of the implementation's extension
- * of {@link GenericSchema}. All relations are stored within the same key space,
- * using the relation name as a prefix for the row's primary or secondary key.
- * <p>
- * Applications should use the database class to create instances of their
- * Schema extension interface, and thus open and connect to the data store.
- * <p>
- * Creating a new database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their database instance for the life of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
- * <p>
- * This class must be further extended by the NoSQL implementation to configure
- * the connectivity with the data store and supply the correct subclass of
- * {@link NoSqlSchema} that knows how to interact with the data store.
+ *
+ * <p>The generic types provide basic NoSQL implementation assuming a handful of primitive
+ * operations are available inside of the implementation's extension of {@link GenericSchema}. All
+ * relations are stored within the same key space, using the relation name as a prefix for the row's
+ * primary or secondary key.
+ *
+ * <p>Applications should use the database class to create instances of their Schema extension
+ * interface, and thus open and connect to the data store.
+ *
+ * <p>Creating a new database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their database instance for the life of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>This class must be further extended by the NoSQL implementation to configure the connectivity
+ * with the data store and supply the correct subclass of {@link NoSqlSchema} that knows how to
+ * interact with the data store.
  *
  * @param <T> type of the application's Schema.
  * @param <S> type of the implementation's base for Schema implementations.
  * @param <A> type of the implementation's base for Access implementations.
  */
 @SuppressWarnings("rawtypes")
-public abstract class GenericDatabase<T extends Schema, S extends GenericSchema, A extends GenericAccess>
+public abstract class GenericDatabase<
+        T extends Schema, S extends GenericSchema, A extends GenericAccess>
     extends NoSqlDatabase<T, S, A> {
-  private static final long DEFAULT_FOSSIL_AGE =
-      TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
+  private static final long DEFAULT_FOSSIL_AGE = TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
 
   /**
    * Initialize a new database and generate the implementation.
    *
-   * @param schemaBaseType class that the generated Schema implementation should
-   *        extend in order to provide data store connectivity.
-   * @param accessBaseType class that the generated Access implementations
-   *        should extend in order to provide single-relation access for each
-   *        schema instance.
-   * @param appSchema the application schema interface that must be implemented
-   *        and constructed on demand.
-   * @throws OrmException the schema cannot be created because of an annotation
-   *         error in the interface definitions.
+   * @param schemaBaseType class that the generated Schema implementation should extend in order to
+   *     provide data store connectivity.
+   * @param accessBaseType class that the generated Access implementations should extend in order to
+   *     provide single-relation access for each schema instance.
+   * @param appSchema the application schema interface that must be implemented and constructed on
+   *     demand.
+   * @throws OrmException the schema cannot be created because of an annotation error in the
+   *     interface definitions.
    */
-  protected GenericDatabase(final Class<S> schemaBaseType,
-      final Class<A> accessBaseType, final Class<T> appSchema)
+  protected GenericDatabase(
+      final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
       throws OrmException {
     super(schemaBaseType, accessBaseType, appSchema);
   }
 
   /**
    * Default number of milliseconds a transaction can appear to be open.
-   * <p>
-   * Secondary index rows that don't match their primary data object and that
-   * are older than this age are removed from the system during a scan.
    *
-   * @return milliseconds before considering a fossil index record is garbage
-   *         and should be pruned. By default, 5 minutes.
+   * <p>Secondary index rows that don't match their primary data object and that are older than this
+   * age are removed from the system during a scan.
+   *
+   * @return milliseconds before considering a fossil index record is garbage and should be pruned.
+   *     By default, 5 minutes.
    */
   public long getMaxFossilAge() {
     return DEFAULT_FOSSIL_AGE;
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
index 1493c1c..f983d3e 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
@@ -25,18 +25,16 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
 import com.google.gwtorm.server.Schema;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
 /**
  * Base implementation for {@link Schema} in a {@link GenericDatabase}.
- * <p>
- * NoSQL implementors must extend this class and provide implementations for the
- * abstract methods declared here. Each schema instance will wrap one thread's
- * connection to the data store. Therefore, unlike database, this class does not
- * need to be thread-safe.
+ *
+ * <p>NoSQL implementors must extend this class and provide implementations for the abstract methods
+ * declared here. Each schema instance will wrap one thread's connection to the data store.
+ * Therefore, unlike database, this class does not need to be thread-safe.
  */
 public abstract class GenericSchema extends NoSqlSchema {
   private final GenericDatabase<?, ?, ?> db;
@@ -46,8 +44,7 @@
     db = d;
   }
 
-  public void flush() {
-  }
+  public void flush() {}
 
   /** @return the database that created this schema instance. */
   public GenericDatabase<?, ?, ?> getDatabase() {
@@ -56,18 +53,17 @@
 
   /**
    * Allocate a new unique value from a pool of values.
-   * <p>
-   * This method is only required to return a unique value per invocation.
-   * Implementors may override the method to provide an implementation that
-   * returns values out of order.
-   * <p>
-   * The default implementation of this method stores a {@link CounterShard}
-   * under the row key {@code ".sequence." + poolName}, and updates it through
-   * the atomic semantics of {@link #atomicUpdate(byte[], AtomicUpdate)}. If the
-   * row does not yet exist, it is initialized and the value 1 is returned.
    *
-   * @param poolName name of the value pool to allocate from. This is typically
-   *        the name of a sequence in the schema.
+   * <p>This method is only required to return a unique value per invocation. Implementors may
+   * override the method to provide an implementation that returns values out of order.
+   *
+   * <p>The default implementation of this method stores a {@link CounterShard} under the row key
+   * {@code ".sequence." + poolName}, and updates it through the atomic semantics of {@link
+   * #atomicUpdate(byte[], AtomicUpdate)}. If the row does not yet exist, it is initialized and the
+   * value 1 is returned.
+   *
+   * @param poolName name of the value pool to allocate from. This is typically the name of a
+   *     sequence in the schema.
    * @return a new unique value.
    * @throws OrmException a unique value cannot be obtained.
    */
@@ -78,35 +74,36 @@
     b.delimiter();
     try {
       final long[] res = new long[1];
-      atomicUpdate(b.toByteArray(), new AtomicUpdate<byte[]>() {
-        @Override
-        public byte[] update(byte[] val) {
-          CounterShard ctr;
-          if (val != null) {
-            ctr = CounterShard.CODEC.decode(val);
-          } else {
-            long start = 1;
-            for (SequenceModel s : getDatabase().getSchemaModel()
-                .getSequences()) {
-              if (poolName.equals(s.getSequenceName())) {
-                start = s.getSequence().startWith();
-                if (start == 0) {
-                  start = 1;
+      atomicUpdate(
+          b.toByteArray(),
+          new AtomicUpdate<byte[]>() {
+            @Override
+            public byte[] update(byte[] val) {
+              CounterShard ctr;
+              if (val != null) {
+                ctr = CounterShard.CODEC.decode(val);
+              } else {
+                long start = 1;
+                for (SequenceModel s : getDatabase().getSchemaModel().getSequences()) {
+                  if (poolName.equals(s.getSequenceName())) {
+                    start = s.getSequence().startWith();
+                    if (start == 0) {
+                      start = 1;
+                    }
+                    break;
+                  }
                 }
-                break;
+                ctr = new CounterShard(start, Long.MAX_VALUE);
               }
+
+              if (ctr.isEmpty()) {
+                throw new NoMoreValues();
+              }
+
+              res[0] = ctr.next();
+              return CounterShard.CODEC.encodeToByteString(ctr).toByteArray();
             }
-            ctr = new CounterShard(start, Long.MAX_VALUE);
-          }
-
-          if (ctr.isEmpty()) {
-            throw new NoMoreValues();
-          }
-
-          res[0] = ctr.next();
-          return CounterShard.CODEC.encodeToByteString(ctr).toByteArray();
-        }
-      });
+          });
       return res[0];
     } catch (NoMoreValues err) {
       throw new OrmException("Counter '" + poolName + "' out of values");
@@ -115,21 +112,18 @@
 
   /**
    * Fetch one row's data.
-   * <p>
-   * The default implementation of this method creates a pair of keys and passes
-   * them to {@link #scan(byte[], byte[], int, boolean)}. The {@code fromKey} is
-   * the supplied {@code key}, while the {@code toKey} has '\0' appended onto
-   * {@code key}. If more than one row matches in that range, the method throws
-   * an exception.
+   *
+   * <p>The default implementation of this method creates a pair of keys and passes them to {@link
+   * #scan(byte[], byte[], int, boolean)}. The {@code fromKey} is the supplied {@code key}, while
+   * the {@code toKey} has '\0' appended onto {@code key}. If more than one row matches in that
+   * range, the method throws an exception.
    *
    * @param key key of the row to fetch and return.
    * @return the data stored under {@code key}; null if no row exists.
-   * @throws OrmDuplicateKeyException more than one row was identified in the
-   *         key scan.
+   * @throws OrmDuplicateKeyException more than one row was identified in the key scan.
    * @throws OrmException the data store cannot process the request.
    */
-  public byte[] fetchRow(byte[] key) throws OrmDuplicateKeyException,
-      OrmException {
+  public byte[] fetchRow(byte[] key) throws OrmDuplicateKeyException, OrmException {
     final byte[] fromKey = key;
     final byte[] toKey = new byte[key.length + 1];
     System.arraycopy(key, 0, toKey, 0, key.length);
@@ -153,9 +147,9 @@
 
   /**
    * Fetch multiple rows at once.
-   * <p>
-   * The default implementation of this method is a simple iteration over each
-   * key and executes a sequential fetch with {@link #fetchRow(byte[])}.
+   *
+   * <p>The default implementation of this method is a simple iteration over each key and executes a
+   * sequential fetch with {@link #fetchRow(byte[])}.
    *
    * @param keys keys to fetch and return.
    * @return iteration over the rows that exist and appear in {@code keys}.
@@ -174,54 +168,55 @@
 
   /**
    * Scan a range of keys and return any matching objects.
-   * <p>
-   * To fetch a single record with a scan, set {@code toKey} to the same array
-   * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
-   * should validate that the returned ResultSet contains no more than 1 row.
-   * <p>
-   * The resulting iteration does not support remove.
-   * <p>
-   * Each iteration element is a map entry, describing the row key and the row
-   * value. The map entry's value cannot be changed.
+   *
+   * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+   * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+   * ResultSet contains no more than 1 row.
+   *
+   * <p>The resulting iteration does not support remove.
+   *
+   * <p>Each iteration element is a map entry, describing the row key and the row value. The map
+   * entry's value cannot be changed.
    *
    * @param fromKey key to start the scan on. This is inclusive.
    * @param toKey key to stop the scan on. This is exclusive.
    * @param limit maximum number of results to return.
-   * @param order if true the order will be preserved, false if the result order
-   *        order can be arbitrary.
-   * @return result iteration for the requested range. The result set may be
-   *         lazily filled, or filled completely.
+   * @param order if true the order will be preserved, false if the result order order can be
+   *     arbitrary.
+   * @return result iteration for the requested range. The result set may be lazily filled, or
+   *     filled completely.
    * @throws OrmException an error occurred preventing the scan from completing.
    */
-  public abstract ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit,
-      boolean order) throws OrmException;
+  public abstract ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit, boolean order)
+      throws OrmException;
 
   /**
    * Atomically insert one row, failing if the row already exists.
-   * <p>
-   * The default implementation of this method relies upon the atomic nature of
-   * the {@link #atomicUpdate(byte[], AtomicUpdate)} primitive to test for the
-   * row's existence, and create the row only if it is not found.
+   *
+   * <p>The default implementation of this method relies upon the atomic nature of the {@link
+   * #atomicUpdate(byte[], AtomicUpdate)} primitive to test for the row's existence, and create the
+   * row only if it is not found.
    *
    * @param key key of the new row to insert.
    * @param newData data of the new row.
-   * @throws OrmDuplicateKeyException another row already exists with the
-   *         specified key.
-   * @throws OrmException the data store cannot process the request right now,
-   *         for example due to a network connectivity problem.
+   * @throws OrmDuplicateKeyException another row already exists with the specified key.
+   * @throws OrmException the data store cannot process the request right now, for example due to a
+   *     network connectivity problem.
    */
   public void insert(byte[] key, final byte[] newData)
       throws OrmDuplicateKeyException, OrmException {
     try {
-      atomicUpdate(key, new AtomicUpdate<byte[]>() {
-        @Override
-        public byte[] update(byte[] oldData) {
-          if (oldData != null) {
-            throw new KeyExists();
-          }
-          return newData;
-        }
-      });
+      atomicUpdate(
+          key,
+          new AtomicUpdate<byte[]>() {
+            @Override
+            public byte[] update(byte[] oldData) {
+              if (oldData != null) {
+                throw new KeyExists();
+              }
+              return newData;
+            }
+          });
     } catch (KeyExists err) {
       throw new OrmDuplicateKeyException("Duplicate key");
     }
@@ -229,22 +224,22 @@
 
   /**
    * Update a single row, inserting it if it does not exist.
-   * <p>
-   * Unlike insert, this method always succeeds.
+   *
+   * <p>Unlike insert, this method always succeeds.
    *
    * @param key key of the row to update, or insert if missing.
    * @param data data to store at this row.
-   * @throws OrmException the data store cannot process the request, for example
-   *         due to a network connectivity problem.
+   * @throws OrmException the data store cannot process the request, for example due to a network
+   *     connectivity problem.
    */
   public abstract void upsert(byte[] key, byte[] data) throws OrmException;
 
   /**
    * Delete the row stored under the given key.
-   * <p>
-   * If the row does not exist, this method must complete successfully anyway.
-   * The intent of the caller is to ensure the row does not exist when the
-   * method completes, and a row that did not exist satisfies that intent.
+   *
+   * <p>If the row does not exist, this method must complete successfully anyway. The intent of the
+   * caller is to ensure the row does not exist when the method completes, and a row that did not
+   * exist satisfies that intent.
    *
    * @param key the key to delete.
    * @throws OrmException the data store cannot perform the removal.
@@ -253,10 +248,10 @@
 
   /**
    * Atomically read and update a single row.
-   * <p>
-   * Unlike schema's atomicUpdate() method, this method must handle missing
-   * rows. Implementations must be logically equivalent to the following, but
-   * performed atomically within the scope of the single row key:
+   *
+   * <p>Unlike schema's atomicUpdate() method, this method must handle missing rows. Implementations
+   * must be logically equivalent to the following, but performed atomically within the scope of the
+   * single row key:
    *
    * <pre>
    * byte[] oldData = get(key);
@@ -268,32 +263,29 @@
    * }
    * return data;
    * </pre>
-   * <p>
-   * Secondary index row updates are assumed to never be part of the atomic
-   * update transaction. This is an intentional design decision to fit with many
-   * NoSQL product's limitations to support only single-row atomic updates.
-   * <p>
-   * The {@code update} method may be invoked multiple times before the
-   * operation is considered successful. This permits an implementation to
-   * perform an opportunistic update attempt, and retry the update if the same
-   * row was modified by another concurrent worker.
+   *
+   * <p>Secondary index row updates are assumed to never be part of the atomic update transaction.
+   * This is an intentional design decision to fit with many NoSQL product's limitations to support
+   * only single-row atomic updates.
+   *
+   * <p>The {@code update} method may be invoked multiple times before the operation is considered
+   * successful. This permits an implementation to perform an opportunistic update attempt, and
+   * retry the update if the same row was modified by another concurrent worker.
    *
    * @param key the row key to read, update and return.
-   * @param update action to perform on the row's data element. The action may
-   *        be passed null if the row doesn't exist.
+   * @param update action to perform on the row's data element. The action may be passed null if the
+   *     row doesn't exist.
    * @throws OrmException the database cannot perform the update.
    */
-  public abstract void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update)
-      throws OrmException;
+  public abstract void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update) throws OrmException;
 
   /**
    * Check (and delete) an index row if its a fossil.
-   * <p>
-   * As index rows are written ahead of the main data row being written out,
-   * scans sometimes see an index row that does not match the data row. These
-   * are ignored for a short period ({@link GenericDatabase#getMaxFossilAge()})
-   * to allow the primary data row to eventually get written out. If however the
-   * writer never finished the update, these index rows are stale and need to be
+   *
+   * <p>As index rows are written ahead of the main data row being written out, scans sometimes see
+   * an index row that does not match the data row. These are ignored for a short period ({@link
+   * GenericDatabase#getMaxFossilAge()}) to allow the primary data row to eventually get written
+   * out. If however the writer never finished the update, these index rows are stale and need to be
    * pruned. Any index row older than the fossil age is removed by this method.
    *
    * @param now timestamp when the current scan started.
@@ -308,13 +300,12 @@
 
   /**
    * Delete the given fossil index row.
-   * <p>
-   * This method is logically the same as {@link #delete(byte[])}, but its
-   * separated out to permit asynchronous delivery of the delete events since
-   * these are arriving during an index scan and are less time-critical than
-   * other delete operations.
-   * <p>
-   * The default implementation of this method calls {@link #delete(byte[])}.
+   *
+   * <p>This method is logically the same as {@link #delete(byte[])}, but its separated out to
+   * permit asynchronous delivery of the delete events since these are arriving during an index scan
+   * and are less time-critical than other delete operations.
+   *
+   * <p>The default implementation of this method calls {@link #delete(byte[])}.
    *
    * @param key index key to remove.
    * @param row the index row data.
@@ -328,10 +319,8 @@
   }
 
   @SuppressWarnings("serial")
-  private static class KeyExists extends RuntimeException {
-  }
+  private static class KeyExists extends RuntimeException {}
 
   @SuppressWarnings("serial")
-  private static class NoMoreValues extends RuntimeException {
-  }
+  private static class NoMoreValues extends RuntimeException {}
 }
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
index 1799865..66a96cf 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
@@ -16,7 +16,6 @@
 
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.Schema;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
@@ -32,19 +31,18 @@
 
 /**
  * Tiny NoSQL database stored on the local filesystem.
- * <p>
- * This is a simple NoSQL implementation intended only for development/debugging
- * purposes. It is not capable of supporting any production traffic. Large data
- * sets will cause the implementation to fall over, as all records are stored in
- * memory.
- * <p>
- * Although some effort is made to persist data to disk during updates, and
- * reload it during construction, durability of stored data is not guaranteed.
+ *
+ * <p>This is a simple NoSQL implementation intended only for development/debugging purposes. It is
+ * not capable of supporting any production traffic. Large data sets will cause the implementation
+ * to fall over, as all records are stored in memory.
+ *
+ * <p>Although some effort is made to persist data to disk during updates, and reload it during
+ * construction, durability of stored data is not guaranteed.
  *
  * @param <T> type of the application schema.
  */
-public class FileDatabase<T extends Schema> extends
-    TreeMapDatabase<T, FileDatabase.LoggingSchema, FileDatabase.LoggingAccess> {
+public class FileDatabase<T extends Schema>
+    extends TreeMapDatabase<T, FileDatabase.LoggingSchema, FileDatabase.LoggingAccess> {
   private static final int MAX_LOG_SIZE = 50000;
 
   private final File heapFile;
@@ -56,14 +54,13 @@
   /**
    * Create the database and implement the application's schema interface.
    *
-   * @param path path prefix for the data files. File suffixes will be added to
-   *        this name to name the database's various files.
+   * @param path path prefix for the data files. File suffixes will be added to this name to name
+   *     the database's various files.
    * @param schema the application schema this database will open.
-   * @throws OrmException the schema cannot be queried, or the existing database
-   *         files are not readable.
+   * @throws OrmException the schema cannot be queried, or the existing database files are not
+   *     readable.
    */
-  public FileDatabase(final File path, final Class<T> schema)
-      throws OrmException {
+  public FileDatabase(final File path, final Class<T> schema) throws OrmException {
     super(LoggingSchema.class, LoggingAccess.class, schema);
 
     heapFile = new File(path.getAbsolutePath() + ".nosql_db");
@@ -105,9 +102,10 @@
 
       final DataInputStream in;
       try {
-        in = new DataInputStream( //
-            new BufferedInputStream( //
-                new FileInputStream(heapFile)));
+        in =
+            new DataInputStream( //
+                new BufferedInputStream( //
+                    new FileInputStream(heapFile)));
       } catch (FileNotFoundException e) {
         return;
       }
@@ -136,36 +134,39 @@
 
       final DataInputStream in;
       try {
-        in = new DataInputStream( //
-            new BufferedInputStream( //
-                new FileInputStream(logFile)));
+        in =
+            new DataInputStream( //
+                new BufferedInputStream( //
+                    new FileInputStream(logFile)));
       } catch (FileNotFoundException e) {
         return;
       }
 
       try {
-        for (;; logRecords++) {
+        for (; ; logRecords++) {
           final int op = in.read();
           if (op < 0) {
             break;
           }
 
           switch (op) {
-            case 0: {
-              final byte[] key = new byte[in.readInt()];
-              in.readFully(key);
-              table.remove(key);
-              break;
-            }
+            case 0:
+              {
+                final byte[] key = new byte[in.readInt()];
+                in.readFully(key);
+                table.remove(key);
+                break;
+              }
 
-            case 1: {
-              final byte[] key = new byte[in.readInt()];
-              final byte[] val = new byte[in.readInt()];
-              in.readFully(key);
-              in.readFully(val);
-              table.put(key, val);
-              break;
-            }
+            case 1:
+              {
+                final byte[] key = new byte[in.readInt()];
+                final byte[] val = new byte[in.readInt()];
+                in.readFully(key);
+                in.readFully(val);
+                table.put(key, val);
+                break;
+              }
 
             default:
               throw new OrmException("Unknown log command " + op);
@@ -220,9 +221,10 @@
       final File tmp = newTempFile();
       boolean ok = false;
       try {
-        DataOutputStream out = new DataOutputStream( //
-            new BufferedOutputStream( //
-                new FileOutputStream(tmp)));
+        DataOutputStream out =
+            new DataOutputStream( //
+                new BufferedOutputStream( //
+                    new FileOutputStream(tmp)));
         try {
           out.writeInt(table.size());
           for (Map.Entry<byte[], byte[]> ent : table.entrySet()) {
@@ -270,7 +272,7 @@
     return File.createTempFile("heap_", "_db", heapFile.getParentFile());
   }
 
-  public static abstract class LoggingSchema extends TreeMapSchema {
+  public abstract static class LoggingSchema extends TreeMapSchema {
     private final FileDatabase<?> db;
 
     protected LoggingSchema(FileDatabase<?> db) {
@@ -302,7 +304,7 @@
   }
 
   @SuppressWarnings("rawtypes")
-  public static abstract class LoggingAccess extends TreeMapAccess {
+  public abstract static class LoggingAccess extends TreeMapAccess {
     protected LoggingAccess(LoggingSchema s) {
       super(s);
     }
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java b/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
index 33aded6..4ef4533 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
@@ -19,8 +19,7 @@
 class HeapKeyComparator implements Comparator<byte[]> {
   static final HeapKeyComparator INSTANCE = new HeapKeyComparator();
 
-  private HeapKeyComparator() {
-  }
+  private HeapKeyComparator() {}
 
   @Override
   public int compare(byte[] a, byte[] b) {
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
index 5c8aaab..47e5bdc 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
@@ -19,18 +19,17 @@
 
 /**
  * Toy in-memory implementation of a NoSQL database.
- * <p>
- * Implements a simple NoSQL database with a standard {@link java.util.TreeMap}
- * held inside of this JVM process. All operations occur on the TreeMap, with no
- * durability across database restarts. Therefore this implementation is only
- * suitable for simple tests.
+ *
+ * <p>Implements a simple NoSQL database with a standard {@link java.util.TreeMap} held inside of
+ * this JVM process. All operations occur on the TreeMap, with no durability across database
+ * restarts. Therefore this implementation is only suitable for simple tests.
  *
  * @param <T> type of the application schema.
  * @see FileDatabase
  */
 @SuppressWarnings("rawtypes")
-public class MemoryDatabase<T extends Schema> extends
-    TreeMapDatabase<T, TreeMapSchema, TreeMapAccess> {
+public class MemoryDatabase<T extends Schema>
+    extends TreeMapDatabase<T, TreeMapSchema, TreeMapAccess> {
 
   /**
    * Create the database and implement the application's schema interface.
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
index aa58c1e..6f82d12 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
@@ -19,8 +19,7 @@
 import com.google.gwtorm.server.Access;
 
 /** Base implementation for {@link Access} in a {@link TreeMapDatabase}. */
-public abstract class TreeMapAccess<T, K extends Key<?>> extends
-    GenericAccess<T, K> {
+public abstract class TreeMapAccess<T, K extends Key<?>> extends GenericAccess<T, K> {
   protected TreeMapAccess(final TreeMapSchema s) {
     super(s);
   }
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
index fca8470..e36da61 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
@@ -19,7 +19,6 @@
 import com.google.gwtorm.server.Schema;
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.UnknownFieldSet;
-
 import java.io.PrintWriter;
 import java.util.Map;
 import java.util.SortedMap;
@@ -29,11 +28,10 @@
 
 /**
  * Toy in-memory implementation of a NoSQL database.
- * <p>
- * Implements a simple NoSQL database with a standard {@link java.util.TreeMap}
- * held inside of this JVM process. All operations occur on the TreeMap, with no
- * durability across database restarts. Therefore this implementation is only
- * suitable for simple tests.
+ *
+ * <p>Implements a simple NoSQL database with a standard {@link java.util.TreeMap} held inside of
+ * this JVM process. All operations occur on the TreeMap, with no durability across database
+ * restarts. Therefore this implementation is only suitable for simple tests.
  *
  * @param <T> type of the application schema.
  */
@@ -50,18 +48,17 @@
   /**
    * Initialize a new database and generate the implementation.
    *
-   * @param schemaBaseType class that the generated Schema implementation should
-   *        extend in order to provide data store connectivity.
-   * @param accessBaseType class that the generated Access implementations
-   *        should extend in order to provide single-relation access for each
-   *        schema instance.
-   * @param appSchema the application schema interface that must be implemented
-   *        and constructed on demand.
-   * @throws OrmException the schema cannot be created because of an annotation
-   *         error in the interface definitions.
+   * @param schemaBaseType class that the generated Schema implementation should extend in order to
+   *     provide data store connectivity.
+   * @param accessBaseType class that the generated Access implementations should extend in order to
+   *     provide single-relation access for each schema instance.
+   * @param appSchema the application schema interface that must be implemented and constructed on
+   *     demand.
+   * @throws OrmException the schema cannot be created because of an annotation error in the
+   *     interface definitions.
    */
-  protected TreeMapDatabase(final Class<S> schemaBaseType,
-      final Class<A> accessBaseType, final Class<T> appSchema)
+  protected TreeMapDatabase(
+      final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
       throws OrmException {
     super(schemaBaseType, accessBaseType, appSchema);
 
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
index ed73f2d..4d47d75 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
@@ -21,12 +21,11 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
 import com.google.gwtorm.server.Schema;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 /** Base implementation for {@link Schema} in a {@link TreeMapDatabase}. */
 public abstract class TreeMapSchema extends GenericSchema {
@@ -48,8 +47,7 @@
   }
 
   @Override
-  public ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit,
-      boolean order) {
+  public ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit, boolean order) {
     db.lock.lock();
     try {
       final List<Row> res = new ArrayList<>();
@@ -91,8 +89,7 @@
   }
 
   @Override
-  public void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update)
-      throws OrmException {
+  public void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update) throws OrmException {
     db.lock.lock();
     try {
       final byte[] oldData = fetchRow(key);
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
index 070ce78..cedfc65 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
@@ -17,7 +17,6 @@
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.server.GeneratedClassLoader;
 import com.google.gwtorm.server.OrmException;
-
 import java.util.Collections;
 import java.util.Map;
 import java.util.WeakHashMap;
@@ -29,18 +28,17 @@
 
   /**
    * Create an implementation to encode/decode an arbitrary object.
-   * <p>
-   * The object must use the {@link Column} annotations to denote the fields
-   * that should be encoded or decoded.
+   *
+   * <p>The object must use the {@link Column} annotations to denote the fields that should be
+   * encoded or decoded.
    *
    * @param <T> type of the object to be supported.
    * @param type the object type.
    * @return an encoder for this object type.
-   * @throws IllegalArgumentException the object's fields aren't declared
-   *         properly. This is a programming error that cannot be recovered.
+   * @throws IllegalArgumentException the object's fields aren't declared properly. This is a
+   *     programming error that cannot be recovered.
    */
-  public static <T> ProtobufCodec<T> encoder(Class<T> type)
-      throws IllegalStateException {
+  public static <T> ProtobufCodec<T> encoder(Class<T> type) throws IllegalStateException {
     final GeneratedClassLoader loader = newLoader(type);
     ProtobufCodec<T> encoder = null;
     String cacheName = encoders.get(type);
@@ -52,8 +50,8 @@
       try {
         encoder = gen.create();
       } catch (OrmException e) {
-        throw new IllegalArgumentException("Class " + type.getName()
-            + " cannot be supported on protobuf", e);
+        throw new IllegalArgumentException(
+            "Class " + type.getName() + " cannot be supported on protobuf", e);
       }
       encoders.put(type, encoder.getClass().getName());
     }
@@ -77,6 +75,5 @@
     }
   }
 
-  private CodecFactory() {
-  }
+  private CodecFactory() {}
 }
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
index 1eb6fde..a726ad6 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
@@ -25,13 +25,6 @@
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import com.google.protobuf.WireFormat;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -42,22 +35,23 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.TreeSet;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 /** Generates {@link ProtobufCodec} implementations. */
 class CodecGen<T> implements Opcodes {
-  private static final Type illegalStateException =
-      Type.getType(IllegalStateException.class);
-  private static final Type collection =
-      Type.getType(java.util.Collection.class);
+  private static final Type illegalStateException = Type.getType(IllegalStateException.class);
+  private static final Type collection = Type.getType(java.util.Collection.class);
   private static final Type iterator = Type.getType(java.util.Iterator.class);
   private static final Type string = Type.getType(String.class);
   private static final Type enumType = Type.getType(Enum.class);
   private static final Type byteString = Type.getType(ByteString.class);
   private static final Type object = Type.getType(Object.class);
-  private static final Type codedOutputStream =
-      Type.getType(CodedOutputStream.class);
-  private static final Type codedInputStream =
-      Type.getType(CodedInputStream.class);
+  private static final Type codedOutputStream = Type.getType(CodedOutputStream.class);
+  private static final Type codedInputStream = Type.getType(CodedInputStream.class);
   private final GeneratedClassLoader classLoader;
   private final Class<T> pojo;
   private final Type pojoType;
@@ -122,21 +116,21 @@
       in = in.getSuperclass();
     }
     if (col.isEmpty()) {
-      throw new OrmException(
-          "Cannot create new encoder, no @Column fields found");
+      throw new OrmException("Cannot create new encoder, no @Column fields found");
     }
     return sort(col);
   }
 
-  private static JavaColumnModel[] sort(
-      final Collection<? extends ColumnModel> col) {
+  private static JavaColumnModel[] sort(final Collection<? extends ColumnModel> col) {
     JavaColumnModel[] out = col.toArray(new JavaColumnModel[col.size()]);
-    Arrays.sort(out, new Comparator<JavaColumnModel>() {
-      @Override
-      public int compare(JavaColumnModel o1, JavaColumnModel o2) {
-        return o1.getColumnID() - o2.getColumnID();
-      }
-    });
+    Arrays.sort(
+        out,
+        new Comparator<JavaColumnModel>() {
+          @Override
+          public int compare(JavaColumnModel o1, JavaColumnModel o2) {
+            return o1.getColumnID() - o2.getColumnID();
+          }
+        });
     return out;
   }
 
@@ -151,30 +145,46 @@
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
-        superTypeName, new String[] {});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        superTypeName,
+        new String[] {});
   }
 
   private void implementCodecFields() {
     for (NestedCodec other : nestedCodecs.values()) {
-      cw.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, other.field,
-          other.codecType.getDescriptor(), null, null).visitEnd();
+      cw.visitField(
+              ACC_PRIVATE | ACC_STATIC | ACC_FINAL,
+              other.field,
+              other.codecType.getDescriptor(),
+              null,
+              null)
+          .visitEnd();
     }
   }
 
   private void implementStaticInit() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", Type
-            .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_STATIC,
+            "<clinit>",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}),
+            null,
+            null);
     mv.visitCode();
 
     for (NestedCodec other : nestedCodecs.values()) {
       mv.visitTypeInsn(NEW, other.codecType.getInternalName());
       mv.visitInsn(DUP);
-      mv.visitMethodInsn(INVOKESPECIAL, other.codecType.getInternalName(),
-          "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
-      mv.visitFieldInsn(PUTSTATIC, implTypeName, other.field, other.codecType
-          .getDescriptor());
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          other.codecType.getInternalName(),
+          "<init>",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitFieldInsn(PUTSTATIC, implTypeName, other.field, other.codecType.getDescriptor());
     }
 
     mv.visitInsn(RETURN);
@@ -184,10 +194,8 @@
 
   private void implementConstructor() {
     final String consName = "<init>";
-    final String consDesc =
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
-    final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+    final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
+    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
@@ -200,13 +208,20 @@
 
   private void implementNewInstanceObject() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "newInstance", Type.getMethodDescriptor(
-            object, new Type[] {}), null, new String[] {});
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "newInstance",
+            Type.getMethodDescriptor(object, new Type[] {}),
+            null,
+            new String[] {});
     mv.visitCode();
 
     mv.visitTypeInsn(NEW, pojoType.getInternalName());
     mv.visitInsn(DUP);
-    mv.visitMethodInsn(INVOKESPECIAL, pojoType.getInternalName(), "<init>",
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        pojoType.getInternalName(),
+        "<init>",
         Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
 
     mv.visitInsn(ARETURN);
@@ -216,13 +231,20 @@
 
   private void implementNewInstanceSelf() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "newInstance", Type.getMethodDescriptor(
-            pojoType, new Type[] {}), null, new String[] {});
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "newInstance",
+            Type.getMethodDescriptor(pojoType, new Type[] {}),
+            null,
+            new String[] {});
     mv.visitCode();
 
     mv.visitTypeInsn(NEW, pojoType.getInternalName());
     mv.visitInsn(DUP);
-    mv.visitMethodInsn(INVOKESPECIAL, pojoType.getInternalName(), "<init>",
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        pojoType.getInternalName(),
+        "<init>",
         Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
 
     mv.visitInsn(ARETURN);
@@ -232,8 +254,12 @@
 
   private void implementSizeofObject() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "sizeof", Type.getMethodDescriptor(
-            Type.INT_TYPE, new Type[] {object}), null, new String[] {});
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "sizeof",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {object}),
+            null,
+            new String[] {});
     mv.visitCode();
     final SizeofCGS cgs = new SizeofCGS(mv);
     cgs.sizeVar = cgs.newLocal();
@@ -242,8 +268,11 @@
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, 1);
     mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
-    mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "sizeof", Type
-        .getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        implTypeName,
+        "sizeof",
+        Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}));
 
     mv.visitInsn(IRETURN);
     mv.visitMaxs(-1, -1);
@@ -252,8 +281,12 @@
 
   private void implementSizeofSelf() throws OrmException {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "sizeof", Type.getMethodDescriptor(
-            Type.INT_TYPE, new Type[] {pojoType}), null, new String[] {});
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "sizeof",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}),
+            null,
+            new String[] {});
     mv.visitCode();
     final SizeofCGS cgs = new SizeofCGS(mv);
     cgs.sizeVar = cgs.newLocal();
@@ -269,8 +302,9 @@
     mv.visitEnd();
   }
 
-  private void sizeofMessage(final JavaColumnModel[] myFields,
-      final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
+  private void sizeofMessage(
+      final JavaColumnModel[] myFields, final MethodVisitor mv, final SizeofCGS cgs)
+      throws OrmException {
     for (final JavaColumnModel f : myFields) {
       if (f.isNested()) {
         final NestedCodec n = nestedFor(f);
@@ -280,12 +314,13 @@
         mv.visitJumpInsn(IFNULL, end);
 
         final int msgSizeVar = cgs.newLocal();
-        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-            .getDescriptor());
+        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
         cgs.pushFieldValue();
-        mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-            "sizeof", Type.getMethodDescriptor(Type.INT_TYPE,
-                new Type[] {n.pojoType}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            n.codecType.getInternalName(),
+            "sizeof",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {n.pojoType}));
         mv.visitVarInsn(ISTORE, msgSizeVar);
 
         cgs.preinc();
@@ -336,41 +371,42 @@
     return n;
   }
 
-  private void sizeofCollection(final JavaColumnModel f,
-      final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
+  private void sizeofCollection(
+      final JavaColumnModel f, final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
     final int itr = cgs.newLocal();
     final int val = cgs.newLocal();
     final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
     final Type valType = Type.getType(valClazz);
     final JavaColumnModel col = collectionColumn(f, valClazz);
-    final SizeofCGS ng = new SizeofCGS(mv) {
-      {
-        sizeVar = cgs.sizeVar;
-        setEntityType(valType);
-      }
+    final SizeofCGS ng =
+        new SizeofCGS(mv) {
+          {
+            sizeVar = cgs.sizeVar;
+            setEntityType(valType);
+          }
 
-      @Override
-      public void pushEntity() {
-        mv.visitVarInsn(ALOAD, val);
-      }
+          @Override
+          public void pushEntity() {
+            mv.visitVarInsn(ALOAD, val);
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        if (c != col) {
-          super.appendGetField(c);
-        }
-      }
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            if (c != col) {
+              super.appendGetField(c);
+            }
+          }
 
-      @Override
-      public int newLocal() {
-        return cgs.newLocal();
-      }
+          @Override
+          public int newLocal() {
+            return cgs.newLocal();
+          }
 
-      @Override
-      public void freeLocal(int index) {
-        cgs.freeLocal(index);
-      }
-    };
+          @Override
+          public void freeLocal(int index) {
+            cgs.freeLocal(index);
+          }
+        };
 
     final Label end = new Label();
     cgs.setFieldReference(f);
@@ -379,19 +415,28 @@
 
     cgs.setFieldReference(f);
     cgs.pushFieldValue();
-    mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
-        "iterator", Type.getMethodDescriptor(iterator, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        collection.getInternalName(),
+        "iterator",
+        Type.getMethodDescriptor(iterator, new Type[] {}));
     mv.visitVarInsn(ASTORE, itr);
 
     final Label doloop = new Label();
     mv.visitLabel(doloop);
     mv.visitVarInsn(ALOAD, itr);
-    mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "hasNext",
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        iterator.getInternalName(),
+        "hasNext",
         Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
     mv.visitJumpInsn(IFEQ, end);
 
     mv.visitVarInsn(ALOAD, itr);
-    mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "next",
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        iterator.getInternalName(),
+        "next",
         Type.getMethodDescriptor(object, new Type[] {}));
     mv.visitTypeInsn(CHECKCAST, valType.getInternalName());
     mv.visitVarInsn(ASTORE, val);
@@ -404,8 +449,8 @@
     cgs.freeLocal(val);
   }
 
-  private JavaColumnModel collectionColumn(final JavaColumnModel f,
-      final Class<?> valClazz) throws OrmException {
+  private JavaColumnModel collectionColumn(final JavaColumnModel f, final Class<?> valClazz)
+      throws OrmException {
     return new JavaColumnModel( //
         f.getField(), //
         f.getPathToFieldName(), //
@@ -413,8 +458,8 @@
         valClazz);
   }
 
-  private void sizeofScalar(final MethodVisitor mv, final SizeofCGS cgs,
-      final JavaColumnModel f) throws OrmException {
+  private void sizeofScalar(final MethodVisitor mv, final SizeofCGS cgs, final JavaColumnModel f)
+      throws OrmException {
     cgs.setFieldReference(f);
 
     switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -463,70 +508,82 @@
         break;
 
       case Type.ARRAY:
-      case Type.OBJECT: {
-        final Label end = new Label();
-        cgs.pushFieldValue();
-        mv.visitJumpInsn(IFNULL, end);
-
-        if (f.getPrimitiveType() == byte[].class) {
-          cgs.preinc();
-          cgs.push(f.getColumnID());
-          cgs.doinc("computeTagSize", Type.INT_TYPE);
-
-          cgs.preinc();
+      case Type.OBJECT:
+        {
+          final Label end = new Label();
           cgs.pushFieldValue();
-          mv.visitInsn(ARRAYLENGTH);
-          cgs.doinc("computeRawVarint32Size", Type.INT_TYPE);
+          mv.visitJumpInsn(IFNULL, end);
 
-          cgs.preinc();
-          cgs.pushFieldValue();
-          mv.visitInsn(ARRAYLENGTH);
-          cgs.doinc();
+          if (f.getPrimitiveType() == byte[].class) {
+            cgs.preinc();
+            cgs.push(f.getColumnID());
+            cgs.doinc("computeTagSize", Type.INT_TYPE);
 
-        } else if (f.getPrimitiveType() == String.class) {
-          cgs.preinc();
-          cgs.push(f.getColumnID());
-          cgs.pushFieldValue();
-          cgs.doinc("computeStringSize", Type.INT_TYPE, string);
+            cgs.preinc();
+            cgs.pushFieldValue();
+            mv.visitInsn(ARRAYLENGTH);
+            cgs.doinc("computeRawVarint32Size", Type.INT_TYPE);
 
-        } else if (f.getPrimitiveType() == java.sql.Timestamp.class
-            || f.getPrimitiveType() == java.util.Date.class
-            || f.getPrimitiveType() == java.sql.Date.class) {
-          cgs.preinc();
-          cgs.push(f.getColumnID());
-          cgs.pushFieldValue();
-          String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
-          mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
-              .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
-          cgs.doinc("computeFixed64Size", Type.INT_TYPE, Type.LONG_TYPE);
+            cgs.preinc();
+            cgs.pushFieldValue();
+            mv.visitInsn(ARRAYLENGTH);
+            cgs.doinc();
 
-        } else if (f.getPrimitiveType().isEnum()) {
-          cgs.preinc();
-          cgs.push(f.getColumnID());
-          cgs.pushFieldValue();
-          mv.visitMethodInsn(INVOKEVIRTUAL, enumType.getInternalName(),
-              "ordinal", //
-              Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
-          cgs.doinc("computeEnumSize", Type.INT_TYPE, Type.INT_TYPE);
+          } else if (f.getPrimitiveType() == String.class) {
+            cgs.preinc();
+            cgs.push(f.getColumnID());
+            cgs.pushFieldValue();
+            cgs.doinc("computeStringSize", Type.INT_TYPE, string);
 
-        } else {
-          throw new OrmException("Type " + f.getPrimitiveType()
-              + " not supported for field " + f.getPathToFieldName());
+          } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+              || f.getPrimitiveType() == java.util.Date.class
+              || f.getPrimitiveType() == java.sql.Date.class) {
+            cgs.preinc();
+            cgs.push(f.getColumnID());
+            cgs.pushFieldValue();
+            String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                tsType,
+                "getTime",
+                Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+            cgs.doinc("computeFixed64Size", Type.INT_TYPE, Type.LONG_TYPE);
+
+          } else if (f.getPrimitiveType().isEnum()) {
+            cgs.preinc();
+            cgs.push(f.getColumnID());
+            cgs.pushFieldValue();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                enumType.getInternalName(),
+                "ordinal", //
+                Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
+            cgs.doinc("computeEnumSize", Type.INT_TYPE, Type.INT_TYPE);
+
+          } else {
+            throw new OrmException(
+                "Type "
+                    + f.getPrimitiveType()
+                    + " not supported for field "
+                    + f.getPathToFieldName());
+          }
+          mv.visitLabel(end);
+          break;
         }
-        mv.visitLabel(end);
-        break;
-      }
 
       default:
-        throw new OrmException("Type " + f.getPrimitiveType()
-            + " not supported for field " + f.getPathToFieldName());
+        throw new OrmException(
+            "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
     }
   }
 
   private void implementEncodeObject() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {object, codedOutputStream}), null,
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "encode",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {object, codedOutputStream}),
+            null,
             new String[] {});
     mv.visitCode();
     final EncodeCGS cgs = new EncodeCGS(mv);
@@ -536,9 +593,11 @@
     mv.visitVarInsn(ALOAD, 1);
     mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
     mv.visitVarInsn(ALOAD, 2);
-    mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "encode", Type
-        .getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType,
-            codedOutputStream}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        implTypeName,
+        "encode",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}));
 
     mv.visitInsn(RETURN);
     mv.visitMaxs(-1, -1);
@@ -547,8 +606,11 @@
 
   private void implementEncodeSelf() throws OrmException {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}), null,
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "encode",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}),
+            null,
             new String[] {});
     mv.visitCode();
     final EncodeCGS cgs = new EncodeCGS(mv);
@@ -561,8 +623,9 @@
     mv.visitEnd();
   }
 
-  private void encodeMessage(final JavaColumnModel[] myFields,
-      final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+  private void encodeMessage(
+      final JavaColumnModel[] myFields, final MethodVisitor mv, final EncodeCGS cgs)
+      throws OrmException {
     for (final JavaColumnModel f : myFields) {
       if (f.isNested()) {
         final NestedCodec n = nestedFor(f);
@@ -573,34 +636,40 @@
         mv.visitJumpInsn(IFNULL, end);
 
         final int msgSizeVar = cgs.newLocal();
-        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-            .getDescriptor());
+        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
         cgs.pushFieldValue();
-        mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-            "sizeof", Type.getMethodDescriptor(Type.INT_TYPE,
-                new Type[] {n.pojoType}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            n.codecType.getInternalName(),
+            "sizeof",
+            Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {n.pojoType}));
         mv.visitVarInsn(ISTORE, msgSizeVar);
 
         cgs.pushCodedOutputStream();
         cgs.push(f.getColumnID());
         cgs.push(WireFormat.FieldType.MESSAGE.getWireType());
-        mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
-            "writeTag", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-                Type.INT_TYPE, Type.INT_TYPE}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            codedOutputStream.getInternalName(),
+            "writeTag",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
 
         cgs.pushCodedOutputStream();
         mv.visitVarInsn(ILOAD, msgSizeVar);
-        mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
-            "writeRawVarint32", Type.getMethodDescriptor(Type.VOID_TYPE,
-                new Type[] {Type.INT_TYPE}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            codedOutputStream.getInternalName(),
+            "writeRawVarint32",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
 
-        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-            .getDescriptor());
+        mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
         cgs.pushFieldValue();
         cgs.pushCodedOutputStream();
-        mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-            "encode", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-                n.pojoType, codedOutputStream}));
+        mv.visitMethodInsn(
+            INVOKEVIRTUAL,
+            n.codecType.getInternalName(),
+            "encode",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {n.pojoType, codedOutputStream}));
 
         cgs.freeLocal(msgSizeVar);
         mv.visitLabel(end);
@@ -614,41 +683,42 @@
     }
   }
 
-  private void encodeCollection(final JavaColumnModel f,
-      final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+  private void encodeCollection(
+      final JavaColumnModel f, final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
     final int itr = cgs.newLocal();
     final int val = cgs.newLocal();
     final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
     final Type valType = Type.getType(valClazz);
     final JavaColumnModel col = collectionColumn(f, valClazz);
-    final EncodeCGS ng = new EncodeCGS(mv) {
-      {
-        sizeVar = cgs.sizeVar;
-        setEntityType(valType);
-      }
+    final EncodeCGS ng =
+        new EncodeCGS(mv) {
+          {
+            sizeVar = cgs.sizeVar;
+            setEntityType(valType);
+          }
 
-      @Override
-      public void pushEntity() {
-        mv.visitVarInsn(ALOAD, val);
-      }
+          @Override
+          public void pushEntity() {
+            mv.visitVarInsn(ALOAD, val);
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        if (c != col) {
-          super.appendGetField(c);
-        }
-      }
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            if (c != col) {
+              super.appendGetField(c);
+            }
+          }
 
-      @Override
-      public int newLocal() {
-        return cgs.newLocal();
-      }
+          @Override
+          public int newLocal() {
+            return cgs.newLocal();
+          }
 
-      @Override
-      public void freeLocal(int index) {
-        cgs.freeLocal(index);
-      }
-    };
+          @Override
+          public void freeLocal(int index) {
+            cgs.freeLocal(index);
+          }
+        };
 
     final Label end = new Label();
     cgs.setFieldReference(f);
@@ -657,19 +727,28 @@
 
     cgs.setFieldReference(f);
     cgs.pushFieldValue();
-    mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
-        "iterator", Type.getMethodDescriptor(iterator, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        collection.getInternalName(),
+        "iterator",
+        Type.getMethodDescriptor(iterator, new Type[] {}));
     mv.visitVarInsn(ASTORE, itr);
 
     final Label doloop = new Label();
     mv.visitLabel(doloop);
     mv.visitVarInsn(ALOAD, itr);
-    mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "hasNext",
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        iterator.getInternalName(),
+        "hasNext",
         Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
     mv.visitJumpInsn(IFEQ, end);
 
     mv.visitVarInsn(ALOAD, itr);
-    mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "next",
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        iterator.getInternalName(),
+        "next",
         Type.getMethodDescriptor(object, new Type[] {}));
     mv.visitTypeInsn(CHECKCAST, valType.getInternalName());
     mv.visitVarInsn(ASTORE, val);
@@ -682,8 +761,8 @@
     cgs.freeLocal(val);
   }
 
-  private void encodeScalar(final MethodVisitor mv, final EncodeCGS cgs,
-      final JavaColumnModel f) throws OrmException {
+  private void encodeScalar(final MethodVisitor mv, final EncodeCGS cgs, final JavaColumnModel f)
+      throws OrmException {
     cgs.setFieldReference(f);
 
     switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -732,77 +811,92 @@
         break;
 
       case Type.ARRAY:
-      case Type.OBJECT: {
-        final Label end = new Label();
-        cgs.pushFieldValue();
-        mv.visitJumpInsn(IFNULL, end);
-
-        if (f.getPrimitiveType() == byte[].class) {
-          cgs.pushCodedOutputStream();
-          cgs.push(f.getColumnID());
-          cgs.push(WireFormat.FieldType.BYTES.getWireType());
-          mv.visitMethodInsn(INVOKEVIRTUAL,
-              codedOutputStream.getInternalName(), "writeTag", Type
-                  .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-                      Type.INT_TYPE, Type.INT_TYPE}));
-
-          cgs.pushCodedOutputStream();
+      case Type.OBJECT:
+        {
+          final Label end = new Label();
           cgs.pushFieldValue();
-          mv.visitInsn(ARRAYLENGTH);
-          mv.visitMethodInsn(INVOKEVIRTUAL,
-              codedOutputStream.getInternalName(), "writeRawVarint32", Type
-                  .getMethodDescriptor(Type.VOID_TYPE,
-                      new Type[] {Type.INT_TYPE}));
+          mv.visitJumpInsn(IFNULL, end);
 
-          cgs.pushCodedOutputStream();
-          cgs.pushFieldValue();
-          mv.visitMethodInsn(INVOKEVIRTUAL,
-              codedOutputStream.getInternalName(), "writeRawBytes", Type
-                  .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
-                      .getType(byte[].class)}));
+          if (f.getPrimitiveType() == byte[].class) {
+            cgs.pushCodedOutputStream();
+            cgs.push(f.getColumnID());
+            cgs.push(WireFormat.FieldType.BYTES.getWireType());
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                codedOutputStream.getInternalName(),
+                "writeTag",
+                Type.getMethodDescriptor(
+                    Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
 
-        } else {
-          cgs.pushCodedOutputStream();
-          cgs.push(f.getColumnID());
-          cgs.pushFieldValue();
+            cgs.pushCodedOutputStream();
+            cgs.pushFieldValue();
+            mv.visitInsn(ARRAYLENGTH);
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                codedOutputStream.getInternalName(),
+                "writeRawVarint32",
+                Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
 
-          if (f.getPrimitiveType() == String.class) {
-            cgs.write("writeString", string);
-
-          } else if (f.getPrimitiveType() == java.sql.Timestamp.class
-              || f.getPrimitiveType() == java.util.Date.class
-              || f.getPrimitiveType() == java.sql.Date.class) {
-            String tsType =
-                Type.getType(f.getPrimitiveType()).getInternalName();
-            mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
-                .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
-            cgs.write("writeFixed64", Type.LONG_TYPE);
-
-          } else if (f.getPrimitiveType().isEnum()) {
-            mv.visitMethodInsn(INVOKEVIRTUAL, enumType.getInternalName(),
-                "ordinal", //
-                Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
-            cgs.write("writeEnum", Type.INT_TYPE);
+            cgs.pushCodedOutputStream();
+            cgs.pushFieldValue();
+            mv.visitMethodInsn(
+                INVOKEVIRTUAL,
+                codedOutputStream.getInternalName(),
+                "writeRawBytes",
+                Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(byte[].class)}));
 
           } else {
-            throw new OrmException("Type " + f.getPrimitiveType()
-                + " not supported for field " + f.getPathToFieldName());
+            cgs.pushCodedOutputStream();
+            cgs.push(f.getColumnID());
+            cgs.pushFieldValue();
+
+            if (f.getPrimitiveType() == String.class) {
+              cgs.write("writeString", string);
+
+            } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+                || f.getPrimitiveType() == java.util.Date.class
+                || f.getPrimitiveType() == java.sql.Date.class) {
+              String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
+              mv.visitMethodInsn(
+                  INVOKEVIRTUAL,
+                  tsType,
+                  "getTime",
+                  Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+              cgs.write("writeFixed64", Type.LONG_TYPE);
+
+            } else if (f.getPrimitiveType().isEnum()) {
+              mv.visitMethodInsn(
+                  INVOKEVIRTUAL,
+                  enumType.getInternalName(),
+                  "ordinal", //
+                  Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
+              cgs.write("writeEnum", Type.INT_TYPE);
+
+            } else {
+              throw new OrmException(
+                  "Type "
+                      + f.getPrimitiveType()
+                      + " not supported for field "
+                      + f.getPathToFieldName());
+            }
           }
+          mv.visitLabel(end);
+          break;
         }
-        mv.visitLabel(end);
-        break;
-      }
 
       default:
-        throw new OrmException("Type " + f.getPrimitiveType()
-            + " not supported for field " + f.getPathToFieldName());
+        throw new OrmException(
+            "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
     }
   }
 
   private void implementMergeFromObject() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "mergeFrom", Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {codedInputStream, object}), null,
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "mergeFrom",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, object}),
+            null,
             new String[] {});
     mv.visitCode();
 
@@ -810,9 +904,11 @@
     mv.visitVarInsn(ALOAD, 1);
     mv.visitVarInsn(ALOAD, 2);
     mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
-    mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "mergeFrom", Type
-        .getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream,
-            pojoType}));
+    mv.visitMethodInsn(
+        INVOKEVIRTUAL,
+        implTypeName,
+        "mergeFrom",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}));
 
     mv.visitInsn(RETURN);
     mv.visitMaxs(-1, -1);
@@ -821,8 +917,11 @@
 
   private void implementMergeFromSelf() throws OrmException {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, "mergeFrom", Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}), null,
+        cw.visitMethod(
+            ACC_PUBLIC,
+            "mergeFrom",
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}),
+            null,
             new String[] {});
     mv.visitCode();
     final DecodeCGS cgs = new DecodeCGS(mv);
@@ -837,8 +936,9 @@
     mv.visitEnd();
   }
 
-  private void decodeMessage(final JavaColumnModel[] myFields,
-      final MethodVisitor mv, final DecodeCGS cgs) throws OrmException {
+  private void decodeMessage(
+      final JavaColumnModel[] myFields, final MethodVisitor mv, final DecodeCGS cgs)
+      throws OrmException {
     final Label nextField = new Label();
     final Label end = new Label();
     mv.visitLabel(nextField);
@@ -902,8 +1002,8 @@
     cgs.ncallInt("checkLastTagWas", Type.VOID_TYPE);
   }
 
-  private void decodeField(final MethodVisitor mv, final DecodeCGS cgs,
-      final JavaColumnModel f) throws OrmException {
+  private void decodeField(final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f)
+      throws OrmException {
     if (f.isNested()) {
       final NestedCodec n = nestedFor(f);
       final Label load = new Label();
@@ -914,13 +1014,14 @@
       // Since the field isn't initialized, construct it
       //
       cgs.fieldSetBegin();
-      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-          .getDescriptor());
-      mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-          "newInstance", Type.getMethodDescriptor(n.pojoType, new Type[] {}));
+      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          n.codecType.getInternalName(),
+          "newInstance",
+          Type.getMethodDescriptor(n.pojoType, new Type[] {}));
       if (object.equals(n.pojoType)) {
-        mv.visitTypeInsn(CHECKCAST, Type.getType(f.getNestedClass())
-            .getInternalName());
+        mv.visitTypeInsn(CHECKCAST, Type.getType(f.getNestedClass()).getInternalName());
       }
       cgs.fieldSetEnd();
 
@@ -934,13 +1035,14 @@
       cgs.ncallInt("pushLimit", Type.INT_TYPE);
       mv.visitVarInsn(ISTORE, limitVar);
 
-      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-          .getDescriptor());
+      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
       cgs.pushCodedInputStream();
       cgs.pushFieldValue();
-      mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-          "mergeFrom", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-              codedInputStream, n.pojoType}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          n.codecType.getInternalName(),
+          "mergeFrom",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, n.pojoType}));
 
       cgs.pushCodedInputStream();
       mv.visitVarInsn(ILOAD, limitVar);
@@ -955,55 +1057,58 @@
     }
   }
 
-  private void decodeCollection(final MethodVisitor mv, final DecodeCGS cgs,
-      final JavaColumnModel f) throws OrmException {
+  private void decodeCollection(
+      final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f) throws OrmException {
     final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
     final Type valType = Type.getType(valClazz);
     final JavaColumnModel col = collectionColumn(f, valClazz);
-    final DecodeCGS ng = new DecodeCGS(mv) {
-      {
-        tagVar = cgs.tagVar;
-        setEntityType(valType);
-      }
+    final DecodeCGS ng =
+        new DecodeCGS(mv) {
+          {
+            tagVar = cgs.tagVar;
+            setEntityType(valType);
+          }
 
-      @Override
-      public int newLocal() {
-        return cgs.newLocal();
-      }
+          @Override
+          public int newLocal() {
+            return cgs.newLocal();
+          }
 
-      @Override
-      public void freeLocal(int index) {
-        cgs.freeLocal(index);
-      }
+          @Override
+          public void freeLocal(int index) {
+            cgs.freeLocal(index);
+          }
 
-      @Override
-      protected void appendGetField(final ColumnModel c) {
-        if (c != col) {
-          super.appendGetField(c);
-        }
-      }
+          @Override
+          protected void appendGetField(final ColumnModel c) {
+            if (c != col) {
+              super.appendGetField(c);
+            }
+          }
 
-      @Override
-      public void fieldSetBegin() {
-        if (col.isNested()) {
-          super.fieldSetBegin();
-        } else {
-          cgs.pushFieldValue();
-        }
-      }
+          @Override
+          public void fieldSetBegin() {
+            if (col.isNested()) {
+              super.fieldSetBegin();
+            } else {
+              cgs.pushFieldValue();
+            }
+          }
 
-      @Override
-      public void fieldSetEnd() {
-        if (col.isNested()) {
-          super.fieldSetEnd();
-        } else {
-          mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
-              "add", Type.getMethodDescriptor(Type.BOOLEAN_TYPE,
-                  new Type[] {object}));
-          mv.visitInsn(POP);
-        }
-      }
-    };
+          @Override
+          public void fieldSetEnd() {
+            if (col.isNested()) {
+              super.fieldSetEnd();
+            } else {
+              mv.visitMethodInsn(
+                  INVOKEINTERFACE,
+                  collection.getInternalName(),
+                  "add",
+                  Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
+              mv.visitInsn(POP);
+            }
+          }
+        };
 
     final Label notnull = new Label();
     cgs.setFieldReference(f);
@@ -1031,9 +1136,11 @@
       mv.visitTypeInsn(NEW, illegalStateException.getInternalName());
       mv.visitInsn(DUP);
       mv.visitLdcInsn("Field " + f.getPathToFieldName() + " not initialized");
-      mv.visitMethodInsn(INVOKESPECIAL,
-          illegalStateException.getInternalName(), "<init>", Type
-              .getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          illegalStateException.getInternalName(),
+          "<init>",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
       mv.visitInsn(ATHROW);
       concreteType = null;
     }
@@ -1041,8 +1148,11 @@
       cgs.fieldSetBegin();
       mv.visitTypeInsn(NEW, concreteType.getInternalName());
       mv.visitInsn(DUP);
-      mv.visitMethodInsn(INVOKESPECIAL, concreteType.getInternalName(),
-          "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          concreteType.getInternalName(),
+          "<init>",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
       cgs.fieldSetEnd();
     }
     mv.visitLabel(notnull);
@@ -1052,10 +1162,12 @@
       //
       final NestedCodec n = nestedFor(col);
       ng.objVar = cgs.newLocal();
-      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-          .getDescriptor());
-      mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-          "newInstance", Type.getMethodDescriptor(n.pojoType, new Type[] {}));
+      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          n.codecType.getInternalName(),
+          "newInstance",
+          Type.getMethodDescriptor(n.pojoType, new Type[] {}));
       mv.visitVarInsn(ASTORE, ng.objVar);
 
       // read the length, set a new limit, decode the message, validate
@@ -1067,13 +1179,14 @@
       cgs.ncallInt("pushLimit", Type.INT_TYPE);
       mv.visitVarInsn(ISTORE, limitVar);
 
-      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
-          .getDescriptor());
+      mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
       cgs.pushCodedInputStream();
       mv.visitVarInsn(ALOAD, ng.objVar);
-      mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
-          "mergeFrom", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-              codedInputStream, n.pojoType}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          n.codecType.getInternalName(),
+          "mergeFrom",
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, n.pojoType}));
 
       cgs.pushCodedInputStream();
       mv.visitVarInsn(ILOAD, limitVar);
@@ -1082,22 +1195,25 @@
       cgs.pushFieldValue();
 
       mv.visitVarInsn(ALOAD, ng.objVar);
-      mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(), "add",
+      mv.visitMethodInsn(
+          INVOKEINTERFACE,
+          collection.getInternalName(),
+          "add",
           Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
       mv.visitInsn(POP);
       cgs.freeLocal(ng.objVar);
 
     } else if (col.isCollection()) {
-      throw new OrmException("Cannot nest collection as member of another"
-          + " collection: " + f.getPathToFieldName());
+      throw new OrmException(
+          "Cannot nest collection as member of another" + " collection: " + f.getPathToFieldName());
 
     } else {
       decodeScalar(mv, ng, col);
     }
   }
 
-  private static void decodeScalar(final MethodVisitor mv, final DecodeCGS cgs,
-      final JavaColumnModel f) throws OrmException {
+  private static void decodeScalar(
+      final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f) throws OrmException {
     cgs.setFieldReference(f);
     cgs.fieldSetBegin();
     switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -1130,9 +1246,11 @@
       default:
         if (f.getPrimitiveType() == byte[].class) {
           cgs.call("readBytes", byteString);
-          mv.visitMethodInsn(INVOKEVIRTUAL, byteString.getInternalName(),
-              "toByteArray", Type.getMethodDescriptor(Type
-                  .getType(byte[].class), new Type[] {}));
+          mv.visitMethodInsn(
+              INVOKEVIRTUAL,
+              byteString.getInternalName(),
+              "toByteArray",
+              Type.getMethodDescriptor(Type.getType(byte[].class), new Type[] {}));
 
         } else if (f.getPrimitiveType() == String.class) {
           cgs.call("readString", string);
@@ -1144,21 +1262,28 @@
           mv.visitTypeInsn(NEW, tsType);
           mv.visitInsn(DUP);
           cgs.call("readFixed64", Type.LONG_TYPE);
-          mv.visitMethodInsn(INVOKESPECIAL, tsType, "<init>", //
-              Type.getMethodDescriptor(Type.VOID_TYPE,
-                  new Type[] {Type.LONG_TYPE}));
+          mv.visitMethodInsn(
+              INVOKESPECIAL,
+              tsType,
+              "<init>", //
+              Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
 
         } else if (f.getPrimitiveType().isEnum()) {
           Type et = Type.getType(f.getPrimitiveType());
-          mv.visitMethodInsn(INVOKESTATIC, et.getInternalName(), "values", Type
-              .getMethodDescriptor(Type.getType("[" + et.getDescriptor()),
-                  new Type[] {}));
+          mv.visitMethodInsn(
+              INVOKESTATIC,
+              et.getInternalName(),
+              "values",
+              Type.getMethodDescriptor(Type.getType("[" + et.getDescriptor()), new Type[] {}));
           cgs.call("readEnum", Type.INT_TYPE);
           mv.visitInsn(AALOAD);
 
         } else {
-          throw new OrmException("Type " + f.getPrimitiveType()
-              + " not supported for field " + f.getPathToFieldName());
+          throw new OrmException(
+              "Type "
+                  + f.getPrimitiveType()
+                  + " not supported for field "
+                  + f.getPathToFieldName());
         }
         break;
     }
@@ -1173,8 +1298,11 @@
     }
 
     void doinc(String name, Type... args) {
-      mv.visitMethodInsn(INVOKESTATIC, codedOutputStream.getInternalName(),
-          name, Type.getMethodDescriptor(Type.INT_TYPE, args));
+      mv.visitMethodInsn(
+          INVOKESTATIC,
+          codedOutputStream.getInternalName(),
+          name,
+          Type.getMethodDescriptor(Type.INT_TYPE, args));
       doinc();
     }
 
@@ -1203,9 +1331,11 @@
     }
 
     void write(String name, Type arg) {
-      mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
-          name, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-              Type.INT_TYPE, arg}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          codedOutputStream.getInternalName(),
+          name,
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, arg}));
     }
   }
 
@@ -1224,13 +1354,19 @@
 
     void call(String name, Type ret) {
       pushCodedInputStream();
-      mv.visitMethodInsn(INVOKEVIRTUAL, codedInputStream.getInternalName(),
-          name, Type.getMethodDescriptor(ret, new Type[] {}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          codedInputStream.getInternalName(),
+          name,
+          Type.getMethodDescriptor(ret, new Type[] {}));
     }
 
     void ncallInt(String name, Type ret) {
-      mv.visitMethodInsn(INVOKEVIRTUAL, codedInputStream.getInternalName(),
-          name, Type.getMethodDescriptor(ret, new Type[] {Type.INT_TYPE}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          codedInputStream.getInternalName(),
+          name,
+          Type.getMethodDescriptor(ret, new Type[] {Type.INT_TYPE}));
     }
 
     @Override
diff --git a/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java b/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
index 3462a3c..8a25690 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
@@ -21,11 +21,10 @@
 
 /**
  * Identity of a custom {@link ProtobufCodec} for a {@code Column}.
- * <p>
- * Additional annotation tagged onto a {@code Column} field that carries the
- * name of a custom {@link ProtobufCodec} that should be used to handle that
- * field. The field data will be treated as an opaque binary sequence, so its
- * {@link ProtobufCodec#sizeof(Object)} method must be accurate.
+ *
+ * <p>Additional annotation tagged onto a {@code Column} field that carries the name of a custom
+ * {@link ProtobufCodec} that should be used to handle that field. The field data will be treated as
+ * an opaque binary sequence, so its {@link ProtobufCodec#sizeof(Object)} method must be accurate.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
diff --git a/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java b/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
index 43202b1..aa5d5d1 100644
--- a/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
+++ b/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
@@ -19,7 +19,6 @@
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import com.google.protobuf.InvalidProtocolBufferException;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -27,9 +26,9 @@
 
 /**
  * Encode and decode an arbitrary Java object as a Protobuf message.
- * <p>
- * The object must use the {@link Column} annotations to denote the fields that
- * should be encoded or decoded.
+ *
+ * <p>The object must use the {@link Column} annotations to denote the fields that should be encoded
+ * or decoded.
  */
 public abstract class ProtobufCodec<T> {
   /** Encode the object into an immutable byte string. */
@@ -71,10 +70,11 @@
   /** Encode the object into a ByteBuffer. */
   public void encode(T obj, ByteBuffer buf) {
     if (buf.hasArray()) {
-      CodedOutputStream out = CodedOutputStream.newInstance( //
-          buf.array(), //
-          buf.position(), //
-          buf.remaining());
+      CodedOutputStream out =
+          CodedOutputStream.newInstance( //
+              buf.array(), //
+              buf.position(), //
+              buf.remaining());
       try {
         encode(obj, out);
         out.flush();
@@ -96,8 +96,8 @@
 
   /**
    * Encodes the object, prefixed by its encoded length.
-   * <p>
-   * The length is encoded as a raw varint with no tag.
+   *
+   * <p>The length is encoded as a raw varint with no tag.
    *
    * @param obj the object to encode.
    * @param out stream that will receive the object's data.
@@ -116,10 +116,10 @@
 
   /**
    * Encode the object to the supplied output stream.
-   * <p>
-   * The stream {@code out} is not flushed by this method. Callers that need the
-   * entire byte representation after invoking encode must flush the stream to
-   * ensure its intermediate buffers have been written to the backing store.
+   *
+   * <p>The stream {@code out} is not flushed by this method. Callers that need the entire byte
+   * representation after invoking encode must flush the stream to ensure its intermediate buffers
+   * have been written to the backing store.
    *
    * @param obj the object to encode.
    * @param out the stream to encode the object onto.
@@ -205,10 +205,11 @@
   /** Decode a byte buffer into an existing object instance. */
   public void mergeFrom(ByteBuffer buf, T obj) {
     if (buf.hasArray()) {
-      CodedInputStream in = CodedInputStream.newInstance( //
-          buf.array(), //
-          buf.position(), //
-          buf.remaining());
+      CodedInputStream in =
+          CodedInputStream.newInstance( //
+              buf.array(), //
+              buf.position(), //
+              buf.remaining());
       try {
         mergeFrom(in, obj);
       } catch (IOException err) {
diff --git a/src/main/java/com/google/gwtorm/schema/ColumnModel.java b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
index 066b363..c9a88d2 100644
--- a/src/main/java/com/google/gwtorm/schema/ColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
@@ -16,7 +16,6 @@
 
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.server.OrmException;
-
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -36,14 +35,13 @@
   protected boolean notNull;
 
   protected ColumnModel() {
-    nestedColumns = Collections.<ColumnModel> emptyList();
+    nestedColumns = Collections.<ColumnModel>emptyList();
   }
 
-  protected void initName(final String fieldName, final Column col)
-      throws OrmException {
+  protected void initName(final String fieldName, final Column col) throws OrmException {
     if (col == null) {
-      throw new OrmException("Field " + fieldName + " is missing "
-          + Column.class.getName() + " annotation");
+      throw new OrmException(
+          "Field " + fieldName + " is missing " + Column.class.getName() + " annotation");
     }
     column = col;
     origName = Util.any(column.name(), Util.makeSqlFriendly(fieldName));
@@ -71,8 +69,8 @@
     Set<Integer> ids = new HashSet<>();
     for (final ColumnModel c : nestedColumns) {
       if (!ids.add(c.columnId)) {
-        throw new OrmException("Duplicate @Column id " + c.columnId + " in "
-            + c.getPathToFieldName());
+        throw new OrmException(
+            "Duplicate @Column id " + c.columnId + " in " + c.getPathToFieldName());
       }
     }
   }
diff --git a/src/main/java/com/google/gwtorm/schema/QueryModel.java b/src/main/java/com/google/gwtorm/schema/QueryModel.java
index 149e3d7..f8141ee 100644
--- a/src/main/java/com/google/gwtorm/schema/QueryModel.java
+++ b/src/main/java/com/google/gwtorm/schema/QueryModel.java
@@ -19,36 +19,33 @@
 import com.google.gwtorm.schema.sql.SqlDialect;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.Query;
-
-import org.antlr.runtime.CommonToken;
-import org.antlr.runtime.tree.CommonTree;
-import org.antlr.runtime.tree.Tree;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.Tree;
 
 public class QueryModel {
   private final RelationModel model;
   private final String name;
   private final Tree parsedQuery;
 
-  public QueryModel(final RelationModel rel, final String queryName,
-      final Query q) throws OrmException {
+  public QueryModel(final RelationModel rel, final String queryName, final Query q)
+      throws OrmException {
     this(rel, queryName, queryTextOf(queryName, q));
   }
 
-  private static String queryTextOf(String queryName, Query q)
-      throws OrmException {
+  private static String queryTextOf(String queryName, Query q) throws OrmException {
     if (q == null) {
-      throw new OrmException("Query " + queryName + " is missing "
-          + Query.class.getName() + " annotation");
+      throw new OrmException(
+          "Query " + queryName + " is missing " + Query.class.getName() + " annotation");
     }
     return q.value();
   }
 
-  public QueryModel(final RelationModel rel, final String queryName,
-      final String queryText) throws OrmException {
+  public QueryModel(final RelationModel rel, final String queryName, final String queryText)
+      throws OrmException {
     model = rel;
     name = queryName;
 
@@ -107,9 +104,9 @@
         for (int i = 0; i < node.getChildCount(); i++) {
           Tree sortOrder = node.getChild(i);
           Tree id = sortOrder.getChild(0);
-          r.add(new OrderBy(
-              ((QueryParser.Column) id).getField(),
-              sortOrder.getType() == QueryParser.DESC));
+          r.add(
+              new OrderBy(
+                  ((QueryParser.Column) id).getField(), sortOrder.getType() == QueryParser.DESC));
         }
       }
     }
@@ -164,8 +161,7 @@
 
   public boolean hasLimitParameter() {
     final Tree limit = findLimit(parsedQuery);
-    return limit != null
-        && limit.getChild(0).getType() == QueryParser.PLACEHOLDER;
+    return limit != null && limit.getChild(0).getType() == QueryParser.PLACEHOLDER;
   }
 
   public int getStaticLimit() {
@@ -273,29 +269,30 @@
         format(fmt, node.getChild(1));
         break;
 
-      case QueryParser.ID: {
-        final ColumnModel col = ((QueryParser.Column) node).getField();
-        if (!col.isSqlPrimitive()) {
-          throw new IllegalStateException("Unexpanded nested field");
+      case QueryParser.ID:
+        {
+          final ColumnModel col = ((QueryParser.Column) node).getField();
+          if (!col.isSqlPrimitive()) {
+            throw new IllegalStateException("Unexpanded nested field");
+          }
+          fmt.buf.append(fmt.tableAlias);
+          fmt.buf.append('.');
+          fmt.buf.append(col.getColumnName());
+          break;
         }
-        fmt.buf.append(fmt.tableAlias);
-        fmt.buf.append('.');
-        fmt.buf.append(col.getColumnName());
-        break;
-      }
 
       case QueryParser.PLACEHOLDER:
         fmt.buf.append(fmt.dialect.getParameterPlaceHolder(fmt.nthParam++));
         break;
 
       case QueryParser.TRUE:
-        fmt.buf.append(((SqlBooleanTypeInfo) fmt.dialect
-            .getSqlTypeInfo(Boolean.TYPE)).getTrueLiteralValue());
+        fmt.buf.append(
+            ((SqlBooleanTypeInfo) fmt.dialect.getSqlTypeInfo(Boolean.TYPE)).getTrueLiteralValue());
         break;
 
       case QueryParser.FALSE:
-        fmt.buf.append(((SqlBooleanTypeInfo) fmt.dialect
-            .getSqlTypeInfo(Boolean.TYPE)).getFalseLiteralValue());
+        fmt.buf.append(
+            ((SqlBooleanTypeInfo) fmt.dialect.getSqlTypeInfo(Boolean.TYPE)).getFalseLiteralValue());
         break;
 
       case QueryParser.CONSTANT_INTEGER:
@@ -313,8 +310,9 @@
           }
           final ColumnModel col = ((QueryParser.Column) id).getField();
           if (col.isNested()) {
-            for (final Iterator<ColumnModel> cItr =
-                col.getAllLeafColumns().iterator(); cItr.hasNext();) {
+            for (final Iterator<ColumnModel> cItr = col.getAllLeafColumns().iterator();
+                cItr.hasNext();
+                ) {
               fmt.buf.append(fmt.tableAlias);
               fmt.buf.append('.');
               fmt.buf.append(cItr.next().getColumnName());
@@ -363,24 +361,25 @@
       case QueryParser.LE:
       case QueryParser.GT:
       case QueryParser.GE:
-      case QueryParser.EQ: {
-        final Column qpc = (QueryParser.Column) node.getChild(0);
-        final ColumnModel f = qpc.getField();
-        if (f.isNested()) {
-          final CommonTree join;
+      case QueryParser.EQ:
+        {
+          final Column qpc = (QueryParser.Column) node.getChild(0);
+          final ColumnModel f = qpc.getField();
+          if (f.isNested()) {
+            final CommonTree join;
 
-          join = new CommonTree(new CommonToken(QueryParser.AND));
-          for (final ColumnModel c : f.getAllLeafColumns()) {
-            final Tree op;
+            join = new CommonTree(new CommonToken(QueryParser.AND));
+            for (final ColumnModel c : f.getAllLeafColumns()) {
+              final Tree op;
 
-            op = node.dupNode();
-            op.addChild(new QueryParser.Column(qpc, c));
-            op.addChild(node.getChild(1).dupNode());
-            join.addChild(op);
+              op = node.dupNode();
+              op.addChild(new QueryParser.Column(qpc, c));
+              op.addChild(node.getChild(1).dupNode());
+              join.addChild(op);
+            }
+            return join;
           }
-          return join;
         }
-      }
     }
 
     final Tree r = node.dupNode();
diff --git a/src/main/java/com/google/gwtorm/schema/RelationModel.java b/src/main/java/com/google/gwtorm/schema/RelationModel.java
index ebfb050..8f1f555 100644
--- a/src/main/java/com/google/gwtorm/schema/RelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/RelationModel.java
@@ -20,7 +20,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.PrimaryKey;
 import com.google.gwtorm.server.Relation;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -46,11 +45,10 @@
     queries = Lists.newArrayList();
   }
 
-  protected void initName(final String method, final Relation rel)
-      throws OrmException {
+  protected void initName(final String method, final Relation rel) throws OrmException {
     if (rel == null) {
-      throw new OrmException("Method " + method + " is missing "
-          + Relation.class.getName() + " annotation");
+      throw new OrmException(
+          "Method " + method + " is missing " + Relation.class.getName() + " annotation");
     }
     relation = rel;
     methodName = method;
@@ -64,8 +62,8 @@
         throw new OrmException("Duplicate fields " + field.getFieldName());
       }
       if (columnsById.put(field.getColumnID(), field) != null) {
-        throw new OrmException("Duplicate @Column id " + field.getColumnID()
-            + " in " + field.getPathToFieldName());
+        throw new OrmException(
+            "Duplicate @Column id " + field.getColumnID() + " in " + field.getPathToFieldName());
       }
 
       if (field.isNested()) {
@@ -81,9 +79,16 @@
   private void registerColumn(final ColumnModel nc) throws OrmException {
     final ColumnModel name = columnsByColumnName.put(nc.getColumnName(), nc);
     if (name != null) {
-      throw new OrmException("Duplicate columns " + nc.getColumnName() + " in "
-          + getMethodName() + ":\n" + "prior " + name.getPathToFieldName()
-          + "\n next  " + nc.getPathToFieldName());
+      throw new OrmException(
+          "Duplicate columns "
+              + nc.getColumnName()
+              + " in "
+              + getMethodName()
+              + ":\n"
+              + "prior "
+              + name.getPathToFieldName()
+              + "\n next  "
+              + nc.getPathToFieldName());
     }
   }
 
@@ -95,8 +100,7 @@
 
     final ColumnModel field = getField(annotation.value());
     if (field == null) {
-      throw new OrmException("Field " + annotation.value() + " not in "
-          + getEntityTypeClassName());
+      throw new OrmException("Field " + annotation.value() + " not in " + getEntityTypeClassName());
     }
 
     primaryKey = new KeyModel(name, field);
@@ -108,14 +112,16 @@
   protected void addQuery(final QueryModel q) throws OrmException {
     for (QueryModel e : queries) {
       if (e.getName().equals(q.getName())) {
-        throw new OrmException("Duplicate query " + q.getName() //
-            + " in " + getAccessInterfaceName());
+        throw new OrmException(
+            "Duplicate query "
+                + q.getName() //
+                + " in "
+                + getAccessInterfaceName());
       }
     }
     queries.add(q);
   }
 
-
   public String getMethodName() {
     return methodName;
   }
@@ -176,7 +182,7 @@
     if (getPrimaryKey() != null) {
       return getPrimaryKey().getAllLeafColumns();
     }
-    return Collections.<ColumnModel> emptyList();
+    return Collections.<ColumnModel>emptyList();
   }
 
   public Collection<QueryModel> getQueries() {
@@ -211,14 +217,13 @@
     r.append(relationName);
     r.append(" (\n");
 
-    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(col.getColumnName());
       r.append(" ");
       r.append(dialect.getSqlTypeInfo(col).getSqlType(col, dialect));
 
-      String check =
-          dialect.getSqlTypeInfo(col).getCheckConstraint(col, dialect);
+      String check = dialect.getSqlTypeInfo(col).getCheckConstraint(col, dialect);
       if (check != null) {
         r.append(' ');
         r.append(check);
@@ -231,8 +236,7 @@
 
     if (!getPrimaryKeyColumns().isEmpty()) {
       r.append(",PRIMARY KEY(");
-      for (final Iterator<ColumnModel> i = getPrimaryKeyColumns().iterator(); i
-          .hasNext();) {
+      for (final Iterator<ColumnModel> i = getPrimaryKeyColumns().iterator(); i.hasNext(); ) {
         final ColumnModel col = i.next();
         r.append(col.getColumnName());
         if (i.hasNext()) {
@@ -250,7 +254,7 @@
   public String getSelectSql(final SqlDialect dialect, final String tableAlias) {
     final StringBuilder r = new StringBuilder();
     r.append("SELECT ");
-    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(tableAlias);
       r.append('.');
@@ -271,7 +275,7 @@
     r.append("INSERT INTO ");
     r.append(relationName);
     r.append("(");
-    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(col.getColumnName());
       if (i.hasNext()) {
@@ -280,7 +284,7 @@
     }
     r.append(")VALUES(");
     int nth = 1;
-    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
       i.next();
       r.append(dialect.getParameterPlaceHolder(nth++));
       if (i.hasNext()) {
@@ -302,7 +306,7 @@
     cols = new ArrayList<>();
     cols.addAll(getDependentColumns());
     cols.addAll(getRowVersionColumns());
-    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(col.getColumnName());
       r.append("=");
@@ -316,7 +320,7 @@
     cols = new ArrayList<>();
     cols.addAll(getPrimaryKeyColumns());
     cols.addAll(getRowVersionColumns());
-    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(col.getColumnName());
       r.append("=");
@@ -337,7 +341,7 @@
     final List<ColumnModel> cols = new ArrayList<>();
     cols.addAll(getPrimaryKeyColumns());
     cols.addAll(getRowVersionColumns());
-    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+    for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
       final ColumnModel col = i.next();
       r.append(col.getColumnName());
       r.append("=");
diff --git a/src/main/java/com/google/gwtorm/schema/SchemaModel.java b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
index b8ed338..3f188c1 100644
--- a/src/main/java/com/google/gwtorm/schema/SchemaModel.java
+++ b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
@@ -16,7 +16,6 @@
 
 import com.google.gwtorm.schema.sql.SqlDialect;
 import com.google.gwtorm.server.OrmException;
-
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
diff --git a/src/main/java/com/google/gwtorm/schema/SequenceModel.java b/src/main/java/com/google/gwtorm/schema/SequenceModel.java
index e8a128e..0b56f85 100644
--- a/src/main/java/com/google/gwtorm/schema/SequenceModel.java
+++ b/src/main/java/com/google/gwtorm/schema/SequenceModel.java
@@ -24,15 +24,14 @@
   protected Sequence sequence;
   protected Class<?> returnType;
 
-  public SequenceModel(final String method, final Sequence seq,
-      final Class<?> type) throws OrmException {
+  public SequenceModel(final String method, final Sequence seq, final Class<?> type)
+      throws OrmException {
     if (seq == null) {
-      throw new OrmException("Method " + method + " is missing "
-          + Sequence.class.getName() + " annotation");
+      throw new OrmException(
+          "Method " + method + " is missing " + Sequence.class.getName() + " annotation");
     }
     if (type != Integer.TYPE && type != Long.TYPE) {
-      throw new OrmException("Sequence method " + method
-          + " must return int or long");
+      throw new OrmException("Sequence method " + method + " must return int or long");
     }
 
     sequence = seq;
diff --git a/src/main/java/com/google/gwtorm/schema/Util.java b/src/main/java/com/google/gwtorm/schema/Util.java
index 6a55c72..287e573 100644
--- a/src/main/java/com/google/gwtorm/schema/Util.java
+++ b/src/main/java/com/google/gwtorm/schema/Util.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.schema;
 
-
 public class Util {
   private static int nameCounter;
 
@@ -43,14 +42,13 @@
     }
     String friendlyName = r.toString();
     if (friendlyName.length() > 30) {
-      throw new IllegalArgumentException(String.format(
-          "Identifier '%s' for name '%s' is greater than 30 characters",
-          friendlyName, name));
+      throw new IllegalArgumentException(
+          String.format(
+              "Identifier '%s' for name '%s' is greater than 30 characters", friendlyName, name));
     }
     return friendlyName;
   }
 
-
   public static String any(final String a, final String b) {
     if (a != null && a.length() > 0) {
       return a;
@@ -92,6 +90,5 @@
     return false;
   }
 
-  private Util() {
-  }
+  private Util() {}
 }
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
index 9e2b30c..f3d9102 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
@@ -20,7 +20,6 @@
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.schema.Util;
 import com.google.gwtorm.server.OrmException;
-
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
@@ -29,7 +28,6 @@
 import java.util.Arrays;
 import java.util.List;
 
-
 public class JavaColumnModel extends ColumnModel {
   public static List<Field> getDeclaredFields(Class<?> in) {
     return sort(Arrays.asList(in.getDeclaredFields()));
@@ -69,25 +67,38 @@
     initName(fieldName, field.getAnnotation(Column.class));
 
     if (Modifier.isPrivate(field.getModifiers())) {
-      throw new OrmException("Field " + field.getName() + " of "
-          + field.getDeclaringClass().getName() + " must not be private");
+      throw new OrmException(
+          "Field "
+              + field.getName()
+              + " of "
+              + field.getDeclaringClass().getName()
+              + " must not be private");
     }
     if (Modifier.isFinal(field.getModifiers())) {
-      throw new OrmException("Field " + field.getName() + " of "
-          + field.getDeclaringClass().getName() + " must not be final");
+      throw new OrmException(
+          "Field "
+              + field.getName()
+              + " of "
+              + field.getDeclaringClass().getName()
+              + " must not be final");
     }
 
     rowVersion = field.getAnnotation(RowVersion.class) != null;
     if (rowVersion && field.getType() != Integer.TYPE) {
-      throw new OrmException("Field " + field.getName() + " of "
-          + field.getDeclaringClass().getName() + " must have type 'int'");
+      throw new OrmException(
+          "Field "
+              + field.getName()
+              + " of "
+              + field.getDeclaringClass().getName()
+              + " must have type 'int'");
     }
 
     initNested();
   }
 
-  public JavaColumnModel(Field f, final String fieldPath, final int columnId,
-      final Class<?> columnType) throws OrmException {
+  public JavaColumnModel(
+      Field f, final String fieldPath, final int columnId, final Class<?> columnType)
+      throws OrmException {
     this.field = f;
     this.fieldName = fieldPath;
     this.columnName = fieldPath;
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
index 3a06407..b2b8f16 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
@@ -23,7 +23,6 @@
 import com.google.gwtorm.server.Query;
 import com.google.gwtorm.server.Relation;
 import com.google.gwtorm.server.ResultSet;
-
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
@@ -41,21 +40,23 @@
     initName(method.getName(), m.getAnnotation(Relation.class));
 
     accessType = method.getReturnType();
-    if (accessType.getInterfaces().length != 1
-        || accessType.getInterfaces()[0] != Access.class) {
-      throw new OrmException("Method " + method.getName() + " in "
-          + method.getDeclaringClass().getName()
-          + " must return a direct extension of " + Access.class);
+    if (accessType.getInterfaces().length != 1 || accessType.getInterfaces()[0] != Access.class) {
+      throw new OrmException(
+          "Method "
+              + method.getName()
+              + " in "
+              + method.getDeclaringClass().getName()
+              + " must return a direct extension of "
+              + Access.class);
     }
 
     final Type gt = accessType.getGenericInterfaces()[0];
     if (!(gt instanceof ParameterizedType)) {
-      throw new OrmException(accessType.getName()
-          + " must specify entity type parameter for " + Access.class);
+      throw new OrmException(
+          accessType.getName() + " must specify entity type parameter for " + Access.class);
     }
 
-    entityType =
-        (Class<?>) ((ParameterizedType) gt).getActualTypeArguments()[0];
+    entityType = (Class<?>) ((ParameterizedType) gt).getActualTypeArguments()[0];
 
     initColumns();
     initQueriesAndKeys();
@@ -82,18 +83,18 @@
           continue;
         }
         if (m.getReturnType() != entityType) {
-          throw new OrmException("PrimaryKey " + m.getName() + " must return "
-              + entityType.getName());
+          throw new OrmException(
+              "PrimaryKey " + m.getName() + " must return " + entityType.getName());
         }
         initPrimaryKey(m.getName(), m.getAnnotation(PrimaryKey.class));
 
       } else if (m.getAnnotation(Query.class) != null) {
         if (!ResultSet.class.isAssignableFrom(m.getReturnType())
             || !(m.getGenericReturnType() instanceof ParameterizedType)
-            || ((ParameterizedType) m.getGenericReturnType())
-                .getActualTypeArguments()[0] != entityType) {
-          throw new OrmException("Query " + m.getName() + " must return"
-              + " ResultSet<" + entityType.getName() + ">");
+            || ((ParameterizedType) m.getGenericReturnType()).getActualTypeArguments()[0]
+                != entityType) {
+          throw new OrmException(
+              "Query " + m.getName() + " must return" + " ResultSet<" + entityType.getName() + ">");
         }
         addQuery(new QueryModel(this, m.getName(), m.getAnnotation(Query.class)));
       }
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
index cbec78b..a3a2c0b 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
@@ -21,11 +21,9 @@
 import com.google.gwtorm.server.Relation;
 import com.google.gwtorm.server.Schema;
 import com.google.gwtorm.server.Sequence;
-
 import java.io.PrintWriter;
 import java.lang.reflect.Method;
 
-
 public class JavaSchemaModel extends SchemaModel {
   private final Class<?> schema;
 
@@ -33,14 +31,12 @@
     schema = schemaInterface;
 
     if (!schema.isInterface()) {
-      throw new OrmException("Schema " + schema.getName()
-          + " must be an interface");
+      throw new OrmException("Schema " + schema.getName() + " must be an interface");
     }
 
-    if (schema.getInterfaces().length != 1
-        || schema.getInterfaces()[0] != Schema.class) {
-      throw new OrmException("Schema " + schema.getName()
-          + " must only extend " + Schema.class.getName());
+    if (schema.getInterfaces().length != 1 || schema.getInterfaces()[0] != Schema.class) {
+      throw new OrmException(
+          "Schema " + schema.getName() + " must only extend " + Schema.class.getName());
     }
 
     for (final Method m : schema.getDeclaredMethods()) {
diff --git a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
index 900ce02..986d72e 100644
--- a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
+++ b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
@@ -18,9 +18,6 @@
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.schema.RelationModel;
 import com.google.gwtorm.schema.Util;
-
-import org.objectweb.asm.Type;
-
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -28,6 +25,7 @@
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
+import org.objectweb.asm.Type;
 
 class ProtoFileGenerator {
   private static final Comparator<ColumnModel> COLUMN_COMPARATOR =
@@ -86,18 +84,28 @@
     out.print("message Any" + schemaName + "PrimaryKey {\n");
     for (RelationModel r : sortRelations(rels)) {
       ColumnModel pk = r.getPrimaryKey().getField();
-      out.print("\toptional " + getType(pk) + " "
-          + r.getRelationName().toLowerCase() + " = " + r.getRelationID()
-          + ";\n");
+      out.print(
+          "\toptional "
+              + getType(pk)
+              + " "
+              + r.getRelationName().toLowerCase()
+              + " = "
+              + r.getRelationID()
+              + ";\n");
     }
     out.print("}\n");
     out.print("\n");
 
     out.print("message Any" + schemaName + " {\n");
     for (RelationModel r : sortRelations(rels)) {
-      out.print("\toptional " + getMessageName(r) + " "
-          + r.getRelationName().toLowerCase() + " = " + r.getRelationID()
-          + ";\n");
+      out.print(
+          "\toptional "
+              + getMessageName(r)
+              + " "
+              + r.getRelationName().toLowerCase()
+              + " = "
+              + r.getRelationID()
+              + ";\n");
     }
     out.print("}\n");
   }
@@ -121,8 +129,7 @@
     out.print("}\n\n");
   }
 
-  private void generateMessage(ColumnModel parent, PrintWriter out,
-      boolean required) {
+  private void generateMessage(ColumnModel parent, PrintWriter out, boolean required) {
     // Handle base cases
     if (!parent.isNested()) {
       return;
@@ -186,8 +193,7 @@
     return list;
   }
 
-  private static List<RelationModel> sortRelations(
-      Collection<RelationModel> rels) {
+  private static List<RelationModel> sortRelations(Collection<RelationModel> rels) {
     ArrayList<RelationModel> list = new ArrayList<>(rels);
     Collections.sort(list, RELATION_COMPARATOR);
     return list;
@@ -210,22 +216,21 @@
       case Type.LONG:
         return "int64";
       case Type.ARRAY:
-      case Type.OBJECT: {
-        if (clazz == byte[].class) {
-          return "bytes";
-        } else if (clazz == String.class) {
-          return "string";
-        } else if (clazz == java.sql.Timestamp.class) {
-          return "fixed64";
-        } else {
-          throw new RuntimeException("Type " + clazz
-              + " not supported on protobuf!");
+      case Type.OBJECT:
+        {
+          if (clazz == byte[].class) {
+            return "bytes";
+          } else if (clazz == String.class) {
+            return "string";
+          } else if (clazz == java.sql.Timestamp.class) {
+            return "fixed64";
+          } else {
+            throw new RuntimeException("Type " + clazz + " not supported on protobuf!");
+          }
         }
-      }
 
       default:
-        throw new RuntimeException("Type " + clazz
-            + " not supported on protobuf!");
+        throw new RuntimeException("Type " + clazz + " not supported on protobuf!");
     }
   }
 }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java b/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
index b45da82..5b26cd6 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
@@ -18,7 +18,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -41,8 +40,7 @@
   }
 
   @Override
-  public OrmException convertError(String op, String entity,
-      SQLException err) {
+  public OrmException convertError(String op, String entity, SQLException err) {
     switch (getSQLStateInt(err)) {
       case 23505: // DUPLICATE_KEY_1
         return new OrmDuplicateKeyException(entity, err);
@@ -62,9 +60,8 @@
     Statement s = db.createStatement();
     try {
       ResultSet rs =
-          s.executeQuery("SELECT SEQNAME"
-              + " FROM SYSCAT.SEQUENCES"
-              + " WHERE SEQSCHEMA = CURRENT_SCHEMA");
+          s.executeQuery(
+              "SELECT SEQNAME" + " FROM SYSCAT.SEQUENCES" + " WHERE SEQSCHEMA = CURRENT_SCHEMA");
       try {
         HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
@@ -83,9 +80,9 @@
   public Set<String> listTables(Connection db) throws SQLException {
     Statement s = db.createStatement();
     try {
-      ResultSet rs = s.executeQuery("SELECT TABNAME"
-          + " FROM SYSCAT.TABLES"
-          + " WHERE TABSCHEMA = CURRENT_SCHEMA");
+      ResultSet rs =
+          s.executeQuery(
+              "SELECT TABNAME" + " FROM SYSCAT.TABLES" + " WHERE TABSCHEMA = CURRENT_SCHEMA");
       try {
         Set<String> tables = new HashSet<>();
         while (rs.next()) {
@@ -101,10 +98,11 @@
   }
 
   @Override
-  public Set<String> listIndexes(final Connection db, String tableName)
-      throws SQLException {
-    PreparedStatement s = db.prepareStatement("SELECT distinct INDNAME"
-        + " FROM syscat.indexes WHERE TABNAME = ? AND TABSCHEMA = CURRENT_SCHEMA");
+  public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
+    PreparedStatement s =
+        db.prepareStatement(
+            "SELECT distinct INDNAME"
+                + " FROM syscat.indexes WHERE TABNAME = ? AND TABSCHEMA = CURRENT_SCHEMA");
     try {
       s.setString(1, tableName.toUpperCase());
       ResultSet rs = s.executeQuery();
@@ -123,8 +121,7 @@
   }
 
   @Override
-  public void renameTable(StatementExecutor e, String from, String to)
-      throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     StringBuilder r = new StringBuilder();
     r.append("RENAME TABLE ");
     r.append(from);
@@ -134,8 +131,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor stmt, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java b/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
index 690ed94..e8cd2ce 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
@@ -18,7 +18,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -70,8 +69,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor e, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     StringBuffer sb = new StringBuffer();
     sb.append("RENAME COLUMN ");
     sb.append(tableName);
@@ -83,8 +83,7 @@
   }
 
   @Override
-  public void renameTable(StatementExecutor e, String from, String to)
-      throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("RENAME TABLE ");
     r.append(from);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
index c676715..4af606c 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
@@ -18,7 +18,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -34,8 +33,7 @@
   }
 
   @Override
-  public OrmException convertError(final String op, final String entity,
-      final SQLException err) {
+  public OrmException convertError(final String op, final String entity, final SQLException err) {
     switch (getSQLStateInt(err)) {
       case 23001: // UNIQUE CONSTRAINT VIOLATION
       case 23505: // DUPLICATE_KEY_1
@@ -56,9 +54,10 @@
     Statement s = db.createStatement();
     try {
       ResultSet rs =
-          s.executeQuery("SELECT SEQUENCE_NAME"
-              + " FROM INFORMATION_SCHEMA.SEQUENCES"
-              + " WHERE SEQUENCE_SCHEMA = 'PUBLIC'");
+          s.executeQuery(
+              "SELECT SEQUENCE_NAME"
+                  + " FROM INFORMATION_SCHEMA.SEQUENCES"
+                  + " WHERE SEQUENCE_SCHEMA = 'PUBLIC'");
       try {
         HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
@@ -74,8 +73,8 @@
   }
 
   @Override
-  public void addColumn(StatementExecutor stmt, String tableName,
-      ColumnModel col) throws OrmException {
+  public void addColumn(StatementExecutor stmt, String tableName, ColumnModel col)
+      throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
@@ -99,8 +98,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor stmt, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java b/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
index c67fca7..db2fbf7 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
@@ -19,7 +19,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -33,40 +32,44 @@
 public class DialectHANA extends SqlDialect {
 
   public DialectHANA() {
-    types.put(String.class, new SqlStringTypeInfo() {
-      @Override
-      public String getSqlType(ColumnModel col, SqlDialect dialect) {
-        Column column = col.getColumnAnnotation();
-        StringBuilder r = new StringBuilder();
+    types.put(
+        String.class,
+        new SqlStringTypeInfo() {
+          @Override
+          public String getSqlType(ColumnModel col, SqlDialect dialect) {
+            Column column = col.getColumnAnnotation();
+            StringBuilder r = new StringBuilder();
 
-        if (column.length() <= 0) {
-          r.append("NVARCHAR(255)");
-          if (col.isNotNull()) {
-            r.append(" DEFAULT ''");
+            if (column.length() <= 0) {
+              r.append("NVARCHAR(255)");
+              if (col.isNotNull()) {
+                r.append(" DEFAULT ''");
+              }
+            } else if (column.length() <= 5000) {
+              r.append("NVARCHAR(" + column.length() + ")");
+              if (col.isNotNull()) {
+                r.append(" DEFAULT ''");
+              }
+            } else {
+              r.append("NCLOB");
+            }
+
+            if (col.isNotNull()) {
+              r.append(" NOT NULL");
+            }
+
+            return r.toString();
           }
-        } else if (column.length() <= 5000) {
-          r.append("NVARCHAR(" + column.length() + ")");
-          if (col.isNotNull()) {
-            r.append(" DEFAULT ''");
+        });
+    types.put(
+        Boolean.TYPE,
+        new SqlBooleanTypeInfo() {
+          @Override
+          public String getCheckConstraint(ColumnModel column, SqlDialect dialect) {
+            // check constraints are not supported by HANA
+            return null;
           }
-        } else {
-          r.append("NCLOB");
-        }
-
-        if (col.isNotNull()) {
-          r.append(" NOT NULL");
-        }
-
-        return r.toString();
-      }
-    });
-    types.put(Boolean.TYPE, new SqlBooleanTypeInfo() {
-      @Override
-      public String getCheckConstraint(ColumnModel column, SqlDialect dialect) {
-        // check constraints are not supported by HANA
-        return null;
-      }
-    });
+        });
     typeNames.put(Types.INTEGER, "INTEGER");
   }
 
@@ -85,8 +88,7 @@
   }
 
   @Override
-  public void dropColumn(StatementExecutor e, String tableName, String column)
-      throws OrmException {
+  public void dropColumn(StatementExecutor e, String tableName, String column) throws OrmException {
     StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
@@ -112,14 +114,12 @@
   }
 
   @Override
-  public Set<String> listIndexes(Connection db, String tableName)
-      throws SQLException {
+  public Set<String> listIndexes(Connection db, String tableName) throws SQLException {
     return listNamesFromSystemTable(db, "INDEX_NAME", "INDEXES");
   }
 
   @Override
-  public Set<String> listColumns(Connection db, String tableName)
-      throws SQLException {
+  public Set<String> listColumns(Connection db, String tableName) throws SQLException {
     String sql =
         "SELECT COLUMN_NAME FROM TABLE_COLUMNS"
             + " WHERE SCHEMA_NAME = CURRENT_SCHEMA AND TABLE_NAME = ?";
@@ -144,8 +144,8 @@
     return names;
   }
 
-  private static Set<String> listNamesFromSystemTable(Connection db,
-      String columnName, String tableName) throws SQLException {
+  private static Set<String> listNamesFromSystemTable(
+      Connection db, String columnName, String tableName) throws SQLException {
     StringBuilder r = new StringBuilder();
     r.append("SELECT ");
     r.append(columnName);
@@ -159,8 +159,7 @@
   }
 
   @Override
-  public void renameTable(StatementExecutor e, String from, String to)
-      throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     StringBuilder r = new StringBuilder();
     r.append("RENAME TABLE ");
     r.append(from);
@@ -188,8 +187,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor e, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     StringBuilder s = new StringBuilder();
     s.append("RENAME COLUMN ");
     s.append(tableName).append(".").append(fromColumn);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
index df3ac31..1234a48 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
@@ -18,7 +18,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -56,8 +55,7 @@
     final Statement s = conn.createStatement();
     try {
       // lists sequences from schema associated with the current connection only
-      final ResultSet rs =
-          s.executeQuery("SELECT sequence_name FROM sequences");
+      final ResultSet rs = s.executeQuery("SELECT sequence_name FROM sequences");
       try {
         HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
@@ -73,8 +71,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor e, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     final StringBuilder s = new StringBuilder();
     s.append("RENAME COLUMN ");
     s.append(tableName).append(".").append(fromColumn);
@@ -106,8 +105,7 @@
   }
 
   @Override
-  public void renameTable(StatementExecutor e, String from, String to)
-      throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("RENAME TABLE ");
     r.append(from);
@@ -115,5 +113,4 @@
     r.append(to);
     e.execute(r.toString());
   }
-
 }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
index 521a88f..a233dce 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
@@ -20,7 +20,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -34,46 +33,50 @@
 /** Dialect for <a href="http://www.mysql.com/">MySQL</a> */
 public class DialectMySQL extends SqlDialect {
   public DialectMySQL() {
-    types.put(String.class, new SqlStringTypeInfo() {
-      @Override
-      public String getSqlType(final ColumnModel col, final SqlDialect dialect) {
-        final Column column = col.getColumnAnnotation();
-        final StringBuilder r = new StringBuilder();
+    types.put(
+        String.class,
+        new SqlStringTypeInfo() {
+          @Override
+          public String getSqlType(final ColumnModel col, final SqlDialect dialect) {
+            final Column column = col.getColumnAnnotation();
+            final StringBuilder r = new StringBuilder();
 
-        if (column.length() <= 0) {
-          r.append("VARCHAR(255) BINARY");
-          if (col.isNotNull()) {
-            r.append(" DEFAULT ''");
+            if (column.length() <= 0) {
+              r.append("VARCHAR(255) BINARY");
+              if (col.isNotNull()) {
+                r.append(" DEFAULT ''");
+              }
+            } else if (column.length() <= 255) {
+              r.append("VARCHAR(" + column.length() + ") BINARY");
+              if (col.isNotNull()) {
+                r.append(" DEFAULT ''");
+              }
+            } else {
+              r.append(dialect.getSqlTypeName(Types.LONGVARCHAR));
+            }
+
+            if (col.isNotNull()) {
+              r.append(" NOT NULL");
+            }
+
+            return r.toString();
           }
-        } else if (column.length() <= 255) {
-          r.append("VARCHAR(" + column.length() + ") BINARY");
-          if (col.isNotNull()) {
-            r.append(" DEFAULT ''");
+        });
+    types.put(
+        Timestamp.class,
+        new SqlTimestampTypeInfo() {
+          @Override
+          public String getSqlType(ColumnModel col, SqlDialect dialect) {
+            final StringBuilder r = new StringBuilder();
+            r.append(dialect.getSqlTypeName(getSqlTypeConstant()));
+            if (col.isNotNull()) {
+              r.append(" NOT NULL");
+            } else {
+              r.append(" NULL DEFAULT NULL");
+            }
+            return r.toString();
           }
-        } else {
-          r.append(dialect.getSqlTypeName(Types.LONGVARCHAR));
-        }
-
-        if (col.isNotNull()) {
-          r.append(" NOT NULL");
-        }
-
-        return r.toString();
-      }
-    });
-    types.put(Timestamp.class, new SqlTimestampTypeInfo() {
-      @Override
-      public String getSqlType(ColumnModel col, SqlDialect dialect) {
-        final StringBuilder r = new StringBuilder();
-        r.append(dialect.getSqlTypeName(getSqlTypeConstant()));
-        if (col.isNotNull()) {
-          r.append(" NOT NULL");
-        } else {
-          r.append(" NULL DEFAULT NULL");
-        }
-        return r.toString();
-      }
-    });
+        });
   }
 
   @Override
@@ -106,13 +109,11 @@
   }
 
   @Override
-  public long nextLong(final Connection conn, final String seqname)
-      throws OrmException {
+  public long nextLong(final Connection conn, final String seqname) throws OrmException {
     try {
       final Statement st = conn.createStatement();
       try {
-        st.execute("INSERT INTO " + seqname + "(s)VALUES(NULL)",
-            Statement.RETURN_GENERATED_KEYS);
+        st.execute("INSERT INTO " + seqname + "(s)VALUES(NULL)", Statement.RETURN_GENERATED_KEYS);
         final long r;
         final ResultSet rs = st.getGeneratedKeys();
         try {
@@ -168,8 +169,7 @@
     }
   }
 
-  private boolean isSequence(Connection db, String tableName)
-      throws SQLException {
+  private boolean isSequence(Connection db, String tableName) throws SQLException {
     final DatabaseMetaData meta = db.getMetaData();
     if (meta.storesUpperCaseIdentifiers()) {
       tableName = tableName.toUpperCase();
@@ -195,8 +195,7 @@
   }
 
   @Override
-  public void renameTable(StatementExecutor e, String from,
-      String to) throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("RENAME TABLE ");
     r.append(from);
@@ -207,8 +206,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor stmt, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     StringBuffer r = new StringBuffer();
     r.append("ALTER TABLE ");
     r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
index b96081a..bb44604 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
@@ -18,7 +18,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -44,6 +43,7 @@
   public boolean canDetermineIndividualBatchUpdateCounts() {
     return false;
   }
+
   @Override
   public boolean canDetermineTotalBatchUpdateCount() {
     return false;
@@ -69,10 +69,10 @@
   }
 
   @Override
-  public Set<String> listIndexes(final Connection db, String tableName)
-      throws SQLException {
-    PreparedStatement s = db.prepareStatement("SELECT distinct index_name"
-        + " FROM user_indexes WHERE table_name = ?");
+  public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
+    PreparedStatement s =
+        db.prepareStatement(
+            "SELECT distinct index_name" + " FROM user_indexes WHERE table_name = ?");
     try {
       s.setString(1, tableName.toUpperCase());
       ResultSet rs = s.executeQuery();
@@ -110,8 +110,8 @@
   }
 
   @Override
-  public void addColumn(StatementExecutor stmt, String tableName,
-      ColumnModel col) throws OrmException {
+  public void addColumn(StatementExecutor stmt, String tableName, ColumnModel col)
+      throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
@@ -123,8 +123,9 @@
   }
 
   @Override
-  public void renameColumn(StatementExecutor e, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     StringBuffer sb = new StringBuffer();
     sb.append("ALTER TABLE ");
     sb.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
index fb8a75e..b04ba19 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
@@ -19,7 +19,6 @@
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -51,8 +50,7 @@
   }
 
   @Override
-  public OrmException convertError(final String op, final String entity,
-      final SQLException err) {
+  public OrmException convertError(final String op, final String entity, final SQLException err) {
     switch (getSQLStateInt(err)) {
       case 23505: // UNIQUE CONSTRAINT VIOLATION
         return new OrmDuplicateKeyException(entity, err);
@@ -72,14 +70,15 @@
   }
 
   @Override
-  public void appendCreateTableStorage(final StringBuilder sqlBuffer,
-      final RelationModel relationModel) {
+  public void appendCreateTableStorage(
+      final StringBuilder sqlBuffer, final RelationModel relationModel) {
     sqlBuffer.append("WITH (OIDS = FALSE)");
   }
 
   @Override
-  public void renameColumn(StatementExecutor stmt, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException {
+  public void renameColumn(
+      StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
@@ -94,8 +93,7 @@
   public Set<String> listSequences(Connection db) throws SQLException {
     Statement s = db.createStatement();
     try {
-      ResultSet rs =
-          s.executeQuery("SELECT relname FROM pg_class WHERE relkind = 'S'");
+      ResultSet rs = s.executeQuery("SELECT relname FROM pg_class WHERE relkind = 'S'");
       try {
         HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
@@ -112,8 +110,8 @@
 
   private static class Pre82 extends DialectPostgreSQL {
     @Override
-    public void appendCreateTableStorage(final StringBuilder sqlBuffer,
-        final RelationModel relationModel) {
+    public void appendCreateTableStorage(
+        final StringBuilder sqlBuffer, final RelationModel relationModel) {
       sqlBuffer.append("WITHOUT OIDS");
     }
   }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
index cf6e54f..437a2b9 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
@@ -16,13 +16,11 @@
 
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.Types;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-import java.sql.Types;
-
 public class SqlBooleanTypeInfo extends SqlTypeInfo {
   @Override
   public String getSqlType(final ColumnModel column, final SqlDialect dialect) {
@@ -37,8 +35,7 @@
   }
 
   @Override
-  public String getCheckConstraint(final ColumnModel column,
-      final SqlDialect dialect) {
+  public String getCheckConstraint(final ColumnModel column, final SqlDialect dialect) {
     final String name = column.getColumnName();
     final String t = getTrueLiteralValue();
     final String f = getFalseLiteralValue();
@@ -95,9 +92,11 @@
     cgs.pushSqlHandle();
     cgs.pushColumnIndex();
     cgs.invokeResultSetGet(getJavaSqlTypeAlias());
-    cgs.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
-        .getInternalName(String.class), "equals", Type.getMethodDescriptor(
-        Type.BOOLEAN_TYPE, new Type[] {Type.getType(Object.class)}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKEVIRTUAL,
+        Type.getInternalName(String.class),
+        "equals",
+        Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {Type.getType(Object.class)}));
     cgs.fieldSetEnd();
   }
 }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
index eb0f840..b99094e 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
@@ -16,10 +16,6 @@
 
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.server.CodeGenSupport;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -28,6 +24,8 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 public class SqlByteArrayTypeInfo extends SqlTypeInfo {
   @Override
@@ -56,11 +54,15 @@
     cgs.pushSqlHandle();
     cgs.pushColumnIndex();
     cgs.pushFieldValue();
-    cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
-        .getInternalName(SqlByteArrayTypeInfo.class), "toPreparedStatement",
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-            Type.getType(PreparedStatement.class), Type.INT_TYPE,
-            Type.getType(byte[].class)}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKESTATIC,
+        Type.getInternalName(SqlByteArrayTypeInfo.class),
+        "toPreparedStatement",
+        Type.getMethodDescriptor(
+            Type.VOID_TYPE,
+            new Type[] {
+              Type.getType(PreparedStatement.class), Type.INT_TYPE, Type.getType(byte[].class)
+            }));
   }
 
   @Override
@@ -68,15 +70,16 @@
     cgs.fieldSetBegin();
     cgs.pushSqlHandle();
     cgs.pushColumnIndex();
-    cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
-        .getInternalName(SqlByteArrayTypeInfo.class), "fromResultSet", Type
-        .getMethodDescriptor(Type.getType(byte[].class), new Type[] {
-            Type.getType(ResultSet.class), Type.INT_TYPE}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKESTATIC,
+        Type.getInternalName(SqlByteArrayTypeInfo.class),
+        "fromResultSet",
+        Type.getMethodDescriptor(
+            Type.getType(byte[].class), new Type[] {Type.getType(ResultSet.class), Type.INT_TYPE}));
     cgs.fieldSetEnd();
   }
 
-  public static byte[] fromResultSet(final ResultSet rs, final int col)
-      throws SQLException {
+  public static byte[] fromResultSet(final ResultSet rs, final int col) throws SQLException {
     final InputStream r = rs.getBinaryStream(col);
     if (r == null) {
       return null;
@@ -98,8 +101,8 @@
     }
   }
 
-  public static void toPreparedStatement(final PreparedStatement ps,
-      final int col, final byte[] raw) throws SQLException {
+  public static void toPreparedStatement(
+      final PreparedStatement ps, final int col, final byte[] raw) throws SQLException {
     if (raw != null) {
       ps.setBinaryStream(col, new ByteArrayInputStream(raw), raw.length);
     } else {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
index 510993a..b82b7dd 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
@@ -16,12 +16,10 @@
 
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.Types;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-import java.sql.Types;
-
 public class SqlCharTypeInfo extends SqlTypeInfo {
   @Override
   public String getSqlType(final ColumnModel column, final SqlDialect dialect) {
@@ -49,10 +47,11 @@
     cgs.pushSqlHandle();
     cgs.pushColumnIndex();
     cgs.pushFieldValue();
-    cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
-        .getInternalName(Character.class), "toString", Type
-        .getMethodDescriptor(Type.getType(String.class),
-            new Type[] {Type.CHAR_TYPE}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKESTATIC,
+        Type.getInternalName(Character.class),
+        "toString",
+        Type.getMethodDescriptor(Type.getType(String.class), new Type[] {Type.CHAR_TYPE}));
     cgs.invokePreparedStatementSet(getJavaSqlTypeAlias());
   }
 
@@ -63,9 +62,11 @@
     cgs.pushColumnIndex();
     cgs.invokeResultSetGet(getJavaSqlTypeAlias());
     cgs.push(0);
-    cgs.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
-        .getInternalName(String.class), "charAt", Type.getMethodDescriptor(
-        Type.CHAR_TYPE, new Type[] {Type.INT_TYPE}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKEVIRTUAL,
+        Type.getInternalName(String.class),
+        "charAt",
+        Type.getMethodDescriptor(Type.CHAR_TYPE, new Type[] {Type.INT_TYPE}));
     cgs.fieldSetEnd();
   }
 }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
index 127befe..52c7bdc 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.schema.sql;
 
 import com.google.gwtorm.schema.ColumnModel;
-
 import java.sql.Types;
 
 public class SqlDateTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
index 17c1e88..be46505 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
@@ -20,7 +20,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.Sequence;
 import com.google.gwtorm.server.StatementExecutor;
-
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.PreparedStatement;
@@ -36,8 +35,7 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 public abstract class SqlDialect {
-  private static final List<SqlDialect> DIALECTS =
-      new CopyOnWriteArrayList<>();
+  private static final List<SqlDialect> DIALECTS = new CopyOnWriteArrayList<>();
 
   static {
     DIALECTS.add(new DialectDB2());
@@ -55,8 +53,7 @@
     DIALECTS.add(0, dialect);
   }
 
-  public static SqlDialect getDialectFor(Connection c)
-      throws SQLException, OrmException {
+  public static SqlDialect getDialectFor(Connection c) throws SQLException, OrmException {
     String url = c.getMetaData().getURL();
     for (SqlDialect d : DIALECTS) {
       if (d.handles(url, c)) {
@@ -93,13 +90,14 @@
 
   public abstract boolean handles(String url, Connection c) throws SQLException;
 
-  /** Select a better dialect definition for this connection.
+  /**
+   * Select a better dialect definition for this connection.
    *
    * @param c the connection
    * @return a dialect instance
    * @throws SQLException
    */
-  public SqlDialect refine(final Connection c) throws SQLException  {
+  public SqlDialect refine(final Connection c) throws SQLException {
     return this;
   }
 
@@ -154,16 +152,14 @@
    * @param err the driver specific exception.
    * @return an OrmException the caller can throw.
    */
-  public OrmException convertError(final String op, final String entity,
-      final SQLException err) {
+  public OrmException convertError(final String op, final String entity, final SQLException err) {
     if (err.getCause() == null && err.getNextException() != null) {
       err.initCause(err.getNextException());
     }
     return new OrmException(op + " failure on " + entity, err);
   }
 
-  public long nextLong(final Connection conn, final String poolName)
-      throws OrmException {
+  public long nextLong(final Connection conn, final String poolName) throws OrmException {
     final String query = getNextSequenceValueSql(poolName);
     try {
       final Statement st = conn.createStatement();
@@ -217,13 +213,12 @@
   /**
    * Append driver specific storage parameters to a CREATE TABLE statement.
    *
-   * @param sqlBuffer buffer holding the CREATE TABLE, just after the closing
-   *        parenthesis after the column list.
+   * @param sqlBuffer buffer holding the CREATE TABLE, just after the closing parenthesis after the
+   *     column list.
    * @param relationModel the model of the table being generated.
    */
-  public void appendCreateTableStorage(final StringBuilder sqlBuffer,
-      final RelationModel relationModel) {
-  }
+  public void appendCreateTableStorage(
+      final StringBuilder sqlBuffer, final RelationModel relationModel) {}
 
   /**
    * List all tables in the current database schema.
@@ -254,8 +249,7 @@
    * @param to destination table name
    * @throws OrmException the table could not be renamed.
    */
-  public void renameTable(StatementExecutor e, String from,
-      String to) throws OrmException {
+  public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(from);
@@ -273,8 +267,7 @@
    * @return set of declared indexes, in lowercase.
    * @throws SQLException the indexes cannot be listed.
    */
-  public Set<String> listIndexes(final Connection db, String tableName)
-      throws SQLException {
+  public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
     final DatabaseMetaData meta = db.getMetaData();
     if (meta.storesUpperCaseIdentifiers()) {
       tableName = tableName.toUpperCase();
@@ -301,8 +294,7 @@
    * @return set of declared sequences, in lowercase.
    * @throws SQLException the sequence objects cannot be listed.
    */
-  public abstract Set<String> listSequences(final Connection db)
-      throws SQLException;
+  public abstract Set<String> listSequences(final Connection db) throws SQLException;
 
   /**
    * List all columns in the given table name.
@@ -312,8 +304,7 @@
    * @return set of declared columns, in lowercase.
    * @throws SQLException the columns cannot be listed from the relation.
    */
-  public Set<String> listColumns(final Connection db, String tableName)
-      throws SQLException {
+  public Set<String> listColumns(final Connection db, String tableName) throws SQLException {
     final DatabaseMetaData meta = db.getMetaData();
     if (meta.storesUpperCaseIdentifiers()) {
       tableName = tableName.toUpperCase();
@@ -366,8 +357,7 @@
    * @param column name of the column to drop.
    * @throws OrmException the column could not be added.
    */
-  public void dropColumn(StatementExecutor e, String tableName, String column)
-      throws OrmException {
+  public void dropColumn(StatementExecutor e, String tableName, String column) throws OrmException {
     final StringBuilder r = new StringBuilder();
     r.append("ALTER TABLE ");
     r.append(tableName);
@@ -385,8 +375,9 @@
    * @param col destination column definition
    * @throws OrmException the column could not be renamed.
    */
-  public abstract void renameColumn(StatementExecutor e, String tableName,
-      String fromColumn, ColumnModel col) throws OrmException;
+  public abstract void renameColumn(
+      StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+      throws OrmException;
 
   /**
    * Drop one index from a table.
@@ -396,8 +387,7 @@
    * @param name index name.
    * @throws OrmException the index could not be renamed.
    */
-  public void dropIndex(StatementExecutor e, String tableName, String name)
-      throws OrmException {
+  public void dropIndex(StatementExecutor e, String tableName, String name) throws OrmException {
     e.execute(getDropIndexSql(tableName, name));
   }
 
@@ -408,25 +398,22 @@
   protected abstract String getNextSequenceValueSql(String seqname);
 
   /**
-   * Does the array returned by the PreparedStatement.executeBatch method return
-   * the exact number of rows updated for every row in the batch?
+   * Does the array returned by the PreparedStatement.executeBatch method return the exact number of
+   * rows updated for every row in the batch?
    *
-   * @return <code>true</code> if the executeBatch method returns the number of
-   *         rows affected for every row in the batch; <code>false</code> if it
-   *         may return Statement.SUCESS_NO_INFO
+   * @return <code>true</code> if the executeBatch method returns the number of rows affected for
+   *     every row in the batch; <code>false</code> if it may return Statement.SUCESS_NO_INFO
    */
   public boolean canDetermineIndividualBatchUpdateCounts() {
     return true;
-
   }
 
   /**
-   * Can the total number of rows updated by the PreparedStatement.executeBatch
-   * be determined exactly by the SQLDialect.executeBatch method?
+   * Can the total number of rows updated by the PreparedStatement.executeBatch be determined
+   * exactly by the SQLDialect.executeBatch method?
    *
-   * @return <code>true</code> if the SQlDialect.executeBatch method can exactly
-   *         determine the total number of rows updated by a batch;
-   *         <code>false</code> otherwise
+   * @return <code>true</code> if the SQlDialect.executeBatch method can exactly determine the total
+   *     number of rows updated by a batch; <code>false</code> otherwise
    * @see #executeBatch(PreparedStatement)
    */
   public boolean canDetermineTotalBatchUpdateCount() {
@@ -434,11 +421,11 @@
   }
 
   /**
-   * Executes a prepared statement batch and returns the total number of rows
-   * successfully updated or inserted. This method is intended to be overridden.
+   * Executes a prepared statement batch and returns the total number of rows successfully updated
+   * or inserted. This method is intended to be overridden.
    *
-   * If the canDetermineTotalBatchUpdateCount returns false for a particular
-   * SQLDialect, this method should throw an UnsupportedOperationException.
+   * <p>If the canDetermineTotalBatchUpdateCount returns false for a particular SQLDialect, this
+   * method should throw an UnsupportedOperationException.
    *
    * @param ps the prepared statement with the batch to be executed
    * @return the total number of rows affected
@@ -462,8 +449,7 @@
   /**
    * Some databases don't support delimiters (semicolons) in scripts.
    *
-   * @return <code>true</code> statement delimiter is accepted,
-   *         <code>false</code> otherwise
+   * @return <code>true</code> statement delimiter is accepted, <code>false</code> otherwise
    */
   public boolean isStatementDelimiterSupported() {
     return true;
@@ -471,6 +457,7 @@
 
   /**
    * Get the SQL LIMIT command segment in the given dialect
+   *
    * @param limit the limit to apply to the result set (either a number or ?)
    * @return the SQL LIMIT command segment in the given dialect
    */
@@ -479,9 +466,8 @@
   }
 
   /**
-   * Get the driver specific 'table type' to be used in a CREATE TABLE
-   * statement. When creating a CREATE TABLE statement the 'table type' is
-   * appended after a blank following the CREATE keyword.
+   * Get the driver specific 'table type' to be used in a CREATE TABLE statement. When creating a
+   * CREATE TABLE statement the 'table type' is appended after a blank following the CREATE keyword.
    */
   public String getTableTypeSql() {
     return "TABLE";
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
index 23c89da..eace44d 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.schema.sql;
 
 import com.google.gwtorm.schema.ColumnModel;
-
 import java.sql.Types;
 
 public class SqlIntTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
index 940c7fc..0b25b52 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.schema.sql;
 
 import com.google.gwtorm.schema.ColumnModel;
-
 import java.sql.Types;
 
 public class SqlLongTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
index c2f895e..6894a47 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.schema.sql;
 
 import com.google.gwtorm.schema.ColumnModel;
-
 import java.sql.Types;
 
 public class SqlShortTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
index 2c32f1e..d6cbda0 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
@@ -17,10 +17,6 @@
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.server.CodeGenSupport;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
@@ -29,6 +25,8 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 public class SqlStringTypeInfo extends SqlTypeInfo {
   @Override
@@ -70,11 +68,15 @@
       cgs.pushSqlHandle();
       cgs.pushColumnIndex();
       cgs.pushFieldValue();
-      cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
-          .getInternalName(SqlStringTypeInfo.class), "toPreparedStatement",
-          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
-              Type.getType(PreparedStatement.class), Type.INT_TYPE,
-              Type.getType(String.class)}));
+      cgs.mv.visitMethodInsn(
+          Opcodes.INVOKESTATIC,
+          Type.getInternalName(SqlStringTypeInfo.class),
+          "toPreparedStatement",
+          Type.getMethodDescriptor(
+              Type.VOID_TYPE,
+              new Type[] {
+                Type.getType(PreparedStatement.class), Type.INT_TYPE, Type.getType(String.class)
+              }));
     }
   }
 
@@ -86,16 +88,18 @@
       cgs.fieldSetBegin();
       cgs.pushSqlHandle();
       cgs.pushColumnIndex();
-      cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
-          .getInternalName(SqlStringTypeInfo.class), "fromResultSet", Type
-          .getMethodDescriptor(Type.getType(String.class), new Type[] {
-              Type.getType(ResultSet.class), Type.INT_TYPE}));
+      cgs.mv.visitMethodInsn(
+          Opcodes.INVOKESTATIC,
+          Type.getInternalName(SqlStringTypeInfo.class),
+          "fromResultSet",
+          Type.getMethodDescriptor(
+              Type.getType(String.class),
+              new Type[] {Type.getType(ResultSet.class), Type.INT_TYPE}));
       cgs.fieldSetEnd();
     }
   }
 
-  public static String fromResultSet(final ResultSet rs, final int col)
-      throws SQLException {
+  public static String fromResultSet(final ResultSet rs, final int col) throws SQLException {
     final Reader r = rs.getCharacterStream(col);
     if (r == null) {
       return null;
@@ -117,8 +121,8 @@
     }
   }
 
-  public static void toPreparedStatement(final PreparedStatement ps,
-      final int col, final String txt) throws SQLException {
+  public static void toPreparedStatement(
+      final PreparedStatement ps, final int col, final String txt) throws SQLException {
     if (txt != null) {
       ps.setCharacterStream(col, new StringReader(txt), txt.length());
     } else {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
index ef60d29..1fb4bb0 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.schema.sql;
 
 import com.google.gwtorm.schema.ColumnModel;
-
 import java.sql.Types;
 
 public class SqlTimestampTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
index f238541..5832c18 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
@@ -16,21 +16,16 @@
 
 import com.google.gwtorm.schema.ColumnModel;
 import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.PreparedStatement;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-import java.sql.PreparedStatement;
-
-
 public abstract class SqlTypeInfo {
-  protected SqlTypeInfo() {
-  }
+  protected SqlTypeInfo() {}
 
   public abstract String getSqlType(ColumnModel column, SqlDialect dialect);
 
-  public String getCheckConstraint(final ColumnModel column,
-      final SqlDialect dialect) {
+  public String getCheckConstraint(final ColumnModel column, final SqlDialect dialect) {
     return null;
   }
 
@@ -49,10 +44,11 @@
     cgs.pushSqlHandle();
     cgs.pushColumnIndex();
     cgs.push(getSqlTypeConstant());
-    cgs.mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type
-        .getInternalName(PreparedStatement.class), "setNull", Type
-        .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE,
-            Type.INT_TYPE}));
+    cgs.mv.visitMethodInsn(
+        Opcodes.INVOKEINTERFACE,
+        Type.getInternalName(PreparedStatement.class),
+        "setNull",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
   }
 
   public void generateResultSetGet(final CodeGenSupport cgs) {
diff --git a/src/main/java/com/google/gwtorm/server/AbstractAccess.java b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
index a814ec8..21988f2 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractAccess.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
@@ -17,14 +17,12 @@
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.gwtorm.client.Key;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-public abstract class AbstractAccess<E, K extends Key<?>>
-    implements Access<E, K> {
+public abstract class AbstractAccess<E, K extends Key<?>> implements Access<E, K> {
   private static final int MAX_TRIES = 10;
 
   @Override
@@ -69,9 +67,8 @@
   }
 
   @Override
-  public E atomicUpdate(final K key, final AtomicUpdate<E> update)
-      throws OrmException {
-    for (int attempts = 1;; attempts++) {
+  public E atomicUpdate(final K key, final AtomicUpdate<E> update) throws OrmException {
+    for (int attempts = 1; ; attempts++) {
       try {
         final E obj = get(key);
         if (obj == null) {
diff --git a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
index f3cf5ce..a6e5c74 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
diff --git a/src/main/java/com/google/gwtorm/server/AbstractSchema.java b/src/main/java/com/google/gwtorm/server/AbstractSchema.java
index 87ced82..83ce259 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractSchema.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractSchema.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 /** Base implementation any generated schema must implement. */
 public abstract class AbstractSchema implements Schema {
   @Override
@@ -29,16 +28,15 @@
 
   /**
    * Obtain the next unique value from a pool of available numbers.
-   * <p>
-   * Frequently the next number will be just an increment of a global counter,
-   * but may be spread across multiple counter ranges to increase concurrency.
    *
-   * @param poolName unique name of the counter within the schema. The
-   *        underlying storage system should use this to identify the counter
-   *        pool to obtain the next value from.
+   * <p>Frequently the next number will be just an increment of a global counter, but may be spread
+   * across multiple counter ranges to increase concurrency.
+   *
+   * @param poolName unique name of the counter within the schema. The underlying storage system
+   *     should use this to identify the counter pool to obtain the next value from.
    * @return a new unique value.
-   * @throws OrmException a value cannot be reserved for the caller, or the pool
-   *         has been exhausted and no new values are available.
+   * @throws OrmException a value cannot be reserved for the caller, or the pool has been exhausted
+   *     and no new values are available.
    */
   protected abstract long nextLong(String poolName) throws OrmException;
 }
diff --git a/src/main/java/com/google/gwtorm/server/Access.java b/src/main/java/com/google/gwtorm/server/Access.java
index 019249b..0126054 100644
--- a/src/main/java/com/google/gwtorm/server/Access.java
+++ b/src/main/java/com/google/gwtorm/server/Access.java
@@ -17,38 +17,34 @@
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.client.Key;
-
 import java.util.Map;
 
 /**
  * Data access interface for an entity type.
- * <p>
- * Applications should extend this interface for each entity type they need to
- * access. At runtime the application extension will be automatically
- * implemented with a generated class, providing concrete implementations for
- * all methods.
- * <p>
- * Instances should be acquired through the application's extension interface of
- * {@link Schema}.
- * <p>
- * Applications should implement a query method using the {@link PrimaryKey}
- * annotation, for example:
+ *
+ * <p>Applications should extend this interface for each entity type they need to access. At runtime
+ * the application extension will be automatically implemented with a generated class, providing
+ * concrete implementations for all methods.
+ *
+ * <p>Instances should be acquired through the application's extension interface of {@link Schema}.
+ *
+ * <p>Applications should implement a query method using the {@link PrimaryKey} annotation, for
+ * example:
  *
  * <pre>
  * public interface FooAccess extends Access&lt;Foo, Foo.Key&gt; {
  *   &#064;PrimaryKey(&quot;key&quot;)
  *   Foo byKey(Foo.Key k) throws OrmException;
  * }
- *</pre>
- *<p>
- * otherwise the primaryKey, get, update and delete operations declared by this
- * interface will be unsupported.
+ * </pre>
  *
- * @param <T> type of the entity. Any object type is suitable, so long as at
- *        least one field uses a {@link Column} annotation.
- * @param <K> type of the primary key of entity. If the primary key is a
- *        primitive type then use Key directly, otherwise use a Key
- *        implementation. Entity specific key subclasses are recommended.
+ * <p>otherwise the primaryKey, get, update and delete operations declared by this interface will be
+ * unsupported.
+ *
+ * @param <T> type of the entity. Any object type is suitable, so long as at least one field uses a
+ *     {@link Column} annotation.
+ * @param <K> type of the primary key of entity. If the primary key is a primitive type then use Key
+ *     directly, otherwise use a Key implementation. Entity specific key subclasses are recommended.
  */
 public interface Access<T extends Object, K extends Key<?>> {
   /** @return the name of this relation. */
@@ -68,8 +64,8 @@
    * Obtain the primary key of an entity instance.
    *
    * @param entity the entity to get the key of; must not be null.
-   * @return the primary key. Null if this entity has no primary key declared,
-   *         or if the primary key does not implement the Key interface.
+   * @return the primary key. Null if this entity has no primary key declared, or if the primary key
+   *     does not implement the Key interface.
    */
   K primaryKey(T entity);
 
@@ -83,10 +79,10 @@
 
   /**
    * Lookup a single entity via its primary key.
-   * <p>
-   * This method is only implemented if the entity's primary key is defined to
-   * be an implementation of the {@link Key} interface. Otherwise the method
-   * throws {@link UnsupportedOperationException}.
+   *
+   * <p>This method is only implemented if the entity's primary key is defined to be an
+   * implementation of the {@link Key} interface. Otherwise the method throws {@link
+   * UnsupportedOperationException}.
    *
    * @param key the primary key instance; must not be null.
    * @return the entity; null if no entity has this key.
@@ -97,33 +93,31 @@
 
   /**
    * Lookup a single entity asynchronously via its primary key.
-   * <p>
-   * This method is only implemented if the entity's primary key is defined to
-   * be an implementation of the {@link Key} interface. Otherwise the method
-   * throws {@link UnsupportedOperationException}.
+   *
+   * <p>This method is only implemented if the entity's primary key is defined to be an
+   * implementation of the {@link Key} interface. Otherwise the method throws {@link
+   * UnsupportedOperationException}.
    *
    * @param key the primary key instance; must not be null.
-   * @return a {@link CheckedFuture} for the entity; the
-   *         {@link CheckedFuture#get()} will return null if no entity has
-   *         this key.
+   * @return a {@link CheckedFuture} for the entity; the {@link CheckedFuture#get()} will return
+   *     null if no entity has this key.
    * @throws UnsupportedOperationException the key type doesn't implement Key.
    */
   CheckedFuture<T, OrmException> getAsync(K key);
 
   /**
    * Lookup multiple entities via their primary key.
-   * <p>
-   * This method is only implemented if the entity's primary key is defined to
-   * be an implementation of the {@link Key} interface. Otherwise the method
-   * throws {@link UnsupportedOperationException}.
-   * <p>
-   * This method is a batch form of {@link #get(Key)} and may be optimized to
-   * reduce round-trips to the data store.
+   *
+   * <p>This method is only implemented if the entity's primary key is defined to be an
+   * implementation of the {@link Key} interface. Otherwise the method throws {@link
+   * UnsupportedOperationException}.
+   *
+   * <p>This method is a batch form of {@link #get(Key)} and may be optimized to reduce round-trips
+   * to the data store.
    *
    * @param keys collection of zero or more keys to perform lookup with.
-   * @return collection of all matching entities; this may be a smaller result
-   *         than the keys supplied if one or more of the keys does not match an
-   *         existing entity.
+   * @return collection of all matching entities; this may be a smaller result than the keys
+   *     supplied if one or more of the keys does not match an existing entity.
    * @throws OrmException the data lookup failed.
    * @throws UnsupportedOperationException the key type doesn't implement Key.
    */
@@ -183,14 +177,13 @@
 
   /**
    * Atomically update a single entity.
-   * <p>
-   * If the entity does not exist, the method returns {@code null} without
-   * invoking {@code update}.
-   * <p>
-   * If the entity exists, the method invokes {@code update} with a current copy
-   * of the entity. The update function should edit the passed instance
-   * in-place. The return value will be returned to the caller, but is otherwise
-   * ignored by this update function.
+   *
+   * <p>If the entity does not exist, the method returns {@code null} without invoking {@code
+   * update}.
+   *
+   * <p>If the entity exists, the method invokes {@code update} with a current copy of the entity.
+   * The update function should edit the passed instance in-place. The return value will be returned
+   * to the caller, but is otherwise ignored by this update function.
    *
    * @param key key which identifies the entity.
    * @param update the update function.
diff --git a/src/main/java/com/google/gwtorm/server/AtomicUpdate.java b/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
index 26bb894..75d107d 100644
--- a/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
+++ b/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
@@ -14,20 +14,17 @@
 
 package com.google.gwtorm.server;
 
-/**
- * Atomically updates exactly one entity.
- */
+/** Atomically updates exactly one entity. */
 public interface AtomicUpdate<T> {
   /**
    * Update the one object, in place.
-   * <p>
-   * This method may be called multiple times, up until the retry limit.
    *
-   * @param row a fresh copy of the object. The updater should modify it in
-   *        place and return, the caller will attempt to rewrite it into the
-   *        database.
-   * @return return value for the application code calling the atomic update;
-   *         should be either {@code instance} or {@code null}.
+   * <p>This method may be called multiple times, up until the retry limit.
+   *
+   * @param row a fresh copy of the object. The updater should modify it in place and return, the
+   *     caller will attempt to rewrite it into the database.
+   * @return return value for the application code calling the atomic update; should be either
+   *     {@code instance} or {@code null}.
    */
   T update(T row);
 }
diff --git a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
index df75300..c14cdc7 100644
--- a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
+++ b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
@@ -15,16 +15,14 @@
 package com.google.gwtorm.server;
 
 import com.google.gwtorm.schema.ColumnModel;
-
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
 import java.lang.reflect.Method;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.util.ArrayList;
 import java.util.List;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
 public class CodeGenSupport implements Opcodes {
   public final MethodVisitor mv;
@@ -128,17 +126,20 @@
     final Method m;
     try {
       m =
-          PreparedStatement.class.getMethod("set" + sqlTypeName, Integer.TYPE,
-              ResultSet.class.getMethod("get" + sqlTypeName, Integer.TYPE)
-                  .getReturnType());
+          PreparedStatement.class.getMethod(
+              "set" + sqlTypeName,
+              Integer.TYPE,
+              ResultSet.class.getMethod("get" + sqlTypeName, Integer.TYPE).getReturnType());
     } catch (SecurityException e) {
       throw new RuntimeException("java.sql has no " + sqlTypeName);
     } catch (NoSuchMethodException e) {
       throw new RuntimeException("java.sql has no " + sqlTypeName, e);
     }
-    mv.visitMethodInsn(INVOKEINTERFACE, Type
-        .getInternalName(PreparedStatement.class), m.getName(), Type
-        .getMethodDescriptor(m));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        Type.getInternalName(PreparedStatement.class),
+        m.getName(),
+        Type.getMethodDescriptor(m));
   }
 
   public void invokeResultSetGet(final String sqlTypeName) {
@@ -150,8 +151,11 @@
     } catch (NoSuchMethodException e) {
       throw new RuntimeException("java.sql has no " + sqlTypeName, e);
     }
-    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(ResultSet.class),
-        m.getName(), Type.getMethodDescriptor(m));
+    mv.visitMethodInsn(
+        INVOKEINTERFACE,
+        Type.getInternalName(ResultSet.class),
+        m.getName(),
+        Type.getMethodDescriptor(m));
   }
 
   public void fieldSetBegin() {
@@ -167,8 +171,8 @@
       mv.visitInsn(DUP);
       mv.visitVarInsn(ASTORE, dupOnSet);
     }
-    mv.visitFieldInsn(PUTFIELD, c.getInternalName(), col.getFieldName(),
-        toType(col).getDescriptor());
+    mv.visitFieldInsn(
+        PUTFIELD, c.getInternalName(), col.getFieldName(), toType(col).getDescriptor());
   }
 
   public void setDupOnFieldSetEnd(final int varIdx) {
@@ -185,8 +189,7 @@
       appendGetField(c.getParent());
     }
     final Type t = containerClass(c);
-    mv.visitFieldInsn(GETFIELD, t.getInternalName(), c.getFieldName(),
-        toType(c).getDescriptor());
+    mv.visitFieldInsn(GETFIELD, t.getInternalName(), c.getFieldName(), toType(c).getDescriptor());
   }
 
   private Type containerClass(final ColumnModel c) {
diff --git a/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java b/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
index 8d9e774..567b83f 100644
--- a/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
+++ b/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -23,12 +22,11 @@
 
 /**
  * Hacked ClassLoader to inject generated code into the parent.
- * <p>
- * This ClassLoader allows our code generators to inject their generated classes
- * into the parent ClassLoader, which should be the same ClassLoader that
- * defined the application's Schema interface extension. This is necessary to
- * ensure the generated classes can access protected and default-access fields
- * within the entities.
+ *
+ * <p>This ClassLoader allows our code generators to inject their generated classes into the parent
+ * ClassLoader, which should be the same ClassLoader that defined the application's Schema interface
+ * extension. This is necessary to ensure the generated classes can access protected and
+ * default-access fields within the entities.
  */
 public class GeneratedClassLoader extends ClassLoader {
   private static final boolean debugCodeGen;
@@ -41,8 +39,8 @@
     Method m;
     try {
       m =
-          ClassLoader.class.getDeclaredMethod("defineClass", String.class,
-              byte[].class, Integer.TYPE, Integer.TYPE);
+          ClassLoader.class.getDeclaredMethod(
+              "defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE);
       m.setAccessible(true);
     } catch (SecurityException e) {
       throw new LinkageError("No defineClass in ClassLoader");
@@ -56,11 +54,9 @@
     super(parent);
   }
 
-  public void defineClass(final String name, final byte[] code)
-      throws OrmException {
+  public void defineClass(final String name, final byte[] code) throws OrmException {
     if (debugCodeGen) {
-      final File outClassFile =
-          new File("generated_classes/" + name.replace('.', '/') + ".class");
+      final File outClassFile = new File("generated_classes/" + name.replace('.', '/') + ".class");
       outClassFile.getParentFile().mkdirs();
       try {
         final FileOutputStream out = new FileOutputStream(outClassFile);
@@ -75,8 +71,7 @@
     }
 
     try {
-      defineClass.invoke(getParent(), name, code, Integer.valueOf(0), Integer
-          .valueOf(code.length));
+      defineClass.invoke(getParent(), name, code, Integer.valueOf(0), Integer.valueOf(code.length));
     } catch (IllegalArgumentException e) {
       throw new OrmException("Unable to inject class " + name, e);
     } catch (SecurityException e) {
diff --git a/src/main/java/com/google/gwtorm/server/ListResultSet.java b/src/main/java/com/google/gwtorm/server/ListResultSet.java
index 019d976..dac3e64 100644
--- a/src/main/java/com/google/gwtorm/server/ListResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/ListResultSet.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
diff --git a/src/main/java/com/google/gwtorm/server/OrmException.java b/src/main/java/com/google/gwtorm/server/OrmException.java
index a5acd32..24325b0 100644
--- a/src/main/java/com/google/gwtorm/server/OrmException.java
+++ b/src/main/java/com/google/gwtorm/server/OrmException.java
@@ -14,9 +14,7 @@
 
 package com.google.gwtorm.server;
 
-/**
- * Any data store read or write error.
- */
+/** Any data store read or write error. */
 @SuppressWarnings("serial")
 public class OrmException extends Exception {
   public OrmException(final String message) {
diff --git a/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java b/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
index 5220a3b..e3fbc4c 100644
--- a/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
+++ b/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
@@ -14,9 +14,7 @@
 
 package com.google.gwtorm.server;
 
-/**
- * Any data store read or write error.
- */
+/** Any data store read or write error. */
 @SuppressWarnings("serial")
 public class OrmRuntimeException extends RuntimeException {
   public OrmRuntimeException(final String message) {
diff --git a/src/main/java/com/google/gwtorm/server/PrimaryKey.java b/src/main/java/com/google/gwtorm/server/PrimaryKey.java
index 73ae5b7..07c2eb6 100644
--- a/src/main/java/com/google/gwtorm/server/PrimaryKey.java
+++ b/src/main/java/com/google/gwtorm/server/PrimaryKey.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -28,8 +27,6 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface PrimaryKey {
-  /**
-   * @return name of the field in the entity which contains the primary key.
-   */
+  /** @return name of the field in the entity which contains the primary key. */
   String value();
 }
diff --git a/src/main/java/com/google/gwtorm/server/Query.java b/src/main/java/com/google/gwtorm/server/Query.java
index d7d0f9b..563c846 100644
--- a/src/main/java/com/google/gwtorm/server/Query.java
+++ b/src/main/java/com/google/gwtorm/server/Query.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -22,17 +21,17 @@
 
 /**
  * Annotation marking a method in an {@link Access} interface as a query.
- * <p>
- * Query methods must return a parameterized {@link ResultSet}, for example:
+ *
+ * <p>Query methods must return a parameterized {@link ResultSet}, for example:
  *
  * <pre>
  * public interface FooAccess extends Access&lt;Foo, Foo.Key&gt; {
  *   &#064;Query(&quot;WHERE a=?&quot;)
  *   ResultSet&lt;Foo&gt; find(int a) throws OrmException;
  * }
- *</pre>
- *<p>
- * Query strings must conform to the following grammar:
+ * </pre>
+ *
+ * <p>Query strings must conform to the following grammar:
  *
  * <pre>
  * [WHERE &lt;condition&gt; [AND &lt;condition&gt; ...]]
@@ -42,16 +41,13 @@
  * &lt;condition&gt; := &lt;property&gt; { &lt; | &lt;= | &gt; | &gt;= | = } &lt;value&gt;
  * &lt;value&gt; := { ? | true | false | &lt;int&gt; | &lt;string&gt; }
  * </pre>
- * <p>
- * Method parameters are bound in order to the placeholders (?) declared in the
- * query conditions. The type of the limit placeholder parameter (if used in the
- * query) must be <code>int</code>.
+ *
+ * <p>Method parameters are bound in order to the placeholders (?) declared in the query conditions.
+ * The type of the limit placeholder parameter (if used in the query) must be <code>int</code>.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface Query {
-  /**
-   * @return the query clause. Defaults to "", matching all entities, no order.
-   */
+  /** @return the query clause. Defaults to "", matching all entities, no order. */
   String value() default "";
 }
diff --git a/src/main/java/com/google/gwtorm/server/Relation.java b/src/main/java/com/google/gwtorm/server/Relation.java
index f4141c6..40d652d 100644
--- a/src/main/java/com/google/gwtorm/server/Relation.java
+++ b/src/main/java/com/google/gwtorm/server/Relation.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -22,9 +21,8 @@
 
 /**
  * Annotation marking a method in a {@link Schema} interface as entity access.
- * <p>
- * Access methods must return an interface extending {@link Access}, for
- * example:
+ *
+ * <p>Access methods must return an interface extending {@link Access}, for example:
  *
  * <pre>
  * public interface FooAccess extends Access&lt;Foo, Foo.Key&gt; {
@@ -35,22 +33,20 @@
  *   FooAccess foos();
  * }
  * </pre>
- * <p>
- * The table name within the data store will be derived from the relation
- * annotation, or the method name.
+ *
+ * <p>The table name within the data store will be derived from the relation annotation, or the
+ * method name.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface Relation {
-  /**
-   * @return the name of the data store table. Defaults to the method name.
-   */
+  /** @return the name of the data store table. Defaults to the method name. */
   String name() default "";
 
   /**
-   * @return the unique ID for this relation. Must be unique among all
-   *         relations, and conform to Protobuf message ID rules. The ID must be
-   *         in the range [1,2^29-1] except 19000 through 19999.
+   * @return the unique ID for this relation. Must be unique among all relations, and conform to
+   *     Protobuf message ID rules. The ID must be in the range [1,2^29-1] except 19000 through
+   *     19999.
    */
   int id();
 }
diff --git a/src/main/java/com/google/gwtorm/server/ResultSet.java b/src/main/java/com/google/gwtorm/server/ResultSet.java
index 18f8c75..25ea15e 100644
--- a/src/main/java/com/google/gwtorm/server/ResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/ResultSet.java
@@ -25,19 +25,18 @@
 public interface ResultSet<T> extends Iterable<T> {
   /**
    * Obtain an iterator to loop through the results.
-   * <p>
-   * The iterator can be obtained only once. When the iterator completes (
-   * <code>hasNext()</code> returns false) {@link #close()} will be
-   * automatically called.
+   *
+   * <p>The iterator can be obtained only once. When the iterator completes ( <code>hasNext()</code>
+   * returns false) {@link #close()} will be automatically called.
    */
   @Override
   Iterator<T> iterator();
 
   /**
    * Materialize all results as a single list.
-   * <p>
-   * Prior to returning {@link #close()} is invoked. This method must not be
-   * combined with {@link #iterator()} on the same instance.
+   *
+   * <p>Prior to returning {@link #close()} is invoked. This method must not be combined with {@link
+   * #iterator()} on the same instance.
    *
    * @return mutable list of the complete results.
    */
@@ -45,9 +44,9 @@
 
   /**
    * Close the result, discarding any further results.
-   * <p>
-   * This method may be invoked more than once. Its main use is to stop
-   * obtaining results before the iterator has finished.
+   *
+   * <p>This method may be invoked more than once. Its main use is to stop obtaining results before
+   * the iterator has finished.
    */
   void close();
 }
diff --git a/src/main/java/com/google/gwtorm/server/Schema.java b/src/main/java/com/google/gwtorm/server/Schema.java
index 2357a89..026bb1d 100644
--- a/src/main/java/com/google/gwtorm/server/Schema.java
+++ b/src/main/java/com/google/gwtorm/server/Schema.java
@@ -14,32 +14,28 @@
 
 package com.google.gwtorm.server;
 
-
 /**
  * Application database definition and top-level schema access.
- * <p>
- * Applications should extend this interface and declare relation methods for
- * each entity/table used. Relation methods must be marked with the
- * {@link Relation} annotation and return an interface extending {@link Access}.
- * At runtime the application extension of Schema will be automatically
- * implemented with a generated class, providing implementations of the Access
+ *
+ * <p>Applications should extend this interface and declare relation methods for each entity/table
+ * used. Relation methods must be marked with the {@link Relation} annotation and return an
+ * interface extending {@link Access}. At runtime the application extension of Schema will be
+ * automatically implemented with a generated class, providing implementations of the Access
  * extensions from each of the declared relation methods.
- * <p>
- * Instances of a schema should be obtained through the
- * {@link com.google.gwtorm.jdbc.Database} class on a pure-JDBC implementation
- * and through <code>GWT.create()</code> on the GWT client side.
- * <p>
- * In the JDBC implementation each Schema instance wraps around a single JDBC
- * Connection object. Therefore a Schema instance has a 1:1 relationship with an
- * active database handle.
- * <p>
- * A Schema instance (as well as its returned Access instances) is not thread
- * safe. Applications must provide their own synchronization, or ensure that at
- * most 1 thread access a Schema instance (or any returned Access instance) at a
- * time. The safest mapping is 1 schema instance per thread, never shared.
- * <p>
- * For example the OurDb schema creates two tables (identical structure) named
- * <code>someFoos</code> and <code>otherFoos</code>:
+ *
+ * <p>Instances of a schema should be obtained through the {@link com.google.gwtorm.jdbc.Database}
+ * class on a pure-JDBC implementation and through <code>GWT.create()</code> on the GWT client side.
+ *
+ * <p>In the JDBC implementation each Schema instance wraps around a single JDBC Connection object.
+ * Therefore a Schema instance has a 1:1 relationship with an active database handle.
+ *
+ * <p>A Schema instance (as well as its returned Access instances) is not thread safe. Applications
+ * must provide their own synchronization, or ensure that at most 1 thread access a Schema instance
+ * (or any returned Access instance) at a time. The safest mapping is 1 schema instance per thread,
+ * never shared.
+ *
+ * <p>For example the OurDb schema creates two tables (identical structure) named <code>someFoos
+ * </code> and <code>otherFoos</code>:
  *
  * <pre>
  * public interface FooAccess extends Access&lt;Foo, Foo.Key&gt; {
@@ -64,10 +60,10 @@
 
   /**
    * Add any missing columns, create any missing tables or sequences.
-   * <p>
-   * This method does not drop any unused columns or tables, leaving them intact
-   * for applications to continue to query after the update. Any unused columns
-   * that are NOT NULL are altered to accept NULL.
+   *
+   * <p>This method does not drop any unused columns or tables, leaving them intact for applications
+   * to continue to query after the update. Any unused columns that are NOT NULL are altered to
+   * accept NULL.
    *
    * @param e executor to perform (or log) the statements.
    * @throws OrmException one or more objects could not be added to the schema.
@@ -76,8 +72,8 @@
 
   /**
    * Drop any unused columns, tables, or sequences.
-   * <p>
-   * This method destroys data, as columns may be removed entirely.
+   *
+   * <p>This method destroys data, as columns may be removed entirely.
    *
    * @param e executor to perform (or log) the statements.
    * @throws OrmException one or more drops could not be completed.
diff --git a/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java b/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
index 95ea82a..175b212 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
@@ -15,15 +15,13 @@
 package com.google.gwtorm.server;
 
 import com.google.gwtorm.schema.Util;
-
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
 /** Generates a factory to efficiently create new Schema instances. */
 public class SchemaConstructorGen<T extends Schema> implements Opcodes {
   private static final String CTX = "schemaArg";
@@ -35,8 +33,7 @@
   private String implClassName;
   private String implTypeName;
 
-  public SchemaConstructorGen(final GeneratedClassLoader loader,
-      final Class<T> c, final Object f) {
+  public SchemaConstructorGen(final GeneratedClassLoader loader, final Class<T> c, final Object f) {
     classLoader = loader;
     schemaImpl = c;
     schemaArg = f;
@@ -51,7 +48,6 @@
     classLoader.defineClass(implClassName, cw.toByteArray());
   }
 
-
   public SchemaFactory<T> create() throws OrmException {
     defineClass();
     try {
@@ -77,34 +73,43 @@
   }
 
   private void init() {
-    implClassName =
-        schemaImpl.getName() + "_Factory_" + Util.createRandomName();
+    implClassName = schemaImpl.getName() + "_Factory_" + Util.createRandomName();
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null, Type
-        .getInternalName(Object.class), new String[] {Type
-        .getInternalName(SchemaFactory.class)});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        Type.getInternalName(Object.class),
+        new String[] {Type.getInternalName(SchemaFactory.class)});
   }
 
   private void declareFactoryField() {
-    cw.visitField(ACC_PRIVATE | ACC_FINAL, CTX,
-        Type.getType(schemaArg.getClass()).getDescriptor(), null, null)
+    cw.visitField(
+            ACC_PRIVATE | ACC_FINAL,
+            CTX,
+            Type.getType(schemaArg.getClass()).getDescriptor(),
+            null,
+            null)
         .visitEnd();
   }
 
   private void implementConstructor() {
     final Type ft = Type.getType(schemaArg.getClass());
     final String consName = "<init>";
-    final String consDesc =
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {ft});
+    final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {ft});
     final MethodVisitor mv;
     mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
-    mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class),
-        consName, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        Type.getInternalName(Object.class),
+        consName,
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, 1);
@@ -119,9 +124,12 @@
     final Type ft = Type.getType(schemaArg.getClass());
     final String typeName = Type.getType(schemaImpl).getInternalName();
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "open", Type
-            .getMethodDescriptor(Type.getType(Schema.class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "open",
+            Type.getMethodDescriptor(Type.getType(Schema.class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
 
     Constructor<?> c = schemaImpl.getDeclaredConstructors()[0];
@@ -131,8 +139,11 @@
     mv.visitInsn(DUP);
     mv.visitVarInsn(ALOAD, 0);
     mv.visitFieldInsn(GETFIELD, implTypeName, CTX, ft.getDescriptor());
-    mv.visitMethodInsn(INVOKESPECIAL, typeName, "<init>", Type
-        .getMethodDescriptor(Type.VOID_TYPE, new Type[] {argType}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        typeName,
+        "<init>",
+        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {argType}));
     mv.visitInsn(ARETURN);
     mv.visitMaxs(-1, -1);
     mv.visitEnd();
diff --git a/src/main/java/com/google/gwtorm/server/SchemaFactory.java b/src/main/java/com/google/gwtorm/server/SchemaFactory.java
index 2cc6d35..3909fca 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaFactory.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaFactory.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 /**
  * Creates new application Schema instances on demand.
  *
@@ -25,9 +24,8 @@
    * Open a new connection to the database and get a Schema wrapper.
    *
    * @return a new connection, wrapped up in the application's Schema.
-   * @throws OrmException the connection could not be opened to the database.
-   *         The exception detail should be examined to determine the root cause
-   *         of the connection failure.
+   * @throws OrmException the connection could not be opened to the database. The exception detail
+   *     should be examined to determine the root cause of the connection failure.
    */
   S open() throws OrmException;
 }
diff --git a/src/main/java/com/google/gwtorm/server/SchemaGen.java b/src/main/java/com/google/gwtorm/server/SchemaGen.java
index b0a44de..cbee521 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaGen.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaGen.java
@@ -18,22 +18,19 @@
 import com.google.gwtorm.schema.SchemaModel;
 import com.google.gwtorm.schema.SequenceModel;
 import com.google.gwtorm.schema.Util;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 /** Generates a concrete implementation of a {@link Schema} extension. */
 public class SchemaGen<S extends AbstractSchema> implements Opcodes {
   public interface AccessGenerator {
-    Class<?> create(GeneratedClassLoader loader, RelationModel rm)
-        throws OrmException;
+    Class<?> create(GeneratedClassLoader loader, RelationModel rm) throws OrmException;
   }
 
   private final GeneratedClassLoader classLoader;
@@ -46,9 +43,12 @@
   private String implClassName;
   private String implTypeName;
 
-  public SchemaGen(final GeneratedClassLoader loader,
-      final SchemaModel schemaModel, final Class<?> databaseType,
-      final Class<S> superType, final AccessGenerator ag) {
+  public SchemaGen(
+      final GeneratedClassLoader loader,
+      final SchemaModel schemaModel,
+      final Class<?> databaseType,
+      final Class<S> superType,
+      final AccessGenerator ag) {
     classLoader = loader;
     schema = schemaModel;
     databaseClass = databaseType;
@@ -100,16 +100,18 @@
       relations.add(new RelationGen(rel, a));
     }
 
-    Collections.sort(relations, new Comparator<RelationGen>() {
-      @Override
-      public int compare(RelationGen a, RelationGen b) {
-        int cmp = a.model.getRelationID() - b.model.getRelationID();
-        if (cmp == 0) {
-          cmp = a.model.getRelationName().compareTo(b.model.getRelationName());
-        }
-        return cmp;
-      }
-    });
+    Collections.sort(
+        relations,
+        new Comparator<RelationGen>() {
+          @Override
+          public int compare(RelationGen a, RelationGen b) {
+            int cmp = a.model.getRelationID() - b.model.getRelationID();
+            if (cmp == 0) {
+              cmp = a.model.getRelationName().compareTo(b.model.getRelationName());
+            }
+            return cmp;
+          }
+        });
   }
 
   private void init() {
@@ -117,9 +119,13 @@
     implTypeName = implClassName.replace('.', '/');
 
     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-    cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null, Type
-        .getInternalName(schemaSuperClass), new String[] {getSchemaClassName()
-        .replace('.', '/')});
+    cw.visit(
+        V1_3,
+        ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+        implTypeName,
+        null,
+        Type.getInternalName(schemaSuperClass),
+        new String[] {getSchemaClassName().replace('.', '/')});
   }
 
   private void implementRelationFields() {
@@ -134,27 +140,41 @@
     final Type dbType = Type.getType(databaseClass);
 
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC, consName, Type.getMethodDescriptor(
-            Type.VOID_TYPE, new Type[] {dbType}), null, null);
+        cw.visitMethod(
+            ACC_PUBLIC,
+            consName,
+            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {dbType}),
+            null,
+            null);
     mv.visitCode();
 
     mv.visitVarInsn(ALOAD, 0);
     mv.visitVarInsn(ALOAD, 1);
-    mv.visitMethodInsn(INVOKESPECIAL, superType.getInternalName(), consName,
-        Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
-            .getType(schemaSuperClass.getDeclaredConstructors()[0]
-                .getParameterTypes()[0])}));
+    mv.visitMethodInsn(
+        INVOKESPECIAL,
+        superType.getInternalName(),
+        consName,
+        Type.getMethodDescriptor(
+            Type.VOID_TYPE,
+            new Type[] {
+              Type.getType(schemaSuperClass.getDeclaredConstructors()[0].getParameterTypes()[0])
+            }));
 
     for (final RelationGen info : relations) {
       mv.visitVarInsn(ALOAD, 0);
       mv.visitTypeInsn(NEW, info.accessType.getInternalName());
       mv.visitInsn(DUP);
       mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, info.accessType.getInternalName(),
-          consName, Type.getMethodDescriptor(Type.VOID_TYPE,
-              new Type[] {superType}));
-      mv.visitFieldInsn(PUTFIELD, implTypeName, info
-          .getAccessInstanceFieldName(), info.accessType.getDescriptor());
+      mv.visitMethodInsn(
+          INVOKESPECIAL,
+          info.accessType.getInternalName(),
+          consName,
+          Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {superType}));
+      mv.visitFieldInsn(
+          PUTFIELD,
+          implTypeName,
+          info.getAccessInstanceFieldName(),
+          info.accessType.getDescriptor());
     }
 
     mv.visitInsn(RETURN);
@@ -166,18 +186,22 @@
     for (final SequenceModel seq : schema.getSequences()) {
       final Type retType = Type.getType(seq.getResultType());
       final MethodVisitor mv =
-          cw
-              .visitMethod(ACC_PUBLIC, seq.getMethodName(), Type
-                  .getMethodDescriptor(retType, new Type[] {}), null,
-                  new String[] {Type.getType(OrmException.class)
-                      .getInternalName()});
+          cw.visitMethod(
+              ACC_PUBLIC,
+              seq.getMethodName(),
+              Type.getMethodDescriptor(retType, new Type[] {}),
+              null,
+              new String[] {Type.getType(OrmException.class).getInternalName()});
       mv.visitCode();
 
       mv.visitVarInsn(ALOAD, 0);
       mv.visitLdcInsn(seq.getSequenceName());
-      mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(schemaSuperClass),
-          "nextLong", Type.getMethodDescriptor(Type.getType(Long.TYPE),
-              new Type[] {Type.getType(String.class)}));
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL,
+          Type.getInternalName(schemaSuperClass),
+          "nextLong",
+          Type.getMethodDescriptor(
+              Type.getType(Long.TYPE), new Type[] {Type.getType(String.class)}));
       if (retType.getSize() == 1) {
         mv.visitInsn(L2I);
         mv.visitInsn(IRETURN);
@@ -197,9 +221,12 @@
 
   private void implementAllRelationsMethod() {
     final MethodVisitor mv =
-        cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "allRelations", Type
-            .getMethodDescriptor(Type.getType(Access[].class), new Type[] {}),
-            null, null);
+        cw.visitMethod(
+            ACC_PUBLIC | ACC_FINAL,
+            "allRelations",
+            Type.getMethodDescriptor(Type.getType(Access[].class), new Type[] {}),
+            null,
+            null);
     mv.visitCode();
 
     final int r = 1;
@@ -214,8 +241,8 @@
       cgs.push(index++);
 
       mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKEVIRTUAL, getImplTypeName(), info.model
-          .getMethodName(), info.getDescriptor());
+      mv.visitMethodInsn(
+          INVOKEVIRTUAL, getImplTypeName(), info.model.getMethodName(), info.getDescriptor());
 
       mv.visitInsn(AASTORE);
     }
@@ -236,8 +263,13 @@
     }
 
     void implementField() {
-      cw.visitField(ACC_PRIVATE | ACC_FINAL, getAccessInstanceFieldName(),
-          accessType.getDescriptor(), null, null).visitEnd();
+      cw.visitField(
+              ACC_PRIVATE | ACC_FINAL,
+              getAccessInstanceFieldName(),
+              accessType.getDescriptor(),
+              null,
+              null)
+          .visitEnd();
     }
 
     String getAccessInstanceFieldName() {
@@ -246,20 +278,20 @@
 
     void implementMethod() {
       final MethodVisitor mv =
-          cw.visitMethod(ACC_PUBLIC | ACC_FINAL, model.getMethodName(),
-              getDescriptor(), null, null);
+          cw.visitMethod(
+              ACC_PUBLIC | ACC_FINAL, model.getMethodName(), getDescriptor(), null, null);
       mv.visitCode();
       mv.visitVarInsn(ALOAD, 0);
-      mv.visitFieldInsn(GETFIELD, implTypeName, getAccessInstanceFieldName(),
-          accessType.getDescriptor());
+      mv.visitFieldInsn(
+          GETFIELD, implTypeName, getAccessInstanceFieldName(), accessType.getDescriptor());
       mv.visitInsn(ARETURN);
       mv.visitMaxs(-1, -1);
       mv.visitEnd();
     }
 
     String getDescriptor() {
-      return Type.getMethodDescriptor(Type.getObjectType(model
-          .getAccessInterfaceName().replace('.', '/')), new Type[] {});
+      return Type.getMethodDescriptor(
+          Type.getObjectType(model.getAccessInterfaceName().replace('.', '/')), new Type[] {});
     }
   }
 }
diff --git a/src/main/java/com/google/gwtorm/server/Sequence.java b/src/main/java/com/google/gwtorm/server/Sequence.java
index 5be3371..45acf3f 100644
--- a/src/main/java/com/google/gwtorm/server/Sequence.java
+++ b/src/main/java/com/google/gwtorm/server/Sequence.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.server;
 
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -22,9 +21,8 @@
 
 /**
  * Annotation marking a method in {@link Schema} interface as number generator.
- * <p>
- * Sequence methods must return a primitive <code>int</code> or
- * <code>long</code> type.
+ *
+ * <p>Sequence methods must return a primitive <code>int</code> or <code>long</code> type.
  *
  * <pre>
  * public interface BarSchema extends Schema {
@@ -32,31 +30,27 @@
  *   int nextId();
  * }
  * </pre>
- * <p>
- * The sequence name will be taken from the method name, after removing the
- * optional prefix "next".
+ *
+ * <p>The sequence name will be taken from the method name, after removing the optional prefix
+ * "next".
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface Sequence {
-  /**
-   * @return the name of the sequence. Defaults to the method name.
-   */
+  /** @return the name of the sequence. Defaults to the method name. */
   String name() default "";
 
   /**
-   * @return the initial value of the sequence. Defaults to 1, or whatever the
-   *         database dialect defaults to if the sequence starting value is not
-   *         supplied in the sequence declaration.
+   * @return the initial value of the sequence. Defaults to 1, or whatever the database dialect
+   *     defaults to if the sequence starting value is not supplied in the sequence declaration.
    */
   long startWith() default 0;
 
   /**
-   * @return maximum number of values to cache in memory from the sequence.
-   *         Defaults to -1, indicating a default caching level should be
-   *         determined by the database. Cached values may be lost (never
-   *         returned by the sequence, creating gaps) if the application or the
-   *         database is shutdown and restarted.
+   * @return maximum number of values to cache in memory from the sequence. Defaults to -1,
+   *     indicating a default caching level should be determined by the database. Cached values may
+   *     be lost (never returned by the sequence, creating gaps) if the application or the database
+   *     is shutdown and restarted.
    */
   int cache() default -1;
 }
diff --git a/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java b/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
index c9076e8..1339542 100644
--- a/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
+++ b/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
@@ -15,14 +15,13 @@
 package com.google.gwtorm.server;
 
 import com.google.gwtorm.client.KeyUtil.Encoder;
-
 import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
 
 public class StandardKeyEncoder extends Encoder {
-  private static final char[] hexc =
-      {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
-          'E', 'F'};
+  private static final char[] hexc = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+  };
   private static final char safe[];
   private static final byte hexb[];
 
@@ -39,21 +38,15 @@
     safe[')'] = ')';
     safe['/'] = '/';
     safe[' '] = '+';
-    for (char c = '0'; c <= '9'; c++)
-      safe[c] = c;
-    for (char c = 'A'; c <= 'Z'; c++)
-      safe[c] = c;
-    for (char c = 'a'; c <= 'z'; c++)
-      safe[c] = c;
+    for (char c = '0'; c <= '9'; c++) safe[c] = c;
+    for (char c = 'A'; c <= 'Z'; c++) safe[c] = c;
+    for (char c = 'a'; c <= 'z'; c++) safe[c] = c;
 
     hexb = new byte['f' + 1];
     Arrays.fill(hexb, (byte) -1);
-    for (char i = '0'; i <= '9'; i++)
-      hexb[i] = (byte) (i - '0');
-    for (char i = 'A'; i <= 'F'; i++)
-      hexb[i] = (byte) ((i - 'A') + 10);
-    for (char i = 'a'; i <= 'f'; i++)
-      hexb[i] = (byte) ((i - 'a') + 10);
+    for (char i = '0'; i <= '9'; i++) hexb[i] = (byte) (i - '0');
+    for (char i = 'A'; i <= 'F'; i++) hexb[i] = (byte) ((i - 'A') + 10);
+    for (char i = 'a'; i <= 'f'; i++) hexb[i] = (byte) ((i - 'a') + 10);
   }
 
   @Override
@@ -89,7 +82,7 @@
     final byte[] b = new byte[e.length()];
     int bPtr = 0;
     try {
-      for (int i = 0; i < e.length();) {
+      for (int i = 0; i < e.length(); ) {
         final char c = e.charAt(i);
         if (c == '%' && i + 2 < e.length()) {
           final int v = (hexb[e.charAt(i + 1)] << 4) | hexb[e.charAt(i + 2)];
@@ -115,4 +108,4 @@
       throw new RuntimeException("No UTF-8 support", e1);
     }
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java b/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
index e985f5b..104068a 100644
--- a/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
@@ -14,16 +14,15 @@
 
 package com.google.gwtorm.client;
 
-import com.google.gwtorm.server.StandardKeyEncoder;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import com.google.gwtorm.server.StandardKeyEncoder;
 import org.junit.Before;
 import org.junit.Test;
 
-
 public class IntKeyTestCase {
   @SuppressWarnings("serial")
   private abstract static class IntKeyImpl<T extends Key<?>> extends IntKey<T> {
diff --git a/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java b/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
index 1e46753..17b298b 100644
--- a/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
@@ -20,15 +20,12 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.gwtorm.server.StandardKeyEncoder;
-
 import org.junit.Before;
 import org.junit.Test;
 
-
 public class LongKeyTestCase {
   @SuppressWarnings("serial")
-  private abstract static class LongKeyImpl<T extends Key<?>> extends
-      LongKey<T> {
+  private abstract static class LongKeyImpl<T extends Key<?>> extends LongKey<T> {
     @Column(id = 1)
     long id;
 
diff --git a/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java b/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
index 0833347..731cf8c 100644
--- a/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
@@ -20,15 +20,12 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.gwtorm.server.StandardKeyEncoder;
-
 import org.junit.Before;
 import org.junit.Test;
 
-
 public class StringKeyTestCase {
   @SuppressWarnings("serial")
-  private abstract static class StringKeyImpl<T extends Key<?>> extends
-      StringKey<T> {
+  private abstract static class StringKeyImpl<T extends Key<?>> extends StringKey<T> {
     @Column(id = 1)
     String name;
 
diff --git a/src/test/java/com/google/gwtorm/data/Address.java b/src/test/java/com/google/gwtorm/data/Address.java
index cc4c907..4bdae52 100644
--- a/src/test/java/com/google/gwtorm/data/Address.java
+++ b/src/test/java/com/google/gwtorm/data/Address.java
@@ -60,8 +60,7 @@
   @Column(id = 3, notNull = false)
   protected byte[] photo;
 
-  protected Address() {
-  }
+  protected Address() {}
 
   public Address(final Address.Key city, final String where) {
     this.city = city;
diff --git a/src/test/java/com/google/gwtorm/data/Person.java b/src/test/java/com/google/gwtorm/data/Person.java
index 13ff465..2bf0a80 100644
--- a/src/test/java/com/google/gwtorm/data/Person.java
+++ b/src/test/java/com/google/gwtorm/data/Person.java
@@ -17,15 +17,13 @@
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.client.StringKey;
 
-
 public class Person {
   @SuppressWarnings("serial")
   public static class Key extends StringKey<com.google.gwtorm.client.Key<?>> {
     @Column(id = 1, length = 20)
     protected String name;
 
-    protected Key() {
-    }
+    protected Key() {}
 
     public Key(final String name) {
       this.name = name;
@@ -51,8 +49,7 @@
   @Column(id = 3)
   protected boolean registered;
 
-  protected Person() {
-  }
+  protected Person() {}
 
   public Person(final Key key, final int age) {
     this.name = key;
diff --git a/src/test/java/com/google/gwtorm/data/Person2.java b/src/test/java/com/google/gwtorm/data/Person2.java
index ab363e7..07a14a5 100644
--- a/src/test/java/com/google/gwtorm/data/Person2.java
+++ b/src/test/java/com/google/gwtorm/data/Person2.java
@@ -16,7 +16,6 @@
 
 import com.google.gwtorm.client.Column;
 
-
 public class Person2 {
   @Column(id = 1)
   protected Person.Key name;
diff --git a/src/test/java/com/google/gwtorm/data/PersonAccess.java b/src/test/java/com/google/gwtorm/data/PersonAccess.java
index af36e7a..c80cce6 100644
--- a/src/test/java/com/google/gwtorm/data/PersonAccess.java
+++ b/src/test/java/com/google/gwtorm/data/PersonAccess.java
@@ -32,8 +32,7 @@
   ResultSet<Person> olderThan(int age) throws OrmException;
 
   @Query("WHERE age > ? ORDER BY name DESC")
-  ResultSet<Person> olderThanDescByName(int age)
-      throws OrmException;
+  ResultSet<Person> olderThanDescByName(int age) throws OrmException;
 
   @Query("WHERE name = 'bob' LIMIT ?")
   ResultSet<Person> firstNBob(int n) throws OrmException;
diff --git a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
index 267bfcc..74e703c 100644
--- a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
+++ b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
@@ -14,7 +14,6 @@
 
 package com.google.gwtorm.jdbc;
 
-
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.doNothing;
@@ -32,13 +31,6 @@
 import com.google.gwtorm.server.OrmConcurrencyException;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-import org.mockito.stubbing.OngoingStubbing;
-
 import java.sql.BatchUpdateException;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -47,6 +39,11 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.mockito.stubbing.OngoingStubbing;
 
 @RunWith(Parameterized.class)
 public abstract class AbstractTestJdbcAccess {
@@ -67,7 +64,7 @@
 
   protected SQLException sqlException = null;
 
-  static abstract class IterableProvider<T> {
+  abstract static class IterableProvider<T> {
     abstract Iterable<T> createIterable(T... ts);
   }
 
@@ -102,12 +99,13 @@
 
   @Parameters
   public static Collection<Object[]> data() {
-    return Arrays.asList(new Object[][] { {LIST_PROVIDER},
-        {UNMODIFIABLE_LIST_PROVIDER}, {LIST_RESULT_SET_PROVIDER},});
+    return Arrays.asList(
+        new Object[][] {
+          {LIST_PROVIDER}, {UNMODIFIABLE_LIST_PROVIDER}, {LIST_RESULT_SET_PROVIDER},
+        });
   }
 
-  public AbstractTestJdbcAccess(IterableProvider<Data> dataProvider)
-      throws SQLException {
+  public AbstractTestJdbcAccess(IterableProvider<Data> dataProvider) throws SQLException {
     noData = dataProvider.createIterable();
     oneRow = dataProvider.createIterable(new Data(1));
     twoRows = dataProvider.createIterable(new Data(1), new Data(2));
@@ -119,8 +117,8 @@
 
   protected abstract SqlDialect createDialect() throws SQLException;
 
-  private PreparedStatement stubStatementWithUpdateCounts(String command,
-      final int... updateCounts) throws SQLException {
+  private PreparedStatement stubStatementWithUpdateCounts(String command, final int... updateCounts)
+      throws SQLException {
     PreparedStatement ps = mock(PreparedStatement.class);
 
     // batching
@@ -162,8 +160,7 @@
     return classUnderTest;
   }
 
-  private static JdbcSchema setupSchema(final SqlDialect dialect,
-      final Connection conn) {
+  private static JdbcSchema setupSchema(final SqlDialect dialect, final Connection conn) {
     @SuppressWarnings("rawtypes")
     Database db = mock(Database.class);
     try {
@@ -186,8 +183,8 @@
     assertExpectedIdsUsed(ps, ids);
   }
 
-  protected static void assertUsedNonBatchingOnly(PreparedStatement ps,
-      int... ids) throws SQLException {
+  protected static void assertUsedNonBatchingOnly(PreparedStatement ps, int... ids)
+      throws SQLException {
     verify(ps, never()).addBatch();
     verify(ps, never()).executeBatch();
     verify(ps, times(ids.length)).executeUpdate();
@@ -198,14 +195,13 @@
     verifyZeroInteractions(insert);
   }
 
-  protected abstract void assertCorrectUpdating(PreparedStatement ps,
-      int... ids) throws SQLException;
+  protected abstract void assertCorrectUpdating(PreparedStatement ps, int... ids)
+      throws SQLException;
 
-  protected abstract void assertCorrectAttempting(PreparedStatement ps,
-      int... ids) throws SQLException;
+  protected abstract void assertCorrectAttempting(PreparedStatement ps, int... ids)
+      throws SQLException;
 
-  private static void assertExpectedIdsUsed(PreparedStatement ps, int... ids)
-      throws SQLException {
+  private static void assertExpectedIdsUsed(PreparedStatement ps, int... ids) throws SQLException {
     for (int id : ids) {
       verify(ps).setInt(1, id);
     }
@@ -228,8 +224,7 @@
   @Test
   public void testInsertOneException() throws SQLException {
     sqlException = new BatchUpdateException();
-    PreparedStatement insert =
-        stubStatementThrowExceptionOnExecute(INSERT, sqlException);
+    PreparedStatement insert = stubStatementThrowExceptionOnExecute(INSERT, sqlException);
     try {
       classUnderTest.insert(oneRow);
       fail("missingException");
@@ -258,8 +253,7 @@
   @Test
   public void testUpdateOneException() throws SQLException {
     sqlException = new BatchUpdateException();
-    PreparedStatement update =
-        stubStatementThrowExceptionOnExecute(UPDATE, sqlException);
+    PreparedStatement update = stubStatementThrowExceptionOnExecute(UPDATE, sqlException);
     try {
       classUnderTest.update(oneRow);
       fail("missingException");
@@ -272,8 +266,7 @@
   }
 
   @Test
-  public void testUpdateTwoConcurrentlyModifiedException() throws SQLException,
-      OrmException {
+  public void testUpdateTwoConcurrentlyModifiedException() throws SQLException, OrmException {
     PreparedStatement update = stubStatementWithUpdateCounts(UPDATE, 0, 0);
     try {
       classUnderTest.update(twoRows);
@@ -303,8 +296,7 @@
   @Test
   public void upsertOneException() throws SQLException {
     SQLException exception = new BatchUpdateException();
-    PreparedStatement update =
-        stubStatementThrowExceptionOnExecute(UPDATE, exception);
+    PreparedStatement update = stubStatementThrowExceptionOnExecute(UPDATE, exception);
     try {
       classUnderTest.upsert(oneRow);
       fail("missingException");
@@ -328,8 +320,7 @@
   }
 
   @Test
-  public void testUpsertTwoNotExistingZeroLengthArray() throws SQLException,
-      OrmException {
+  public void testUpsertTwoNotExistingZeroLengthArray() throws SQLException, OrmException {
     PreparedStatement update = stubStatementWithUpdateCounts(UPDATE);
     PreparedStatement insert = stubStatementWithUpdateCounts(INSERT, 1, 1);
 
@@ -373,8 +364,7 @@
   }
 
   @Test
-  public void testUpsertTwoUpdateCountsAreNull() throws SQLException,
-      OrmException {
+  public void testUpsertTwoUpdateCountsAreNull() throws SQLException, OrmException {
     PreparedStatement update = stubStatementWithUpdateCounts(UPDATE, null);
     PreparedStatement insert = stubStatementWithUpdateCounts(INSERT, 1, 1);
 
@@ -427,7 +417,6 @@
     public Access<?, ?>[] allRelations() {
       throw new UnsupportedOperationException();
     }
-
   }
 
   static class Data {
@@ -449,9 +438,7 @@
       public void fromString(String in) {
         throw new UnsupportedOperationException();
       }
-
     }
-
   }
 
   private static class DataJdbcAccess extends JdbcAccess<Data, Data.DataKey> {
@@ -496,26 +483,22 @@
     }
 
     @Override
-    protected void bindOneInsert(PreparedStatement ps, Data entity)
-        throws SQLException {
+    protected void bindOneInsert(PreparedStatement ps, Data entity) throws SQLException {
       ps.setInt(1, entity.id);
     }
 
     @Override
-    protected void bindOneUpdate(PreparedStatement ps, Data entity)
-        throws SQLException {
+    protected void bindOneUpdate(PreparedStatement ps, Data entity) throws SQLException {
       ps.setInt(1, entity.id);
     }
 
     @Override
-    protected void bindOneDelete(PreparedStatement ps, Data entity)
-        throws SQLException {
+    protected void bindOneDelete(PreparedStatement ps, Data entity) throws SQLException {
       ps.setInt(1, entity.id);
     }
 
     @Override
-    protected void bindOneFetch(java.sql.ResultSet rs, Data entity)
-        throws SQLException {
+    protected void bindOneFetch(java.sql.ResultSet rs, Data entity) throws SQLException {
       throw new UnsupportedOperationException();
     }
 
@@ -528,7 +511,5 @@
     public ResultSet<Data> iterateAllEntities() throws OrmException {
       throw new UnsupportedOperationException();
     }
-
   }
-
 }
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
index 0d687d6..7e3ca88 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
@@ -18,30 +18,25 @@
 import static org.mockito.Mockito.mock;
 
 import com.google.gwtorm.schema.sql.SqlDialect;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
 public class TestJdbcAccessBatching extends AbstractTestJdbcAccess {
 
-  public TestJdbcAccessBatching(IterableProvider<Data> dataProvider)
-      throws SQLException {
+  public TestJdbcAccessBatching(IterableProvider<Data> dataProvider) throws SQLException {
     super(dataProvider);
   }
 
   @Override
-  protected void assertCorrectUpdating(PreparedStatement ps,
-      int ... ids) throws SQLException {
+  protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
     assertUsedBatchingOnly(ps, ids);
   }
 
   @Override
-  protected void assertCorrectAttempting(PreparedStatement ps,
-      int ... ids) throws SQLException {
+  protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
     assertUsedBatchingOnly(ps, ids);
   }
 
@@ -49,5 +44,4 @@
   protected SqlDialect createDialect() {
     return mock(SqlDialect.class, CALLS_REAL_METHODS);
   }
-
 }
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
index 7ab5b80..50297ac 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
@@ -20,30 +20,25 @@
 import static org.mockito.Mockito.when;
 
 import com.google.gwtorm.schema.sql.SqlDialect;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
 public class TestJdbcAccessNonBatching extends AbstractTestJdbcAccess {
 
-  public TestJdbcAccessNonBatching(IterableProvider<Data> dataProvider)
-      throws SQLException {
+  public TestJdbcAccessNonBatching(IterableProvider<Data> dataProvider) throws SQLException {
     super(dataProvider);
   }
 
   @Override
-  protected void assertCorrectUpdating(PreparedStatement ps, int... ids)
-      throws SQLException {
+  protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
     assertUsedNonBatchingOnly(ps, ids);
   }
 
   @Override
-  protected void assertCorrectAttempting(PreparedStatement ps, int... ids)
-      throws SQLException {
+  protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
     assertUsedNonBatchingOnly(ps, ids);
   }
 
@@ -51,10 +46,8 @@
   protected SqlDialect createDialect() {
     final SqlDialect dialect = mock(SqlDialect.class);
     when(dialect.canDetermineIndividualBatchUpdateCounts()).thenReturn(FALSE);
-    when(
-        dialect.convertError(any(String.class), any(String.class),
-            any(SQLException.class))).thenCallRealMethod();
+    when(dialect.convertError(any(String.class), any(String.class), any(SQLException.class)))
+        .thenCallRealMethod();
     return dialect;
   }
-
 }
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
index 9e329aa..9df4d8a 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
@@ -22,32 +22,27 @@
 import static org.mockito.Mockito.when;
 
 import com.google.gwtorm.schema.sql.SqlDialect;
-
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
 @RunWith(Parameterized.class)
 public class TestJdbcAccessTotalUpdateCount extends AbstractTestJdbcAccess {
 
-  public TestJdbcAccessTotalUpdateCount(IterableProvider<Data> dataProvider)
-      throws SQLException {
+  public TestJdbcAccessTotalUpdateCount(IterableProvider<Data> dataProvider) throws SQLException {
     super(dataProvider);
   }
 
   @Override
-  protected void assertCorrectUpdating(PreparedStatement ps, int... ids)
-      throws SQLException {
+  protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
     verify(dialect).executeBatch(ps);
   }
 
   @Override
-  protected void assertCorrectAttempting(PreparedStatement ps, int... ids)
-      throws SQLException {
+  protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
     assertUsedNonBatchingOnly(ps, ids);
   }
 
@@ -56,25 +51,24 @@
     SqlDialect dialect = mock(SqlDialect.class);
     when(dialect.canDetermineIndividualBatchUpdateCounts()).thenReturn(FALSE);
     when(dialect.canDetermineTotalBatchUpdateCount()).thenReturn(TRUE);
-    when(dialect.executeBatch(any(PreparedStatement.class))).thenAnswer(
-        new Answer<Integer>() {
+    when(dialect.executeBatch(any(PreparedStatement.class)))
+        .thenAnswer(
+            new Answer<Integer>() {
 
-          @Override
-          public Integer answer(InvocationOnMock invocation) throws Throwable {
-            if (sqlException != null) {
-              throw sqlException;
-            }
-            if (totalUpdateCount == null) {
-              throw new IllegalStateException("totalCount is not set");
-            }
-            return totalUpdateCount;
-          }
-        });
-    when(
-        dialect.convertError(any(String.class), any(String.class),
-            any(SQLException.class))).thenCallRealMethod();
+              @Override
+              public Integer answer(InvocationOnMock invocation) throws Throwable {
+                if (sqlException != null) {
+                  throw sqlException;
+                }
+                if (totalUpdateCount == null) {
+                  throw new IllegalStateException("totalCount is not set");
+                }
+                return totalUpdateCount;
+              }
+            });
+    when(dialect.convertError(any(String.class), any(String.class), any(SQLException.class)))
+        .thenCallRealMethod();
 
     return dialect;
   }
-
 }
diff --git a/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java b/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
index 4db5e85..28d8fbb 100644
--- a/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
@@ -25,7 +25,6 @@
 import com.google.gwtorm.schema.java.JavaSchemaModel;
 import com.google.gwtorm.server.GeneratedClassLoader;
 import com.google.gwtorm.server.OrmException;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -76,8 +75,7 @@
 
   @Test
   public void testPersonByNameAge_OrderByName() throws Exception {
-    IndexFunction<Person> idx =
-        index("nameAge", "WHERE name=? AND age=? ORDER BY name");
+    IndexFunction<Person> idx = index("nameAge", "WHERE name=? AND age=? ORDER BY name");
     Assert.assertEquals("nameAge", idx.getName());
 
     IndexKeyBuilder b;
@@ -92,8 +90,7 @@
 
   @Test
   public void testPersonByNameAge_OrderByRegistered() throws Exception {
-    IndexFunction<Person> idx =
-        index("nameAge", "WHERE name=? AND age=? ORDER BY registered");
+    IndexFunction<Person> idx = index("nameAge", "WHERE name=? AND age=? ORDER BY registered");
     Assert.assertEquals("nameAge", idx.getName());
 
     IndexKeyBuilder b;
@@ -104,16 +101,24 @@
     p.register();
     assertTrue(idx.includes(p));
     idx.encode(b, p);
-    assertEqualToBuilderResult(new byte[] {'q', 0x00, 0x01, // name
-        0x01, 42, 0x00, 0x01, // age
-        0x01, 0x01 // registered
-        }, b);
+    assertEqualToBuilderResult(
+        new byte[] {
+          'q',
+          0x00,
+          0x01, // name
+          0x01,
+          42,
+          0x00,
+          0x01, // age
+          0x01,
+          0x01 // registered
+        },
+        b);
   }
 
   @Test
   public void testPersonByNameRange_OrderByName() throws Exception {
-    IndexFunction<Person> idx =
-        index("nameSuggest", "WHERE name >= ? AND name <= ? ORDER BY name");
+    IndexFunction<Person> idx = index("nameSuggest", "WHERE name >= ? AND name <= ? ORDER BY name");
     assertEquals("nameSuggest", idx.getName());
 
     IndexKeyBuilder b;
@@ -128,8 +133,7 @@
 
   @Test
   public void testOnlyRegistered() throws Exception {
-    IndexFunction<Person> idx =
-        index("isregistered", "WHERE registered = true ORDER BY name");
+    IndexFunction<Person> idx = index("isregistered", "WHERE registered = true ORDER BY name");
     assertEquals("isregistered", idx.getName());
 
     IndexKeyBuilder b;
@@ -147,8 +151,7 @@
 
   @Test
   public void testOnlyAge42() throws Exception {
-    IndexFunction<Person> idx =
-        index("isOldEnough", "WHERE age = 42 ORDER BY name");
+    IndexFunction<Person> idx = index("isOldEnough", "WHERE age = 42 ORDER BY name");
     assertEquals("isOldEnough", idx.getName());
 
     IndexKeyBuilder b;
@@ -185,11 +188,11 @@
   }
 
   @SuppressWarnings("rawtypes")
-  private IndexFunction<Person> index(String name, String query)
-      throws OrmException {
+  private IndexFunction<Person> index(String name, String query) throws OrmException {
     final QueryModel qm = new QueryModel(people, name, query);
-    return new IndexFunctionGen(new GeneratedClassLoader(Person.class
-        .getClassLoader()), qm, Person.class).create();
+    return new IndexFunctionGen(
+            new GeneratedClassLoader(Person.class.getClassLoader()), qm, Person.class)
+        .create();
   }
 
   private static void assertEqualToBuilderResult(byte[] exp, IndexKeyBuilder ic) {
@@ -205,7 +208,8 @@
     return dst.toString();
   }
 
-  private static final char[] hexchar =
-      {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
-          'a', 'b', 'c', 'd', 'e', 'f'};
+  private static final char[] hexchar = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
+    'a', 'b', 'c', 'd', 'e', 'f'
+  };
 }
diff --git a/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java b/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
index e08059f..804802a 100644
--- a/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
@@ -18,7 +18,7 @@
 
 import org.junit.Test;
 
-public class IndexKeyBuilderTest  {
+public class IndexKeyBuilderTest {
 
   @Test
   public void testInt() {
@@ -85,7 +85,8 @@
     return dst.toString();
   }
 
-  private static final char[] hexchar =
-      {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
-          'a', 'b', 'c', 'd', 'e', 'f'};
+  private static final char[] hexchar = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
+    'a', 'b', 'c', 'd', 'e', 'f'
+  };
 }
diff --git a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
index a89627c..cfd7293 100644
--- a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
@@ -28,16 +28,14 @@
 import com.google.gwtorm.server.Access;
 import com.google.gwtorm.server.OrmConcurrencyException;
 import com.google.gwtorm.server.OrmException;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class NoSqlPhoneBookTest  {
+public class NoSqlPhoneBookTest {
   protected MemoryDatabase<PhoneBookDb> db;
   private List<PhoneBookDb> openSchemas;
 
@@ -166,8 +164,7 @@
     final Person p1 = new Person(new Person.Key("Bob"), 18);
     sp.insert(Collections.singleton(p1));
 
-    final List<Person> list =
-        sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
+    final List<Person> list = sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
     assertNotNull(list);
     assertEquals(1, list.size());
 
@@ -237,8 +234,7 @@
     final Person bob1 = new Person(new Person.Key("Bob"), 18);
     schema.people().insert(Collections.singleton(bob1));
 
-    final Person bob2 =
-        schema.people().get(new Person.Key(bob1.name()));
+    final Person bob2 = schema.people().get(new Person.Key(bob1.name()));
     assertNotNull(bob2);
     assertNotSame(bob1, bob2);
     assertEquals(bob1.name(), bob2.name());
@@ -267,19 +263,16 @@
     final Person bob = new Person(new Person.Key("Bob"), 18);
     schema.people().insert(Collections.singleton(bob));
 
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
 
     bob.register();
     schema.people().update(Collections.singleton(bob));
 
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
 
     bob.unregister();
     schema.people().update(Collections.singleton(bob));
 
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
   }
 }
diff --git a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
index 78f1938..15e1aea 100644
--- a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
+++ b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
@@ -26,9 +26,6 @@
 import com.google.gwtorm.data.Person;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
-
-import org.junit.Test;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -38,19 +35,32 @@
 import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import org.junit.Test;
 
 public class ProtobufEncoderTest {
-  private static final byte[] testingBin = new byte[] {
-  //
-      // name
-      0x0a, 0x09,
-      // name.name
-      0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, //
-      // age
-      0x10, (byte) 75, //
-      // registered (true)
-      0x18, 0x01 //
-      //
+  private static final byte[] testingBin =
+      new byte[] {
+        //
+        // name
+        0x0a,
+        0x09,
+        // name.name
+        0x0a,
+        0x07,
+        0x74,
+        0x65,
+        0x73,
+        0x74,
+        0x69,
+        0x6e,
+        0x67, //
+        // age
+        0x10,
+        (byte) 75, //
+        // registered (true)
+        0x18,
+        0x01 //
+        //
       };
 
   @SuppressWarnings("cast")
@@ -72,8 +82,7 @@
 
   @Test
   public void testAddress() {
-    final ProtobufCodec<Address> e =
-        CodecFactory.encoder(Address.class);
+    final ProtobufCodec<Address> e = CodecFactory.encoder(Address.class);
     Address a = e.decode(new byte[0]);
     assertNotNull(a);
     assertNull(a.location());
@@ -122,8 +131,7 @@
   }
 
   @Test
-  public void testEncodeNonArrayByteBuffer()
-      throws UnsupportedEncodingException {
+  public void testEncodeNonArrayByteBuffer() throws UnsupportedEncodingException {
     ProtobufCodec<Person> e = CodecFactory.encoder(Person.class);
 
     Person p = new Person(new Person.Key("testing"), 75);
@@ -159,11 +167,24 @@
     StringList other = e.decode(act);
     assertNotNull(other.list);
     assertEquals(list.list, other.list);
-    assertEquals(asString(new byte[] { //
-        //
-            0x12, 0x03, 'm', 'o', 'e', //
-            0x12, 0x05, 'l', 'a', 'r', 'r', 'y' //
-        }), asString(act));
+    assertEquals(
+        asString(
+            new byte[] { //
+              //
+              0x12,
+              0x03,
+              'm',
+              'o',
+              'e', //
+              0x12,
+              0x05,
+              'l',
+              'a',
+              'r',
+              'r',
+              'y' //
+            }),
+        asString(act));
   }
 
   @Test
@@ -179,11 +200,24 @@
     StringSet other = e.decode(act);
     assertNotNull(other.list);
     assertEquals(list.list, other.list);
-    assertEquals(asString(new byte[] { //
-        //
-            0x0a, 0x05, 'l', 'a', 'r', 'r', 'y', //
-            0x0a, 0x03, 'm', 'o', 'e' //
-        }), asString(act));
+    assertEquals(
+        asString(
+            new byte[] { //
+              //
+              0x0a,
+              0x05,
+              'l',
+              'a',
+              'r',
+              'r',
+              'y', //
+              0x0a,
+              0x03,
+              'm',
+              'o',
+              'e' //
+            }),
+        asString(act));
   }
 
   @Test
@@ -235,7 +269,7 @@
   }
 
   @Test
-  public void testEncodeToStream()throws IOException {
+  public void testEncodeToStream() throws IOException {
     ProtobufCodec<ThingWithEnum> e = CodecFactory.encoder(ThingWithEnum.class);
 
     ThingWithEnum thing = new ThingWithEnum();
@@ -255,8 +289,7 @@
     assertSame(thing.type, other.type);
   }
 
-  private static String asString(byte[] bin)
-      throws UnsupportedEncodingException {
+  private static String asString(byte[] bin) throws UnsupportedEncodingException {
     return new String(bin, "ISO-8859-1");
   }
 
@@ -275,8 +308,7 @@
     SortedSet<String> list;
   }
 
-  static class Item {
-  }
+  static class Item {}
 
   static class ItemCodec extends ProtobufCodec<Item> {
     @Override
@@ -308,7 +340,8 @@
 
   static class ThingWithEnum {
     static enum Type {
-      A, B;
+      A,
+      B;
     }
 
     @Column(id = 1)
diff --git a/src/test/java/com/google/gwtorm/schema/QueryModelTest.java b/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
index 13e914c..72c9441 100644
--- a/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
+++ b/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
@@ -22,12 +22,10 @@
 import com.google.gwtorm.schema.java.JavaSchemaModel;
 import com.google.gwtorm.schema.sql.DialectH2;
 import com.google.gwtorm.server.OrmException;
-
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.List;
-
 public class QueryModelTest {
 
   private RelationModel people;
diff --git a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
index ad90e0a..471de76 100644
--- a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
+++ b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
@@ -20,13 +20,11 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.gwtorm.server.OrmException;
-
-import org.antlr.runtime.tree.Tree;
-import org.junit.Test;
-
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
+import org.antlr.runtime.tree.Tree;
+import org.junit.Test;
 
 public class QueryParserTest {
   private final class DummyColumn extends ColumnModel {
@@ -65,30 +63,31 @@
   }
 
   protected Tree parse(final String str) throws QueryParseException {
-    final RelationModel dummy = new RelationModel() {
-      {
-        final Collection<ColumnModel> c = new ArrayList<>();
-        try {
-          c.add(new DummyColumn(1, "name"));
-          c.add(new DummyColumn(2, "a"));
-          c.add(new DummyColumn(3, "b"));
-          c.add(new DummyColumn(4, "c"));
-          initColumns(c);
-        } catch (OrmException e) {
-          throw new RuntimeException("init columns failure", e);
-        }
-      }
+    final RelationModel dummy =
+        new RelationModel() {
+          {
+            final Collection<ColumnModel> c = new ArrayList<>();
+            try {
+              c.add(new DummyColumn(1, "name"));
+              c.add(new DummyColumn(2, "a"));
+              c.add(new DummyColumn(3, "b"));
+              c.add(new DummyColumn(4, "c"));
+              initColumns(c);
+            } catch (OrmException e) {
+              throw new RuntimeException("init columns failure", e);
+            }
+          }
 
-      @Override
-      public String getAccessInterfaceName() {
-        return getClass().getName();
-      }
+          @Override
+          public String getAccessInterfaceName() {
+            return getClass().getName();
+          }
 
-      @Override
-      public String getEntityTypeClassName() {
-        return getClass().getName();
-      }
-    };
+          @Override
+          public String getEntityTypeClassName() {
+            return getClass().getName();
+          }
+        };
     return QueryParser.parse(dummy, str);
   }
 
diff --git a/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java b/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
index c38399f..c32870b 100644
--- a/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
+++ b/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
@@ -14,16 +14,14 @@
 
 package com.google.gwtorm.schema.java;
 
-import static com.google.gwtorm.schema.java.JavaColumnModel.sort;
 import static com.google.common.collect.Collections2.permutations;
+import static com.google.gwtorm.schema.java.JavaColumnModel.sort;
 import static org.junit.Assert.assertEquals;
 
 import com.google.gwtorm.client.Column;
-
 import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.List;
-
 import org.junit.Test;
 
 public class DeclaredFieldsOrderTest {
@@ -31,15 +29,19 @@
   private static class C {
     @Column(id = 1)
     private String c;
+
     @Column(id = 2)
     private String b;
+
     @Column(id = 3)
     private String a;
 
     @SuppressWarnings("unused")
     private String d;
+
     @SuppressWarnings("unused")
     private String e;
+
     @SuppressWarnings("unused")
     private String f;
   }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
index 82e2330..13566bf 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
@@ -28,19 +28,18 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectDB2Test extends SqlDialectTest {
-  private final static String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver";
+  private static final String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver";
+
   @Before
   public void setUp() throws Exception {
     try {
@@ -53,8 +52,7 @@
     final String user = "gwtorm"; // user
     final String pass = "gwtorm"; // pwd
 
-    db = DriverManager.getConnection("jdbc:db2://127.0.0.1:50001/"
-        + database, user, pass);
+    db = DriverManager.getConnection("jdbc:db2://127.0.0.1:50001/" + database, user, pass);
     executor = new JdbcExecutor(db);
     dialect = new DialectDB2().refine(db);
 
@@ -63,10 +61,8 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -196,8 +192,7 @@
       final Person bob = new Person(pk, nextAddressId);
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
index bbf5c94..9275014 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
@@ -28,11 +28,6 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -42,6 +37,9 @@
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectDerbyTest extends SqlDialectTest {
 
@@ -57,10 +55,8 @@
     p.setProperty("driver", org.apache.derby.jdbc.EmbeddedDriver.class.getName());
     p.setProperty("url", db.getMetaData().getURL());
 
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -175,8 +171,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
@@ -193,11 +188,11 @@
      * for more information about the restriction of the RENAME COLUMN command.
      */
     String sqlCatalog =
-          "select c.constraintname, ch.checkdefinition"
-        + " from sys.sysconstraints c, sys.systables t, sys.syschecks ch"
-        + " WHERE c.tableid = t.tableid"
-        + "   and t.tablename = ?"
-        + "   and c.constraintid = ch.constraintid";
+        "select c.constraintname, ch.checkdefinition"
+            + " from sys.sysconstraints c, sys.systables t, sys.syschecks ch"
+            + " WHERE c.tableid = t.tableid"
+            + "   and t.tablename = ?"
+            + "   and c.constraintid = ch.constraintid";
     PreparedStatement ps = db.prepareStatement(sqlCatalog);
     String tableName = "PEOPLE";
     ps.setString(1, tableName);
@@ -210,20 +205,19 @@
           constraintNames.add(rs.getString(1));
           checkDefs.add(rs.getString(2).replace("registered", "is_registered"));
           break;
-         }
+        }
       }
       rs.close();
       ps.close();
       if (constraintNames.isEmpty()) {
         fail("Constraint not found");
       }
-      for (String c: constraintNames) {
+      for (String c : constraintNames) {
         execute("alter table " + tableName + " drop check " + c);
       }
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
-      for (String cd: checkDefs) {
-        execute("alter table " + tableName + " add check "+ cd);
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
+      for (String cd : checkDefs) {
+        execute("alter table " + tableName + " add check " + cd);
       }
     } catch (OrmException e) {
       fail(e.getMessage());
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
index a94f641..6d927f2 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
@@ -27,16 +27,14 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectH2Test extends SqlDialectTest {
   @Before
@@ -49,10 +47,8 @@
     final Properties p = new Properties();
     p.setProperty("driver", org.h2.Driver.class.getName());
     p.setProperty("url", db.getMetaData().getURL());
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -171,8 +167,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
@@ -180,8 +175,7 @@
 
     final PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
index 83f34f4..0f3836b 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
@@ -32,16 +32,14 @@
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectHANATest extends SqlDialectTest {
   private static final String HANA_URL_KEY = "hana.url";
@@ -204,8 +202,7 @@
 
     PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
index c73b1f5..b00ee5d 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
@@ -21,11 +21,9 @@
 import com.google.gwtorm.jdbc.Database;
 import com.google.gwtorm.jdbc.JdbcExecutor;
 import com.google.gwtorm.jdbc.SimpleDataSource;
-
-import org.junit.Before;
-
 import java.sql.DriverManager;
 import java.util.Properties;
+import org.junit.Before;
 
 public class DialectMariaDBTest extends DialectMySQLTest {
   @Before
@@ -51,9 +49,7 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
index 97937b2..5149707 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
@@ -32,16 +32,14 @@
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectMaxDBTest extends SqlDialectTest {
   private static final String MAXDB_URL_KEY = "maxdb.url";
@@ -70,10 +68,8 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   private void drop(String drop) {
@@ -198,8 +194,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(asList(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(asList(addr));
     } finally {
       p.close();
@@ -207,8 +202,7 @@
 
     final PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
@@ -271,8 +265,8 @@
         Person joe = new Person(joePk, p.nextAddressId());
         joe.setAge(40);
         try {
-        p.people().insert(asList(joe));
-        fail();
+          p.people().insert(asList(joe));
+          fail();
         } catch (OrmDuplicateKeyException duprec) {
           fail();
         } catch (OrmException noDuprec) {
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
index 032bb33..8789122 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-
 package com.google.gwtorm.schema.sql;
 
 import static org.junit.Assert.assertEquals;
@@ -29,16 +28,14 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectMySQLTest extends SqlDialectTest {
   @Before
@@ -64,10 +61,8 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -190,8 +185,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
@@ -199,8 +193,7 @@
 
     final PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
index 8bb00ce..53369d8 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
@@ -28,19 +28,17 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectOracleSQLTest extends SqlDialectTest {
-  private final static String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
+  private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
 
   @Before
   public void setUp() throws Exception {
@@ -54,8 +52,7 @@
     final String user = "gwtorm"; // Oracle schema=user name=database
     final String pass = "gwtorm";
 
-    db = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:"
-        + sid, user, pass);
+    db = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:" + sid, user, pass);
     executor = new JdbcExecutor(db);
     dialect = new DialectOracle().refine(db);
 
@@ -64,10 +61,8 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -192,8 +187,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
@@ -201,8 +195,7 @@
 
     final PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
index cbdc050..fb256c5 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-
 package com.google.gwtorm.schema.sql;
 
 import static org.junit.Assert.assertEquals;
@@ -29,16 +28,14 @@
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class DialectPostgreSQLTest extends SqlDialectTest {
   @Before
@@ -62,10 +59,8 @@
     p.setProperty("url", db.getMetaData().getURL());
     p.setProperty("user", user);
     p.setProperty("password", pass);
-    phoneBook =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
-    phoneBook2 =
-        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+    phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
@@ -189,8 +184,7 @@
       final Person bob = new Person(pk, p.nextAddressId());
       p.people().insert(Collections.singleton(bob));
 
-      final Address addr =
-          new Address(new Address.Key(pk, "home"), "some place");
+      final Address addr = new Address(new Address.Key(pk, "home"), "some place");
       p.addresses().insert(Collections.singleton(addr));
     } finally {
       p.close();
@@ -198,8 +192,7 @@
 
     final PhoneBookDb2 p2 = phoneBook2.open();
     try {
-      ((JdbcSchema) p2).renameField(executor, "people", "registered",
-          "isRegistered");
+      ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
     } finally {
       p2.close();
     }
diff --git a/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java b/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
index 422ba0a..6306a66 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
@@ -28,14 +28,12 @@
 import com.google.gwtorm.server.OrmConcurrencyException;
 import com.google.gwtorm.server.OrmDuplicateKeyException;
 import com.google.gwtorm.server.OrmException;
-
-import org.junit.Test;
-
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Test;
 
 public abstract class SqlDialectTest {
   protected JdbcExecutor executor;
@@ -84,8 +82,7 @@
   }
 
   @Test
-  public void testThrowsOrmDuplicateKeyExceptionWhenTryingToInsertDuplicates()
-      throws Exception {
+  public void testThrowsOrmDuplicateKeyExceptionWhenTryingToInsertDuplicates() throws Exception {
     PhoneBookDb p = phoneBook.open();
     try {
       p.updateSchema(executor);
@@ -126,8 +123,7 @@
   }
 
   @Test
-  public void testInsertExistingRowThrowsOrmDuplicateKeyException()
-      throws Exception {
+  public void testInsertExistingRowThrowsOrmDuplicateKeyException() throws Exception {
     PhoneBookDb p = phoneBook.open();
     try {
       p.updateSchema(executor);
@@ -147,8 +143,7 @@
   }
 
   @Test
-  public void testInsertExistingRowInTransactionThrowsOrmDuplicateKeyException()
-      throws Exception {
+  public void testInsertExistingRowInTransactionThrowsOrmDuplicateKeyException() throws Exception {
     PhoneBookDb p = phoneBook.open();
     try {
       p.updateSchema(executor);
@@ -175,8 +170,7 @@
   }
 
   @Test
-  public void testUpdateNonexistentRowThrowsOrmConcurrencyException()
-      throws Exception {
+  public void testUpdateNonexistentRowThrowsOrmConcurrencyException() throws Exception {
     PhoneBookDb p = phoneBook.open();
     try {
       p.updateSchema(executor);
@@ -222,8 +216,7 @@
   }
 
   @Test
-  public void testDeleteNonexistentRowThrowsOrmConcurrencyException()
-      throws Exception {
+  public void testDeleteNonexistentRowThrowsOrmConcurrencyException() throws Exception {
     PhoneBookDb p = phoneBook.open();
     try {
       p.updateSchema(executor);
diff --git a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
index 4f99f61..7d151e9 100644
--- a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
+++ b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
@@ -29,11 +29,6 @@
 import com.google.gwtorm.jdbc.JdbcExecutor;
 import com.google.gwtorm.jdbc.JdbcSchema;
 import com.google.gwtorm.jdbc.SimpleDataSource;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -41,6 +36,9 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class PhoneBookDbTestCase {
   private static int runCount;
@@ -206,8 +204,7 @@
     final Person p1 = new Person(new Person.Key("Bob"), 18);
     sp.insert(Collections.singleton(p1));
 
-    final List<Person> list =
-        sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
+    final List<Person> list = sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
     assertNotNull(list);
     assertEquals(1, list.size());
 
@@ -304,8 +301,7 @@
     final Person bob1 = new Person(new Person.Key("Bob"), 18);
     schema.people().insert(Collections.singleton(bob1));
 
-    final Person bob2 =
-        schema.people().get(new Person.Key(bob1.name()));
+    final Person bob2 = schema.people().get(new Person.Key(bob1.name()));
     assertNotNull(bob2);
     assertNotSame(bob1, bob2);
     assertEquals(bob1.name(), bob2.name());
@@ -337,8 +333,7 @@
     all.add(new Person(new Person.Key("Zak"), 33));
     schema.people().insert(all);
 
-    final List<Person> r =
-        schema.people().olderThanDescByName(18).toList();
+    final List<Person> r = schema.people().olderThanDescByName(18).toList();
     assertEquals(2, r.size());
     assertEquals(all.get(2).name(), r.get(0).name());
     assertEquals(all.get(1).name(), r.get(1).name());
@@ -358,8 +353,7 @@
     assertEquals("N", rs.getString(1));
     assertFalse(rs.next());
     rs.close();
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
 
     bob.register();
     schema.people().update(Collections.singleton(bob));
@@ -368,8 +362,7 @@
     assertEquals("Y", rs.getString(1));
     assertFalse(rs.next());
     rs.close();
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
 
     bob.unregister();
     schema.people().update(Collections.singleton(bob));
@@ -378,8 +371,7 @@
     assertEquals("N", rs.getString(1));
     assertFalse(rs.next());
     rs.close();
-    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
-        .isRegistered());
+    assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
 
     st.close();
   }
diff --git a/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java b/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
index 66a13d2..2b79b1b 100644
--- a/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
+++ b/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
@@ -17,7 +17,6 @@
 import com.google.gwtorm.data.PhoneBookDb;
 import com.google.gwtorm.schema.java.JavaSchemaModel;
 import com.google.gwtorm.schema.sql.DialectH2;
-
 import org.junit.Test;
 
 public class PrintCreateTablesTestCase {
