This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new bee7f30  EMPIREDB-362 JSF and VUE Examples updated
bee7f30 is described below

commit bee7f303c8237ec37825cdcf6f472562a73811b8
Author: Rainer Döbele <[email protected]>
AuthorDate: Sat Feb 19 22:58:36 2022 +0100

    EMPIREDB-362 JSF and VUE Examples updated
---
 .../org/apache/empire/samples/db/SampleDB.java     |  23 +-
 empire-db-examples/empire-db-example-jsf2/pom.xml  |  49 +++-
 .../apache/empire/jsf2/websample/db/SampleDB.java  | 270 ++++++++++++++------
 .../empire/jsf2/websample/db/SampleDBwithMeta.java |  64 +++++
 .../websample/db/records/DepartmentRecord.java     |   2 +-
 .../jsf2/websample/db/records/EmployeeRecord.java  |   8 +-
 .../jsf2/websample/web/SampleApplication.java      | 248 +++++++++----------
 .../empire/jsf2/websample/web/SampleConfig.java    |  31 +--
 .../web/objects/EmployeeSearchFilter.java          |   9 +
 .../websample/web/pages/EmployeeDetailPage.java    |  35 ++-
 .../jsf2/websample/web/pages/EmployeeListPage.java |  20 +-
 .../src/main/resources/lang/messages_de.properties |  10 +-
 .../src/main/resources/lang/messages_en.properties |  10 +-
 .../src/main/webapp/WEB-INF/config.xml             |  83 ++++++-
 .../src/main/webapp/css/content.css                |   6 +-
 .../src/main/webapp/pages/employeeDetailPage.xhtml |  24 ++
 empire-db-examples/empire-db-example-vue/pom.xml   |  57 ++++-
 .../empire-db-example-vue/readme.txt               |  30 +++
 .../org/apache/empire/rest/app}/SampleConfig.java  |  31 +--
 .../apache/empire/rest/app/SampleServiceApp.java   | 147 ++++++-----
 .../empire/rest/service/EmployeeService.java       |  19 +-
 .../org/apache/empire/vue/sample/db/SampleDB.java  | 271 +++++++++++++++------
 .../vue/sample/db/records/DepartmentRecord.java    |   2 +-
 .../vue/sample/db/records/EmployeeRecord.java      |   8 +-
 .../src/main/resources/lang/messages_de.properties |   4 +-
 .../src/main/resources/lang/messages_en.properties |   4 +-
 .../src/main/vue/_eslintrc.js.bak                  |  28 +++
 .../src/main/vue/src/pages/employeeDetail.vue      |   2 +-
 .../src/main/webapp/WEB-INF/config.xml             |  83 ++++++-
 .../main/java/org/apache/empire/db/DBRowSet.java   |   8 +-
 pom.xml                                            |   2 +
 31 files changed, 1130 insertions(+), 458 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
index 8e3b948..96afcae 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
@@ -39,14 +39,14 @@ import org.slf4j.LoggerFactory;
 /**
  * <PRE>
  * This file contains the definition of the data model in Java.
- * The SampleDB data model consists of three tables and a foreign key relation.
+ * The SampleDB data model consists of three tables and two foreign key 
relations.
  * The tables are defined as nested classes here, but you may put them in 
separate files if you want to.
+ * 
+ * The class also provided methods to create the database (if it doesn't 
exist) 
+ * and to check the datamodel i.e. to compare this definition to the database 
in the DBMS
  *
  * PLEASE NOTE THE NAMING CONVENTION:
- * Since all tables, views and columns are declared as "final" constants they 
are all in upper case.
- * We recommend using a prefix of T_ for tables and C_ for columns in order to 
keep them together
- * when listed in your IDE's code completion.
- * There is no need to stick to this convention but it makes life just another 
little bit easier.
+ * Since all tables, views and columns are declared as "final" constants we 
have all put them in upper case.
  *
  * You may declare other database tables or views in the same way.
  * </PRE>
@@ -98,8 +98,9 @@ public class SampleDB extends DBDatabase
             BUSINESS_UNIT   = addColumn   ("BUSINESS_UNIT",    
DataType.VARCHAR,       4, true, "ITTK");
             UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
 
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(DEPARTMENT_ID);
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
+
             // Set other Indexes
             addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
             
@@ -144,8 +145,9 @@ public class SampleDB extends DBDatabase
             RETIRED         = addColumn    ("RETIRED",          DataType.BOOL, 
        0, true, false);
             UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
             
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(EMPLOYEE_ID);
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
+
             // Set other Indexes
             addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
 
@@ -174,9 +176,8 @@ public class SampleDB extends DBDatabase
             MONTH           = addColumn("MONTH",            DataType.DECIMAL,  
  2.0, true);
             AMOUNT          = addColumn("AMOUNT",           DataType.DECIMAL,  
  8.2, true);
 
-            // Primary Key (automatically set due to AUTOINC column)
+            // Primary Key 
             setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
-            // Set other Indexes
 
             // Set beanType (optional)
             setBeanType(Payment.class);
diff --git a/empire-db-examples/empire-db-example-jsf2/pom.xml 
b/empire-db-examples/empire-db-example-jsf2/pom.xml
index d1c0f11..7123812 100644
--- a/empire-db-examples/empire-db-example-jsf2/pom.xml
+++ b/empire-db-examples/empire-db-example-jsf2/pom.xml
@@ -77,15 +77,54 @@
                        <scope>provided</scope>
                </dependency>
 
-        <!-- use log4j for logging -->
+               <!-- All Databases (scope: runtime) -->
+               <!-- hsqldb -->
                <dependency>
-                       <groupId>org.slf4j</groupId>
-                       <artifactId>slf4j-log4j12</artifactId>
+                   <groupId>org.hsqldb</groupId>
+                   <artifactId>hsqldb</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- dh2 -->
+               <dependency>
+                   <groupId>com.h2database</groupId>
+                   <artifactId>h2</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- derby -->
+               <dependency>
+                   <groupId>org.apache.derby</groupId>
+                   <artifactId>derby</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- mysql -->
+               <dependency>
+                   <groupId>mysql</groupId>
+                   <artifactId>mysql-connector-java</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- postgresql -->
+               <dependency>
+                   <groupId>org.postgresql</groupId>
+                   <artifactId>postgresql</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- msssql -->
+               <dependency>
+                   <groupId>com.microsoft.sqlserver</groupId>
+                   <artifactId>mssql-jdbc</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- oracle -->
+               <dependency>
+                   <groupId>com.oracle.database.jdbc</groupId>
+                   <artifactId>ojdbc8</artifactId>
+                   <scope>runtime</scope>
                </dependency>
 
+        <!-- use log4j for logging -->
                <dependency>
-                       <groupId>org.hsqldb</groupId>
-                       <artifactId>hsqldb</artifactId>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-log4j12</artifactId>
                </dependency>
 
        </dependencies>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
index 098ab66..7bce95a 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
@@ -18,78 +18,100 @@
  */
 package org.apache.empire.jsf2.websample.db;
 
-import org.apache.empire.commons.Options;
+import java.sql.SQLException;
+
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.db.validation.DBModelErrorLogger;
+import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+/**
+ * <PRE>
+ * This file contains the definition of the data model in Java.
+ * The SampleDB data model consists of three tables and two foreign key 
relations.
+ * The tables are defined as nested classes here, but you may put them in 
separate files if you want to.
+ * 
+ * The class also provided methods to create the database (if it doesn't 
exist) 
+ * and to check the datamodel i.e. to compare this definition to the database 
in the DBMS
+ *
+ * PLEASE NOTE THE NAMING CONVENTION:
+ * Since all tables, views and columns are declared as "final" constants we 
have all put them in upper case.
+ *
+ * You may declare other database tables or views in the same way.
+ * </PRE>
+ */
 public class SampleDB extends DBDatabase
 {
-    // *Deprecated* private static final long serialVersionUID = 1L;
-
-    // Declare all Tables
-    public final TDepartments       T_DEPARTMENTS    = new TDepartments(this);
-    public final TEmployees         T_EMPLOYEES      = new TEmployees(this);
-
+    // Logger
+    private static final Logger log = LoggerFactory.getLogger(SampleDB.class);
+    
     /**
-     * Constructor SampleDB
+     * Gender enum
      */
-    public SampleDB()
+    public enum Gender
     {
-        // Define Foreign-Key Relations
-        addRelation(T_EMPLOYEES.DEPARTMENT_ID.referenceOn(T_DEPARTMENTS.ID));
-    }
-
-    // Needed for the DBELResolver
-    @Override
-    protected void register(String id)
-    {
-        super.register("db");
+        M("Male"),
+        F("Female"),
+        U("Unknown");
+        
+        private final String title;
+        private Gender(String title)
+        {
+            this.title = title;
+        }
+        @Override
+        public String toString()
+        {
+            return title;
+        }
     }
 
     /**
-     * This class represents the definition of the Departments table.
+     * This class represents the Departments table.
      */
     public static class TDepartments extends SampleTable
     {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-
         public final DBTableColumn ID;
         public final DBTableColumn NAME;
         public final DBTableColumn HEAD;
         public final DBTableColumn BUSINESS_UNIT;
         public final DBTableColumn UPDATE_TIMESTAMP;
 
-        public TDepartments(DBDatabase db)
+        public TDepartments(SampleDB db)
         {
             super("DEPARTMENTS", db);
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
  0, true, "DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. Oracle)
-            NAME                       = addColumn("NAME",                     
DataType.VARCHAR,   80, true);
-            HEAD                       = addColumn("HEAD",                     
DataType.VARCHAR,   80, false);
-            BUSINESS_UNIT      = addColumn("BUSINESS_UNIT",    
DataType.VARCHAR,    4, true, "ITTK");
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,         0, true);
-
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(DEPARTMENT_ID);
+            ID              = addIdentity ("ID",               
"DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. Oracle)
+            NAME            = addColumn   ("NAME",             
DataType.VARCHAR,      80, true);
+            HEAD            = addColumn   ("HEAD",             
DataType.VARCHAR,      80, false);
+            BUSINESS_UNIT   = addColumn   ("BUSINESS_UNIT",    
DataType.VARCHAR,       4, true, "ITTK");
+            UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
+
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
+
             // Set other Indexes
-            addIndex("DEARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+            addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+            
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("DEPARTMENT");
         }
     }
 
-  
-
     /**
-     * This class represents the definition of the Employees table.
+     * This class represents the Employees table.
      */
     public static class TEmployees extends SampleTable
     {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-
         public final DBTableColumn ID;
         public final DBTableColumn SALUTATION;
-//      public final DBTableColumn PICTURE;
         public final DBTableColumn FIRST_NAME;
         public final DBTableColumn LAST_NAME;
         public final DBTableColumn DATE_OF_BIRTH;
@@ -97,53 +119,151 @@ public class SampleDB extends DBDatabase
         public final DBTableColumn GENDER;
         public final DBTableColumn PHONE_NUMBER;
         public final DBTableColumn EMAIL;
+        public final DBTableColumn SALARY;
         public final DBTableColumn RETIRED;
         public final DBTableColumn UPDATE_TIMESTAMP;
-        public TEmployees(DBDatabase db)
+
+        public TEmployees(SampleDB db)
         {
             super("EMPLOYEES", db);
-            // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
  0, true, "EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS 
(e.g. Oracle)
-            SALUTATION                 = addColumn("SALUTATION",               
DataType.VARCHAR,        5, false);
-            FIRST_NAME                 = addColumn("FIRST_NAME",               
DataType.VARCHAR,       40, true);
-            LAST_NAME          = addColumn("LAST_NAME",                
DataType.VARCHAR,       40, true);
-            DATE_OF_BIRTH      = addColumn("DATE_OF_BIRTH",    DataType.DATE,  
         0, false);
-            DEPARTMENT_ID      = addColumn("DEPARTMENT_ID",    
DataType.INTEGER,        0, true);
-            GENDER                     = addColumn("GENDER",                   
DataType.VARCHAR,        1, false);
-            PHONE_NUMBER       = addColumn("PHONE_NUMBER",     
DataType.VARCHAR,       40, false);
-            EMAIL                      = addColumn("EMAIL",                    
DataType.VARCHAR,       80, false);
-            RETIRED                    = addColumn("RETIRED",                  
DataType.BOOL,           0, true, false);
-            // PICTURE                 = addColumn("PICTURE",                  
DataType.BLOB,           0, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,         0, true);
-
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(EMPLOYEE_ID);
-            // Set other Indexes
-            addIndex("PERSON_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
-
-            // Create Options for GENDER column
-            Options genders = new Options();
-            genders.set("M", "!option.employee.gender.male");
-            genders.set("F", "!option.employee.gender.female");
-            GENDER.setOptions(genders);
-            GENDER.setControlType("select");
-
-            Options retired = new Options();
-            retired.set(false, "!option.employee.active");
-            retired.set(true,  "!option.employee.retired");
-            RETIRED.setOptions(retired);
-            RETIRED.setControlType("checkbox");
             
-            // Set special control types
-            DEPARTMENT_ID.setControlType("select");
-            PHONE_NUMBER .setControlType("phone");
+            // ID
+            ID              = addIdentity  ("ID",               
"EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS (e.g. Oracle)
+            SALUTATION      = addColumn    ("SALUTATION",       
DataType.VARCHAR,      5, false);
+            FIRST_NAME      = addColumn    ("FIRST_NAME",       
DataType.VARCHAR,     40, true);
+            LAST_NAME       = addColumn    ("LAST_NAME",        
DataType.VARCHAR,     40, true);
+            DATE_OF_BIRTH   = addColumn    ("DATE_OF_BIRTH",    DataType.DATE, 
        0, false);
+            DEPARTMENT_ID   = addForeignKey("DEPARTMENT_ID",    
db.DEPARTMENTS,           true);
+            GENDER          = addColumn    ("GENDER",           
DataType.VARCHAR,      1, true, Gender.class);
+            PHONE_NUMBER    = addColumn    ("PHONE_NUMBER",     
DataType.VARCHAR,     40, false, "0815-");
+            EMAIL           = addColumn    ("EMAIL",            
DataType.VARCHAR,     80, false);
+            SALARY          = addColumn    ("SALARY",           
DataType.DECIMAL,   10.2, false);
+            RETIRED         = addColumn    ("RETIRED",          DataType.BOOL, 
        0, true, false);
+            UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
             
-            // Set optional formatting attributes
-            DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
+
+            // Set other Indexes
+            addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
+
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("EMPLOYEE");
+        }
+    }
+
+    /**
+     * This class represents the Payments table.
+     */
+    public static class TPayments extends SampleTable
+    {
+        public final DBTableColumn EMPLOYEE_ID;
+        public final DBTableColumn YEAR;
+        public final DBTableColumn MONTH;
+        public final DBTableColumn AMOUNT;
+
+        public TPayments(SampleDB db)
+        {
+            super("PAYMENTS", db);
             
-            // PICTURE.setControlType("blob");
+            // ID
+            EMPLOYEE_ID     = addForeignKey("EMPLOYEE_ID",  db.EMPLOYEES,      
       true);
+            YEAR            = addColumn("YEAR",             DataType.DECIMAL,  
  4.0, true);
+            MONTH           = addColumn("MONTH",            DataType.DECIMAL,  
  2.0, true);
+            AMOUNT          = addColumn("AMOUNT",           DataType.DECIMAL,  
  8.2, true);
+
+            // Primary Key 
+            setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
+
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("PAYMENT");
+        }
+    }
+    
+    // Declare all Tables and Views here
+    public final TDepartments  DEPARTMENTS = new TDepartments(this);
+    public final TEmployees    EMPLOYEES   = new TEmployees(this);
+    public final TPayments     PAYMENTS    = new TPayments(this);
+
+    /**
+     * Constructor of the SampleDB data model
+     *
+     * Put all foreign key relations here.
+     */
+    public SampleDB()
+    {
+        // Define additional Foreign-Key Relations here
+        // which have not already been defined by addForeignKey()
+        // addRelation( {Source Column}.referenceOn( {Target Column} ));
+        log.info("SampleDB has been created with {} Tables and {} Relations", 
getTables().size(), getRelations().size());
+    }
 
+    // Needed for the DBELResolver
+    @Override
+    protected void register(String id)
+    {
+        super.register("db");
+    }
+    
+    @Override
+    public void open(DBContext context)
+    {
+        // Enable prepared statements
+        // setPreparedStatementsEnabled(true);
+        // Check exists
+        if (checkExists(context))
+        {   // attach to driver
+            super.open(context);
+            // yes, it exists, then check the model
+            checkDataModel(context);
+        }
+        else
+        {   // PostgreSQL does not support DDL in transaction
+            if(getDbms() instanceof DBMSHandlerPostgreSQL)
+                setAutoCommit(context, true);
+            // create the database
+            createDatabase(context);
+            // PostgreSQL does not support DDL in transaction
+            if(getDbms() instanceof DBMSHandlerPostgreSQL)
+                setAutoCommit(context, false);
+            // attach to driver
+            super.open(context);
         }
     }
 
+    private void createDatabase(DBContext context)
+    {
+        // create DDL for Database Definition
+        DBSQLScript script = new DBSQLScript(context);
+        getCreateDDLScript(script);
+        // Show DDL Statement
+        log.info(script.toString());
+        // Execute Script
+        script.executeAll(false);
+        // Commit
+        context.commit();
+    }
+    
+    private void checkDataModel(DBContext context)
+    {   try {
+            DBModelChecker modelChecker = 
context.getDbms().createModelChecker(this);
+            // Check data model   
+            log.info("Checking DataModel for {} using {}", 
getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
+            // dbo schema
+            DBModelErrorLogger logger = new DBModelErrorLogger();
+            modelChecker.checkModel(this, context.getConnection(), logger);
+            // show result
+            log.info("Data model check done. Found {} errors and {} 
warnings.", logger.getErrorCount(), logger.getWarnCount());
+        } catch(Exception e) {
+            log.error("FATAL error when checking data model. Probably not 
properly implemented by DBMSHandler!");
+        }
+    }
+    
+    private void setAutoCommit(DBContext context, boolean enable)
+    {   try {
+            context.getConnection().setAutoCommit(enable);
+        } catch (SQLException e) {
+            log.error("Unable to set AutoCommit on Connection", e);
+        }
+    }
 }
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
new file mode 100644
index 0000000..c1dd3f2
--- /dev/null
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.empire.jsf2.websample.db;
+
+import org.apache.empire.commons.Options;
+import org.apache.empire.db.DBContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SampleDBwithMeta extends SampleDB
+{
+    // Logger
+    private static final Logger log = 
LoggerFactory.getLogger(SampleDBwithMeta.class);
+   
+    @Override
+    public void open(DBContext context)
+    {
+        super.open(context);
+        // add JSF Metatada
+        addMeta(EMPLOYEES);
+    }
+    
+    private void addMeta(SampleDB.TEmployees T)
+    {
+        log.info("Adding additional Metadata for {}", T.getName());
+        
+        // Create Options for GENDER column
+        // add the message-keys instead of the enum string value
+        Options genders = new Options();
+        genders.set(Gender.M, "!option.employee.gender.male");
+        genders.set(Gender.F, "!option.employee.gender.female");
+        T.GENDER.setOptions(genders);
+        T.GENDER.setControlType("select");
+
+        Options retired = new Options();
+        retired.set(false, "!option.employee.active");
+        retired.set(true,  "!option.employee.retired");
+        T.RETIRED.setOptions(retired);
+        T.RETIRED.setControlType("checkbox");
+        
+        // Set special control types
+        T.DEPARTMENT_ID.setControlType("select");
+        T.PHONE_NUMBER .setControlType("phone");
+        
+        // Set optional formatting attributes
+        T.DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+    }
+}
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
index 03bff52..3296cf1 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
@@ -27,7 +27,7 @@ public class DepartmentRecord extends 
SampleRecord<TDepartments>
 
     public DepartmentRecord(SampleContext context)
     {
-        super(context, context.getDatabase().T_DEPARTMENTS);
+        super(context, context.getDatabase().DEPARTMENTS);
     }
   
 }
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
index 0b03e32..5e7f661 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
@@ -32,7 +32,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
 
     public EmployeeRecord(SampleContext context)
     {
-        super(context, context.getDatabase().T_EMPLOYEES);
+        super(context, context.getDatabase().EMPLOYEES);
     }
     
        /*
@@ -56,9 +56,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
         {
             SampleDB db = (SampleDB) getDatabase();
             DBCommand cmd = context.createCommand();
-            cmd.select(db.T_DEPARTMENTS.ID);
-            cmd.select(db.T_DEPARTMENTS.NAME);
-            cmd.orderBy(db.T_DEPARTMENTS.NAME);
+            cmd.select(db.DEPARTMENTS.ID);
+            cmd.select(db.DEPARTMENTS.NAME);
+            cmd.orderBy(db.DEPARTMENTS.NAME);
             return context.getUtils().queryOptionList(cmd);
         }
         // base class implementation
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
index b701a8c..271fa94 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
@@ -18,9 +18,12 @@
  */
 package org.apache.empire.jsf2.websample.web;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.time.LocalDate;
 import java.util.Locale;
 
 import javax.servlet.ServletContext;
@@ -31,20 +34,15 @@ import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRecord;
-import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.context.DBRollbackManager;
 import org.apache.empire.db.context.DBRollbackManager.ReleaseAction;
-import org.apache.empire.db.exceptions.QueryFailedException;
 import org.apache.empire.dbms.DBMSHandler;
-import org.apache.empire.dbms.hsql.DBMSHandlerHSql;
-import org.apache.empire.dbms.mysql.DBMSHandlerMySQL;
-import org.apache.empire.dbms.oracle.DBMSHandlerOracle;
-import org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL;
 import org.apache.empire.jsf2.app.WebApplication;
 import org.apache.empire.jsf2.controls.InputControlManager;
 import org.apache.empire.jsf2.custom.controls.FileInputControl;
 import org.apache.empire.jsf2.websample.db.SampleDB;
+import org.apache.empire.jsf2.websample.db.SampleDBwithMeta;
 import org.apache.empire.jsf2.websample.web.pages.SamplePages;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -98,44 +96,44 @@ public class SampleApplication extends WebApplication {
                // Done
        }
 
-       /*
-        * getJDBCConnection
-        */
-       private Connection getJDBCConnection(ServletContext appContext) {
-               // Establish a new database connection
-               Connection conn = null;
-               String jdbcURL = config.getJdbcURL();
-               if (jdbcURL.indexOf("file:") > 0)
-                       jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:"
-                                       + appContext.getRealPath("/"));
-               // Connect
-               log.info("Connecting to Database'" + jdbcURL + "' / User="
-                               + config.getJdbcUser());
-               try { // Connect to the databse
-                       Class.forName(config.getJdbcClass()).newInstance();
-                       conn = DriverManager.getConnection(jdbcURL, 
config.getJdbcUser(),
-                                       config.getJdbcPwd());
-                       log.info("Connected successfully");
-                       // set the AutoCommit to false this session. You must 
commit
-                       // explicitly now
-                       conn.setAutoCommit(false);
-                       log.info("AutoCommit is " + conn.getAutoCommit());
-
-               } catch (Exception e) {
-                       log.error("Failed to connect directly to '" + 
config.getJdbcURL()
-                                       + "' / User=" + config.getJdbcUser());
-                       log.error(e.toString());
-                       throw new RuntimeException(e);
-               }
-               return conn;
-       }
+    /*
+     * getJDBCConnection
+     */
+    private Connection getJDBCConnection(ServletContext appContext)
+    {
+        // Establish a new database connection
+        Connection conn = null;
+        String jdbcURL = config.getJdbcURL();
+        if (jdbcURL.indexOf("file:") > 0)
+            jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" + 
appContext.getRealPath("/"));
+        // Connect
+        log.info("Connecting to Database'" + jdbcURL + "' / User=" + 
config.getJdbcUser());
+        try
+        { // Connect to the database
+            Class.forName(config.getJdbcClass()).newInstance();
+            conn = DriverManager.getConnection(jdbcURL, config.getJdbcUser(), 
config.getJdbcPwd());
+            log.info("Connected successfully");
+            // set the AutoCommit to false this session. You must commit
+            // explicitly now
+            conn.setAutoCommit(false);
+            log.info("AutoCommit is " + conn.getAutoCommit());
+
+        }
+        catch (Exception e)
+        {
+            log.error("Failed to connect directly to '" + config.getJdbcURL() 
+ "' / User=" + config.getJdbcUser());
+            log.error(e.toString());
+            throw new RuntimeException(e);
+        }
+        return conn;
+    }
 
        private void initDatabase() {
-               sampleDB = new SampleDB();
+           // Create Database with Metadata!
+               sampleDB = new SampleDBwithMeta();
 
                // Open Database (and create if not existing)
-               String driverProvider = config.getDatabaseProvider();
-               DBMSHandler dbmsHandler = getDBMSHandler(driverProvider);
+        DBMSHandler dbmsHandler = getDBMSHandler(config.getDatabaseProvider(), 
conn);
         log.info("Opening database '{}' using '{}'", 
sampleDB.getClass().getSimpleName(), dbmsHandler.getClass().getSimpleName());
                Connection conn = null;
                DBContext context = null;
@@ -143,43 +141,45 @@ public class SampleApplication extends WebApplication {
                        conn = getConnection(sampleDB);
                        context = new DBContextStatic(dbmsHandler, conn);
                        sampleDB.open(context);
-                       if (!databaseExists(context)) {
-                               // STEP 4: Create Database
-                               log.info("Creating database {}", 
sampleDB.getClass().getSimpleName());
-                               createSampleDatabase(context);
-                       }
+               // check if database was just created 
+               DBCommand cmd = context.createCommand();
+               cmd.select(sampleDB.EMPLOYEES.count());
+               if (context.getUtils().querySingleInt(cmd)==0)
+               {   // Populate Database
+                   populateDatabase(context);
+               }
                } finally {
                    context.discard();
                        releaseConnection(conn, true, null);
                }
        }
 
-       /*
-        * getDatabaseDriver
-        */
-       private DBMSHandler getDBMSHandler(String provider) {
-               if (provider.equalsIgnoreCase("mysql")) {
-                       DBMSHandlerMySQL dbms = new DBMSHandlerMySQL();
-                       // Set Driver specific properties (if any)
-                       dbms.setDatabaseName(config.getSchemaName());
-                       return dbms;
-               } else if (provider.equalsIgnoreCase("oracle")) {
-                       DBMSHandlerOracle dbms = new DBMSHandlerOracle();
-                       // Set Driver specific properties (if any)
-                       return dbms;
-               } else if (provider.equalsIgnoreCase("sqlserver")) {
-                       DBMSHandlerMSSQL dbms = new DBMSHandlerMSSQL();
-                       // Set Driver specific properties (if any)
-                       dbms.setDatabaseName(config.getSchemaName());
-                       return dbms;
-               } else if (provider.equalsIgnoreCase("hsqldb")) {
-                       DBMSHandlerHSql dbms = new DBMSHandlerHSql();
-                       // Set Driver specific properties (if any)
-                       return dbms;
-               } else { // Unknown Provider
-                       throw new RuntimeException("Unknown Database Provider " 
+ provider);
-               }
-       }
+    /**
+     * Creates an Empire-db DatabaseDriver for the given provider and applies 
dbms specific configuration 
+     */
+    private DBMSHandler getDBMSHandler(String provider, Connection conn)
+    {
+        try
+        {   // Get Driver Class Name
+            String dbmsHandlerClass = config.getDbmsHandlerClass();
+            if (StringUtils.isEmpty(dbmsHandlerClass))
+                throw new RuntimeException("Configuration error: Element 
'dbmsHandlerClass' not found in node 'properties-"+provider+"'");
+
+            // Create dbms
+            DBMSHandler dbms = (DBMSHandler) 
Class.forName(dbmsHandlerClass).newInstance();
+
+            // Configure dbms
+            config.readProperties(dbms, "properties-"+provider, 
"dbmsHandlerProperites");
+
+            // done
+            return dbms;
+            
+        } catch (Exception e)
+        {   // catch any checked exception and forward it
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
 
        private void initPages(ServletContext sc) {
                // register Page Beans
@@ -190,44 +190,21 @@ public class SampleApplication extends WebApplication {
                return sampleDB;
        }
 
-       private boolean databaseExists(DBContext context) {
-               // Check wether DB exists
-               DBCommand cmd = context.createCommand();
-               cmd.select(sampleDB.T_DEPARTMENTS.count());
-               try {
-                       return (context.getUtils().querySingleInt(cmd, -1) >= 
0);
-               } catch (QueryFailedException e) {
-                       return false;
-               }
-       }
-
        /*
         * creates a DDL Script for the entire SampleDB Database then checks if 
the
         * department table exists by running "select count(*) from 
DEPARTMENTS" if
         * the department tables does not exist, the entire dll-script is 
executed
         * line by line
         */
-       private void createSampleDatabase(DBContext context) {
-               // create DLL for Database Definition
-               DBSQLScript script = new DBSQLScript(context);
-               sampleDB.getCreateDDLScript(script);
-               // Show DLL Statements
-               System.out.println(script.toString());
-               // Execute Script
-               script.executeAll(false);
-               context.commit();
-               // Open again
-               if (!sampleDB.isOpen()) {
-                       sampleDB.open(context);
-               }
+       private void populateDatabase(DBContext context) {
                // Insert Sample Departments
                insertDepartmentSampleRecord(context, "Procurement", "ITTK");
                int idDevDep = insertDepartmentSampleRecord(context, 
"Development", "ITTK");
                int idSalDep = insertDepartmentSampleRecord(context, "Sales",   
         "ITTK");
                // Insert Sample Employees
-               insertEmployeeSampleRecord(context, "Mr.", "Eugen", "Miller", 
"M",              idDevDep);
-               insertEmployeeSampleRecord(context, "Mr.", "Max", "Mc. 
Callahan", "M",  idDevDep);
-               insertEmployeeSampleRecord(context, "Mrs.", "Anna", "Smith", 
"F",               idSalDep);
+               insertEmployeeSampleRecord(context, "Mr.", "Eugen", "Miller", 
"M",              30000, idDevDep);
+               insertEmployeeSampleRecord(context, "Mr.", "Max", "Mc. 
Callahan", "M",  22500, idDevDep);
+               insertEmployeeSampleRecord(context, "Mrs.", "Anna", "Smith", 
"F",               44250, idSalDep);
                // Commit
         context.commit();
        }
@@ -237,42 +214,65 @@ public class SampleApplication extends WebApplication {
         */
        private int insertDepartmentSampleRecord(DBContext context, String 
department_name, String businessUnit) {
                // Insert a Department
-               DBRecord rec = new DBRecord(context, sampleDB.T_DEPARTMENTS);
-               rec.create();
-               rec.set(sampleDB.T_DEPARTMENTS.NAME, department_name);
-               rec.set(sampleDB.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
-               try {
-                       rec.update();
-               } catch (Exception e) {
-                       log.error(e.getLocalizedMessage());
-                       return 0;
-               }
+               DBRecord rec = new DBRecord(context, sampleDB.DEPARTMENTS);
+               rec.create()
+                  .set(sampleDB.DEPARTMENTS.NAME, department_name)
+                  .set(sampleDB.DEPARTMENTS.BUSINESS_UNIT, businessUnit)
+                  .update();
                // Return Department ID
-               return rec.getInt(sampleDB.T_DEPARTMENTS.ID);
+               return rec.getInt(sampleDB.DEPARTMENTS.ID);
        }
 
        /*
         * Insert a person
         */
-       private int insertEmployeeSampleRecord(DBContext context, String 
salutation, String firstName, String lastName, String gender, int depID) {
+       private int insertEmployeeSampleRecord(DBContext context, String 
salutation, String firstName, String lastName, String gender, int salary, int 
depID) {
                // Insert an Employee
-               DBRecord rec = new DBRecord(context, sampleDB.T_EMPLOYEES);
-               rec.create();
-               rec.set(sampleDB.T_EMPLOYEES.SALUTATION, salutation);
-               rec.set(sampleDB.T_EMPLOYEES.FIRST_NAME, firstName);
-               rec.set(sampleDB.T_EMPLOYEES.LAST_NAME, lastName);
-               rec.set(sampleDB.T_EMPLOYEES.GENDER, gender);
-               rec.set(sampleDB.T_EMPLOYEES.DEPARTMENT_ID, depID);
-               try {
-                       rec.update();
-               } catch (Exception e) {
-                       log.error(e.getLocalizedMessage());
-                       return 0;
-               }
+           SampleDB.TEmployees EMP = sampleDB.EMPLOYEES;
+               DBRecord rec = new DBRecord(context, sampleDB.EMPLOYEES);
+               rec.create()
+                  .set(EMP.SALUTATION, salutation)
+                  .set(EMP.FIRST_NAME, firstName)
+                  .set(EMP.LAST_NAME, lastName)
+                  .set(EMP.GENDER, gender)
+                  .set(EMP.DEPARTMENT_ID, depID)
+           .set(EMP.SALARY, salary)
+                  .update();
+               // insert Payments
+               insertPayments(rec);            
                // Return Employee ID
-               return rec.getInt(sampleDB.T_EMPLOYEES.ID);
+               return rec.getInt(sampleDB.EMPLOYEES.ID);
        }
 
+    /**
+     * <PRE>
+     * Inserts an Payments for a particular Employee
+     * </PRE>
+     */
+    private void insertPayments(DBRecord employee)
+    {
+        if (employee.isNull(sampleDB.EMPLOYEES.SALARY))
+            return; // No salary
+        // monthlySalary
+        BigDecimal monthlySalary = 
employee.getDecimal(sampleDB.EMPLOYEES.SALARY).divide(new BigDecimal(12), 2, 
RoundingMode.HALF_UP);
+        // Insert an Employee
+        LocalDate date = LocalDate.now();
+        date = date.minusDays(date.getDayOfMonth()-1); // first day of this 
month
+        // Add Payment for each month
+        SampleDB.TPayments PAY = sampleDB.PAYMENTS;
+        DBRecord rec = new DBRecord(employee.getContext(), PAY);
+        int months = (int)(Math.random()*6)+11;
+        for (LocalDate month=date.minusMonths(months); !month.isAfter(date); 
month=month.plusMonths(1))
+        {
+            BigDecimal variation = new BigDecimal((Math.random()*200) - 100.0);
+            variation = variation.setScale(2, RoundingMode.HALF_UP);
+            // insert
+            rec.create(DBRecord.key(employee.getIdentity(), month.getYear(), 
month.getMonth()));
+            rec.set(PAY.AMOUNT, monthlySalary.add(variation));
+            rec.update();
+        }
+    }
+
        @Override
        /**
         * returns null as connection pooling is not used
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
index 3ace407..197dcf0 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
@@ -28,25 +28,26 @@ import org.w3c.dom.Element;
 public class SampleConfig extends XMLConfiguration
 {
     // Logger
-    private static final Logger log              = 
LoggerFactory.getLogger(SampleConfig.class);
-    private String              loggingNodeName  = "log4j:configuration";
+    private static final Logger log = 
LoggerFactory.getLogger(SampleConfig.class);
+    
+    private String loggingNodeName  = "log4j:configuration";
 
-    private String              jndiContext      = "";
+    private String jndiContext      = "";
 
-    private String              databaseProvider = "oracle";
+    private String databaseProvider = "oracle";
 
-    private String              jdbcClass        = 
"oracle.jdbc.driver.OracleDriver";
+    private String jdbcClass        = "oracle.jdbc.driver.OracleDriver";
 
-    private String              jdbcURL          = 
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
+    private String jdbcURL          = 
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
 
-    private String              dataSource       = 
"java:comp/env/jdbc/sampleDataSource";
+    private String dataSource       = "java:comp/env/jdbc/sampleDataSource";
 
-    private String              jdbcUser         = "DBSAMPLE";
+    private String jdbcUser         = "DBSAMPLE";
 
-    private String              jdbcPwd          = "DBSAMPLE";
-
-    private String              schemaName       = "DBSAMPLE";
+    private String jdbcPwd          = "DBSAMPLE";
 
+    private String dbmsHandlerClass = "";
+    
     /**
      * Initialize the configuration
      * 
@@ -106,9 +107,9 @@ public class SampleConfig extends XMLConfiguration
         return jdbcURL;
     }
 
-    public String getSchemaName()
+    public String getDbmsHandlerClass()
     {
-        return schemaName;
+        return dbmsHandlerClass;
     }
 
     // ------- Setters -------
@@ -133,9 +134,9 @@ public class SampleConfig extends XMLConfiguration
         this.jdbcUser = jdbcUser;
     }
 
-    public void setSchemaName(String schemaName)
+    public void setDbmsHandlerClass(String dbmsHandlerClass)
     {
-        this.schemaName = schemaName;
+        this.dbmsHandlerClass = dbmsHandlerClass;
     }
 
     /**
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
index 3fdad76..422a70a 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
@@ -43,6 +43,15 @@ public class EmployeeSearchFilter // *Deprecated* implements 
Serializable
         gender = "";
     }
 
+    /**
+     * Additional getter for addSearchConstraint(queryCmd, EMP.ID, filter);
+     * @return the employeeId
+     */
+    public String getId()
+    {
+        return employeeId;
+    }
+
     public String getEmployeeId()
     {
         return employeeId;
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
index 1c4af78..978b457 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
@@ -18,12 +18,18 @@
  */
 package org.apache.empire.jsf2.websample.web.pages;
 
+import java.util.List;
+
 import javax.faces.event.ActionEvent;
 
 import org.apache.empire.commons.ClassUtils;
+import org.apache.empire.data.list.DataListEntry;
+import org.apache.empire.db.DBCommand;
 import org.apache.empire.jsf2.pageelements.RecordPageElement;
 import org.apache.empire.jsf2.pages.PageOutcome;
+import org.apache.empire.jsf2.websample.db.SampleDB;
 import org.apache.empire.jsf2.websample.db.records.EmployeeRecord;
+import org.apache.empire.jsf2.websample.web.SampleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,6 +45,8 @@ public class EmployeeDetailPage extends SamplePage
 
     private int                               activeTab         = 0;
     
+    private List<DataListEntry>               payments;
+    
     public EmployeeDetailPage()
     {
         log.trace("EmployeeDetailPage created");
@@ -68,6 +76,11 @@ public class EmployeeDetailPage extends SamplePage
         return employee.getRecord();
     }
 
+    public List<DataListEntry> getPayments()
+    {
+        return payments;
+    }
+
     public int getActiveTab()
     {
         return activeTab;
@@ -84,6 +97,8 @@ public class EmployeeDetailPage extends SamplePage
         if (!employee.getRecord().isValid())
         {
             employee.reloadRecord();
+            // Load payment data
+            loadPaymentData();
         }
     }
 
@@ -92,11 +107,14 @@ public class EmployeeDetailPage extends SamplePage
         log.info("EmployeeDetailPage Loading entryId {}.", this.idParam);
         // load the record
         this.employee.loadRecord(this.idParam);
+        // Load payment data
+        loadPaymentData();
     }
 
     public void doCreate()
     {
-        getEmployeeRecord().create();
+        // use create(null) to defer primaryKey generation
+        getEmployeeRecord().create(null);
         doRefresh();
     }
     
@@ -143,4 +161,19 @@ public class EmployeeDetailPage extends SamplePage
         log.debug("onTabChanged " + newPage);
     }
     
+    private void loadPaymentData()
+    {
+        SampleContext context = getSampleContext();
+        SampleDB db = this.getDatabase();
+        SampleDB.TPayments PAY = db.PAYMENTS;
+        
+        DBCommand cmd = context.createCommand();
+        cmd.select(PAY.YEAR, PAY.MONTH, PAY.AMOUNT);
+        cmd.where(PAY.EMPLOYEE_ID.is(employee.getRecord().getIdentity()));
+        cmd.orderBy(PAY.YEAR.desc(), PAY.MONTH.desc());
+
+        this.payments = context.getUtils().queryDataList(cmd); 
+        log.info("{} payments have been loaded", this.payments.size());
+    }
+    
 }
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
index fa14c58..5d04b78 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
@@ -52,7 +52,7 @@ public class EmployeeListPage extends SamplePage
     {
         // *Deprecated* private static final long serialVersionUID = 1L;
 
-        private int               employeeId;
+        private int               id; // employeeId;
         private String            name;
         private String            gender;
         private Date              dateOfBirth;
@@ -80,14 +80,14 @@ public class EmployeeListPage extends SamplePage
             this.idParam = idParam;
         }
 
-        public int getEmployeeId()
+        public int getId()
         {
-            return employeeId;
+            return id;
         }
 
-        public void setEmployeeId(int employeeId)
+        public void setId(int id)
         {
-            this.employeeId = employeeId;
+            this.id = id;
         }
 
         public String getName()
@@ -143,7 +143,7 @@ public class EmployeeListPage extends SamplePage
     public EmployeeListPage()
     {
         EmployeeListPage.log.trace("EmployeeListPage created");
-        TEmployees EMP = getDatabase().T_EMPLOYEES;
+        TEmployees EMP = getDatabase().EMPLOYEES;
 
         // create the Employees List page element
         employees = new BeanListPageElement<EmployeeListEntry>(this, 
EmployeeListEntry.class, EMP.ID);
@@ -176,8 +176,8 @@ public class EmployeeListPage extends SamplePage
     
     public void doSearch()
     {
-        TDepartments DEP = getDatabase().T_DEPARTMENTS;
-        TEmployees EMP = getDatabase().T_EMPLOYEES;
+        TDepartments DEP = getDatabase().DEPARTMENTS;
+        TEmployees EMP = getDatabase().EMPLOYEES;
 
         DBColumnExpr FULL_NAME = EMP.LAST_NAME.append(", 
").append(EMP.FIRST_NAME).as("NAME");
         DBColumnExpr DEPARTMENT = DEP.NAME.as("DEPARTMENT");
@@ -200,7 +200,7 @@ public class EmployeeListPage extends SamplePage
 
     public Options getDepartmentOptions()
     {
-       TDepartments DEP = getDatabase().T_DEPARTMENTS;
+       TDepartments DEP = getDatabase().DEPARTMENTS;
 
        DBCommand queryCmd = createQueryCommand();
        queryCmd.select(DEP.ID, DEP.NAME);
@@ -211,7 +211,7 @@ public class EmployeeListPage extends SamplePage
     
     protected void addAllConstraints(DBCommand queryCmd)
     {
-        TEmployees EMP = getDatabase().T_EMPLOYEES;
+        TEmployees EMP = getDatabase().EMPLOYEES;
         EmployeeSearchFilter filter = getSearchFilter();
         
         addSearchConstraint(queryCmd, EMP.ID, filter);
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
 
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
index fb93c93..756b3b1 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
@@ -16,7 +16,7 @@
 # under the License.
 
 #fields
-field.title.employees.employeeId=Mitarbeiter Nr.
+field.title.employees.id=Mitarbeiter Nr.
 field.title.employees.salutation=Anrede
 field.title.employees.firstName=Vorname
 field.title.employees.lastName=Nachname
@@ -25,11 +25,18 @@ field.title.employees.departmentId=Abteilung
 field.title.employees.gender=Geschlecht
 field.title.employees.phoneNumber=Telefonnummer
 field.title.employees.email=E-Mail
+field.title.employees.salary=Jahresgehalt
 field.title.employees.retired=Ausgeschieden
 field.title.employees.updateTimestamp=Zuletzt ge�ndert am
+
+field.title.departments.id=Abteilungsnr
 field.title.departments.name=Abteilungsname
 field.title.departments.head=Abteilugnsleiter
 
+field.title.payments.year=Jahr
+field.title.payments.month=Monat
+field.title.payments.amount=Betrag
+
 #options
 option.employee.gender.male=M�nnlich
 option.employee.gender.female=Weiblich
@@ -84,6 +91,7 @@ employeeDetail_back = Zur
 employeeDetail_delete = L�schen
 employeeDetail_test = Test
 employeeDetail_testMessage = Serialization erfolgreich durchgef�hrt
+employeeDetail_payments = Zahlungen
 
 ## Old stuff
 
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
 
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
index b8a4107..d87d739 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
@@ -16,7 +16,7 @@
 # under the License.
 
 #fields
-field.title.employees.employeeId=Employee ID
+field.title.employees.id=Employee ID
 field.title.employees.salutation=Salutation
 field.title.employees.firstName=Firstname
 field.title.employees.lastName=Lastname
@@ -25,11 +25,18 @@ field.title.employees.departmentId=Department
 field.title.employees.gender=Gender
 field.title.employees.phoneNumber=Phone
 field.title.employees.email=E-Mail
+field.title.employees.salary=Salary (Year)
 field.title.employees.retired=Retired
 field.title.employees.updateTimestamp=Last change
+
+field.title.departments.id=Department ID
 field.title.departments.name=Department
 field.title.departments.head=Head of Dept.
 
+field.title.payments.year=Year
+field.title.payments.month=Month
+field.title.payments.amount=Amount
+
 #options
 option.employee.gender.male=Male
 option.employee.gender.female=Female
@@ -83,6 +90,7 @@ employeeDetail_back = Back
 employeeDetail_delete = Delete
 employeeDetail_test = Test
 employeeDetail_testMessage = Serialization successful
+employeeDetail_payments = Payments
 
 # Old stuff
 
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
index 195898d..0170ab3 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
@@ -12,8 +12,7 @@
 <config>
 
        <properties>
-               <!-- provider name must match the property-section containing 
the connection 
-                       data -->
+               <!-- provider name must match the property-section containing 
the connection data -->
                <databaseProvider>hsqldb</databaseProvider>
        </properties>
 
@@ -24,7 +23,11 @@
                <jdbcURL>jdbc:hsqldb:file:hsqldb/sample;shutdown=true</jdbcURL>
                <jdbcUser>sa</jdbcUser>
                <jdbcPwd></jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.hsql.DBMSHandlerHSql</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <!-- no properties -->
+               </dbmsHandlerProperites>
        </properties-hsqldb>
 
        <properties-mysql>
@@ -33,28 +36,84 @@
                <jdbcClass>com.mysql.jdbc.Driver</jdbcClass>
                <jdbcURL>jdbc:mysql://localhost</jdbcURL>
                <jdbcUser>root</jdbcUser>
-               <jdbcPwd>empire-db</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <jdbcPwd>esteam</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.mysql.DBMSHandlerMySQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
        </properties-mysql>
+       
+       <properties-postgresql>
+               <!-- JDBC properties for a PostreSQL Database connection -->
+               <!-- Required jar file: postgresql-8.3-603.jdbc4.jar -->
+               <jdbcClass>org.postgresql.Driver</jdbcClass>
+               <jdbcURL>jdbc:postgresql://localhost</jdbcURL>
+               <jdbcUser>postgres</jdbcUser>
+               <jdbcPwd>postgres</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-postgresql>
+       
+       <properties-h2>
+               <!-- JDBC properties for a H2 Database connection -->
+               <!-- Required jar file: h2-1.1.107.jar -->
+               <jdbcClass>org.h2.Driver</jdbcClass>
+               <jdbcURL>jdbc:h2:h2/DBSAMPLE</jdbcURL>
+               <jdbcUser>sa</jdbcUser>
+               <jdbcPwd></jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.h2.DBMSHandlerH2</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-h2>
+       
+       <properties-derby>
+               <!-- JDBC properties for a Derby Database connection -->
+               <!-- Required jar file: derby-10.4.2.0.jar -->
+               <jdbcClass>org.apache.derby.jdbc.EmbeddedDriver</jdbcClass>
+               <jdbcURL>jdbc:derby:derby/DBSAMPLE;create=true</jdbcURL>
+               <jdbcUser></jdbcUser>
+               <jdbcPwd></jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.derby.DBMSHandlerDerby</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-derby>
 
        <properties-oracle>
                <!-- JDBC properties for an Oracle Database connection -->
                <!-- Required jar file: ojdbc14.jar -->
                <jdbcClass>oracle.jdbc.driver.OracleDriver</jdbcClass>
-               <jdbcURL>jdbc:oracle:thin:@esteams2:1521:ora10</jdbcURL>
+               <jdbcURL>jdbc:oracle:thin:@esteams12:1521:ora12</jdbcURL>
                <jdbcUser>DBSAMPLE</jdbcUser>
                <jdbcPwd>DBSAMPLE</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.oracle.DBMSHandlerOracle</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <!-- no properties -->
+               </dbmsHandlerProperites>
        </properties-oracle>
 
        <properties-sqlserver>
                <!-- JDBC properties for a Microsoft SQL-Server Database 
connection -->
-               <!-- Required jar file: sqljdbc.jar -->
                
<jdbcClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbcClass>
-               <jdbcURL>jdbc:sqlserver://192.168.0.2:1433</jdbcURL>
-               <jdbcUser>sa</jdbcUser>
-               <jdbcPwd>empire-db</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <jdbcURL>jdbc:sqlserver://esteams12\sql17</jdbcURL>
+               <jdbcUser>jdbcUser</jdbcUser>
+               <jdbcPwd>jdbcPwd</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+                       <useSequenceTable>false</useSequenceTable>
+                       <!-- useDateTime2: set to false for databases using 
DATETIME for timestamps instead of DATETIME2 -->
+                       <useDateTime2>true</useDateTime2>
+               </dbmsHandlerProperites>
        </properties-sqlserver>
 
        <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
index c42ec33..e7123df 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
@@ -166,6 +166,7 @@ table.eTabPanel {
 table.eTabPanel tr td.eTabPage {
        padding: 8px;
        background-color: #F8F8F8;
+       vertical-align: top;
 }
 table.eTabPanel tr td.eTabPage div.formPanel {
        border: 0;
@@ -173,4 +174,7 @@ table.eTabPanel tr td.eTabPage div.formPanel {
 div.info-msg {
        padding: 12px;
        background-color: #FFFFCA;
-}
\ No newline at end of file
+}
+.paymentData {
+       border: 2px gray solid;
+}
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
index 8dd3d09..5b85e04 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
@@ -51,13 +51,37 @@
                                        <tr><e:control 
column="#{db.EMPLOYEES.GENDER}"   /> </tr>
                                        <tr><e:control 
column="#{db.EMPLOYEES.PHONE_NUMBER}" /></tr>
                                        <tr><e:control 
column="#{db.EMPLOYEES.EMAIL}" /></tr>
+                                       <tr><e:control 
column="#{db.EMPLOYEES.SALARY}" /></tr>
                                        <tr><e:control 
column="#{db.EMPLOYEES.RETIRED}" /></tr>
                                        <tr><e:control 
column="#{db.EMPLOYEES.UPDATE_TIMESTAMP}" format="date-format:full" 
readonly="true" rendered="#{page.idParam != null}" /></tr> 
                                </sample:formPanel>
                                </e:record>
                                
                        </e:tabPage>
+                       
                        <e:tabPage title="#{msg.employeeDetail_tab_extended}" 
id="tabExtended" disabled="#{not page.employeeRecord.exists}">
+                               <h3><h:outputText 
value="#{msg.employeeDetail_payments}"/></h3>
+                               <!-- Payment data -->
+                               <h:dataTable id="paymentData" 
value="#{page.payments}" var="item" rowClasses="odd,even">
+                                       <h:column>
+                                               <f:facet name="header">
+                                                       <e:title 
column="#{db.PAYMENTS.YEAR}" />
+                                               </f:facet>
+                                               <e:value record="#{item}" 
column="#{db.PAYMENTS.YEAR}"/>
+                                       </h:column>
+                                       <h:column>
+                                               <f:facet name="header">
+                                                       <e:title 
column="#{db.PAYMENTS.MONTH}" />
+                                               </f:facet>
+                                               <e:value record="#{item}" 
column="#{db.PAYMENTS.MONTH}"/>
+                                       </h:column>
+                                       <h:column>
+                                               <f:facet name="header">
+                                                       <e:title 
column="#{db.PAYMENTS.AMOUNT}" />
+                                               </f:facet>
+                                               <e:value record="#{item}" 
column="#{db.PAYMENTS.AMOUNT}"/>
+                                       </h:column>
+                               </h:dataTable>
                                <h:panelGroup layout="block" 
styleClass="info-msg">
                                        <h:outputText 
value="#{msg.employeeDetail_msg_extended}"/>
                                </h:panelGroup>
diff --git a/empire-db-examples/empire-db-example-vue/pom.xml 
b/empire-db-examples/empire-db-example-vue/pom.xml
index 5015784..c395f31 100644
--- a/empire-db-examples/empire-db-example-vue/pom.xml
+++ b/empire-db-examples/empire-db-example-vue/pom.xml
@@ -42,13 +42,14 @@
                        <artifactId>hsqldb</artifactId>
                </dependency>
 
-               <!-- Tomcat JDBC Connection Pool -->
+               <!-- Tomcat JDBC Connection Pool 
                <dependency>
                        <groupId>org.apache.tomcat</groupId>
                        <artifactId>tomcat-dbcp</artifactId>
                        <version>8.0.39</version>
                        <scope>provided</scope>
                </dependency>
+               -->
 
                <!-- Empire-db -->
                <dependency>
@@ -60,19 +61,19 @@
                <dependency>
                        <groupId>javax.ws.rs</groupId>
                        <artifactId>javax.ws.rs-api</artifactId>
-                       <version>2.0</version>
+                       <version>2.1.1</version>
                </dependency>
 
                <!-- JSON -->
                <dependency>
                        <groupId>javax.json</groupId>
                        <artifactId>javax.json-api</artifactId>
-                       <version>1.0</version>
+                       <version>1.1.4</version>
                </dependency>
                <dependency>
                        <groupId>org.glassfish</groupId>
                        <artifactId>javax.json</artifactId>
-                       <version>1.0.4</version>
+                       <version>1.1.4</version>
                </dependency>
 
                <!-- Jersey -->
@@ -81,13 +82,56 @@
                        <artifactId>jersey-container-servlet-core</artifactId>
                        <version>2.25.1</version>
                </dependency>
-
                <dependency>
                        <groupId>org.glassfish.jersey.media</groupId>
                        <artifactId>jersey-media-json-jackson</artifactId>
                        <version>2.25.1</version>
                </dependency>
 
+               <!-- All Databases (scope: runtime) -->
+               <!-- hsqldb -->
+               <dependency>
+                   <groupId>org.hsqldb</groupId>
+                   <artifactId>hsqldb</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- dh2 -->
+               <dependency>
+                   <groupId>com.h2database</groupId>
+                   <artifactId>h2</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- derby -->
+               <dependency>
+                   <groupId>org.apache.derby</groupId>
+                   <artifactId>derby</artifactId>
+                   <scope>runtime</scope>
+               </dependency> 
+               <!-- mysql -->
+               <dependency>
+                   <groupId>mysql</groupId>
+                   <artifactId>mysql-connector-java</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- postgresql -->
+               <dependency>
+                   <groupId>org.postgresql</groupId>
+                   <artifactId>postgresql</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- msssql -->
+               <dependency>
+                   <groupId>com.microsoft.sqlserver</groupId>
+                   <artifactId>mssql-jdbc</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+               <!-- oracle -->
+               <dependency>
+                   <groupId>com.oracle.database.jdbc</groupId>
+                   <artifactId>ojdbc8</artifactId>
+                   <scope>runtime</scope>
+               </dependency>
+
                <!-- common io -->
                <dependency>
                        <groupId>commons-io</groupId>
@@ -100,9 +144,6 @@
                        <artifactId>slf4j-log4j12</artifactId>
                </dependency>
 
-               <!-- Test <dependency> <groupId>junit</groupId> 
<artifactId>junit</artifactId> 
-                       <version>4.12</version> </dependency> -->
-
        </dependencies>
 
        <build>
diff --git a/empire-db-examples/empire-db-example-vue/readme.txt 
b/empire-db-examples/empire-db-example-vue/readme.txt
new file mode 100644
index 0000000..c5fc675
--- /dev/null
+++ b/empire-db-examples/empire-db-example-vue/readme.txt
@@ -0,0 +1,30 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+
+In order to run the vue example please do the following:
+
+1. Start the REST-Service via "Debug on Server" using Tomcat
+
+2. Go to the directory "src/main/vue" (or open in WebStorm)
+
+3. Rename file "_eslintrc.js.bak" to ".eslintrc.js" (must start with .)
+
+4. Run the command:    npm install
+
+5. Run the command:    npm run dev
+
+6. Open Url:  http://localhost:8088/
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
similarity index 81%
copy from 
empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
copy to 
empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
index 3ace407..fc4566e 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.empire.jsf2.websample.web;
+package org.apache.empire.rest.app;
 
 import org.apache.empire.xml.XMLConfiguration;
 import org.apache.empire.xml.XMLUtil;
@@ -28,24 +28,25 @@ import org.w3c.dom.Element;
 public class SampleConfig extends XMLConfiguration
 {
     // Logger
-    private static final Logger log              = 
LoggerFactory.getLogger(SampleConfig.class);
-    private String              loggingNodeName  = "log4j:configuration";
+    private static final Logger log = 
LoggerFactory.getLogger(SampleConfig.class);
+    
+    private String loggingNodeName  = "log4j:configuration";
 
-    private String              jndiContext      = "";
+    private String jndiContext      = "";
 
-    private String              databaseProvider = "oracle";
+    private String databaseProvider = "oracle";
 
-    private String              jdbcClass        = 
"oracle.jdbc.driver.OracleDriver";
+    private String jdbcClass        = "oracle.jdbc.driver.OracleDriver";
 
-    private String              jdbcURL          = 
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
+    private String jdbcURL          = 
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
 
-    private String              dataSource       = 
"java:comp/env/jdbc/sampleDataSource";
+    private String dataSource       = "java:comp/env/jdbc/sampleDataSource";
 
-    private String              jdbcUser         = "DBSAMPLE";
+    private String jdbcUser         = "DBSAMPLE";
 
-    private String              jdbcPwd          = "DBSAMPLE";
+    private String jdbcPwd          = "DBSAMPLE";
 
-    private String              schemaName       = "DBSAMPLE";
+    private String dbmsHandlerClass = "";
 
     /**
      * Initialize the configuration
@@ -106,9 +107,9 @@ public class SampleConfig extends XMLConfiguration
         return jdbcURL;
     }
 
-    public String getSchemaName()
+    public String getDbmsHandlerClass()
     {
-        return schemaName;
+        return dbmsHandlerClass;
     }
 
     // ------- Setters -------
@@ -133,9 +134,9 @@ public class SampleConfig extends XMLConfiguration
         this.jdbcUser = jdbcUser;
     }
 
-    public void setSchemaName(String schemaName)
+    public void setDbmsHandlerClass(String dbmsHandlerClass)
     {
-        this.schemaName = schemaName;
+        this.dbmsHandlerClass = dbmsHandlerClass;
     }
 
     /**
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
index e77ac51..b4e078c 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
@@ -21,8 +21,10 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Queue;
 import java.util.ResourceBundle;
 
 import javax.servlet.ServletContext;
@@ -33,16 +35,10 @@ import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBRecord;
-import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.exceptions.QueryFailedException;
 import org.apache.empire.dbms.DBMSHandler;
-import org.apache.empire.dbms.hsql.DBMSHandlerHSql;
 import org.apache.empire.rest.service.Service;
 import org.apache.empire.vue.sample.db.SampleDB;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.PatternLayout;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +71,7 @@ public class SampleServiceApp
             System.out.println("ServletContextListener:contextDestroyed");
         }
     }
-    
+        
     private static SampleServiceApp app;
     
     public static SampleServiceApp instance()
@@ -83,12 +79,14 @@ public class SampleServiceApp
         return app;
     }
 
+    private SampleConfig config = new SampleConfig();
+    
     private Map<Locale, ResourceTextResolver> textResolverMap = new 
HashMap<Locale, ResourceTextResolver>();
     
     protected SampleServiceApp(ServletContext ctx) 
     {
         // Logging
-        initLogging();
+        config.init(ctx.getRealPath("WEB-INF/config.xml"));
         
         String messageBundle ="lang.messages";
         textResolverMap.put(Locale.ENGLISH, new 
ResourceTextResolver(ResourceBundle.getBundle(messageBundle, Locale.ENGLISH)));
@@ -98,7 +96,7 @@ public class SampleServiceApp
         Connection conn = getJDBCConnection(ctx);
         try {
             // DB
-            DBMSHandler dbms = new DBMSHandlerHSql();
+            DBMSHandler dbms = getDBMSHandler(config.getDatabaseProvider(), 
conn);
             DBContext context = new DBContextStatic(dbms, conn);
             SampleDB db = initDatabase(ctx, context);
             // Add to context
@@ -115,34 +113,70 @@ public class SampleServiceApp
         return (tr!=null ? tr : textResolverMap.get(Locale.ENGLISH));
     }
     
-    public Connection getJDBCConnection(ServletContext appContext) {
-        // Establish a new database connection
-        Connection conn = null;
+    /**
+     * Creates an Empire-db DatabaseDriver for the given provider and applies 
dbms specific configuration 
+     */
+    private DBMSHandler getDBMSHandler(String provider, Connection conn)
+    {
+        try
+        {   // Get Driver Class Name
+            String dbmsHandlerClass = config.getDbmsHandlerClass();
+            if (StringUtils.isEmpty(dbmsHandlerClass))
+                throw new RuntimeException("Configuration error: Element 
'dbmsHandlerClass' not found in node 'properties-"+provider+"'");
 
-        String jdbcURL = "jdbc:hsqldb:file:hsqldb/sample;shutdown=true";
-        String jdbcUser = "sa";
-        String jdbcPwd = "";
+            // Create dbms
+            DBMSHandler dbms = (DBMSHandler) 
Class.forName(dbmsHandlerClass).newInstance();
 
-        if (jdbcURL.indexOf("file:") > 0) {
-            jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" + 
appContext.getRealPath("/"));
+            // Configure dbms
+            config.readProperties(dbms, "properties-"+provider, 
"dbmsHandlerProperites");
+
+            // done
+            return dbms;
+            
+        } catch (Exception e)
+        {   // catch any checked exception and forward it
+            e.printStackTrace();
+            throw new RuntimeException(e);
         }
+    }
+    
+    /*
+     * Our own simple Connection pool 
+     */
+    private final Queue<Connection> connPool = new LinkedList<Connection>(); 
+    
+    /*
+     * getJDBCConnection
+     */
+    public Connection getJDBCConnection(ServletContext appContext)
+    {
+        Connection conn = connPool.poll();
+        if (conn!=null)
+            return conn;
+        
+        // Establish a new database connection
+        String jdbcURL = config.getJdbcURL();
+        if (jdbcURL.indexOf("file:") > 0)
+            jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" + 
appContext.getRealPath("/"));
         // Connect
-        log.info("Connecting to Database'" + jdbcURL + "' / User=" + jdbcUser);
-        try { // Connect to the databse
-            Class.forName("org.hsqldb.jdbcDriver").newInstance();
-            conn = DriverManager.getConnection(jdbcURL, jdbcUser, jdbcPwd);
+        log.info("Connecting to Database'" + jdbcURL + "' / User=" + 
config.getJdbcUser());
+        try
+        { // Connect to the database
+            Class.forName(config.getJdbcClass()).newInstance();
+            conn = DriverManager.getConnection(jdbcURL, config.getJdbcUser(), 
config.getJdbcPwd());
             log.info("Connected successfully");
             // set the AutoCommit to false this session. You must commit
             // explicitly now
             conn.setAutoCommit(false);
             log.info("AutoCommit is " + conn.getAutoCommit());
-
-        } catch (Exception e) {
-            log.error("Failed to connect directly to '" + jdbcURL + "' / 
User=" + jdbcUser);
+            return conn;
+        }
+        catch (Exception e)
+        {
+            log.error("Failed to connect directly to '" + config.getJdbcURL() 
+ "' / User=" + config.getJdbcUser());
             log.error(e.toString());
             throw new RuntimeException(e);
         }
-        return conn;
     }
 
     public void releaseConnection(Connection conn, boolean commit) {
@@ -165,7 +199,8 @@ public class SampleServiceApp
                 log.debug("REQUEST rolled back.");
             }
             // close connection / return to pool
-            conn.close();
+            // conn.close();
+            connPool.add(conn);
         }
         catch (SQLException e)
         {
@@ -183,38 +218,17 @@ public class SampleServiceApp
         DBMSHandler dbms = context.getDbms();
         log.info("Opening database '{}' using handler '{}'", 
db.getClass().getSimpleName(), dbms.getClass().getSimpleName());
         db.open(context);
-        if (!databaseExists(db, context)) {
-            // STEP 4: Create Database
-            log.info("Creating database {}", db.getClass().getSimpleName());
-            createSampleDatabase(db, context);
-        }
-        return db;
-    }
-
-    private static boolean databaseExists(SampleDB db, DBContext context) {
-        // Check wether DB exists
+        // check if database was just created 
         DBCommand cmd = context.createCommand();
-        cmd.select(db.T_DEPARTMENTS.count());
-        try {
-            return (context.getUtils().querySingleInt(cmd, -1) >= 0);
-        } catch (QueryFailedException e) {
-            return false;
+        cmd.select(db.EMPLOYEES.count());
+        if (context.getUtils().querySingleInt(cmd)==0)
+        {   // Populate Database
+            populateDatabase(db, context);
         }
+        return db;
     }
 
-    private static void createSampleDatabase(SampleDB db, DBContext context) {
-        // create DLL for Database Definition
-        DBSQLScript script = new DBSQLScript(context);
-        db.getCreateDDLScript(script);
-        // Show DLL Statements
-        System.out.println(script.toString());
-        // Execute Script
-        script.executeAll(false);
-        context.commit();
-        // Open again
-        if (!db.isOpen()) {
-            db.open(context);
-        }
+    private static void populateDatabase(SampleDB db, DBContext context) {
         // Insert Sample Departments
         insertDepartmentSampleRecord(db, context, "Procurement", "ITTK");
         int idDevDep = insertDepartmentSampleRecord(db, context, 
"Development", "ITTK");
@@ -229,10 +243,10 @@ public class SampleServiceApp
 
     private static int insertDepartmentSampleRecord(SampleDB db, DBContext 
context, String department_name, String businessUnit) {
         // Insert a Department
-        DBRecord rec = new DBRecord(context, db.T_DEPARTMENTS);
+        DBRecord rec = new DBRecord(context, db.DEPARTMENTS);
         rec.create();
-        rec.set(db.T_DEPARTMENTS.NAME, department_name);
-        rec.set(db.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
+        rec.set(db.DEPARTMENTS.NAME, department_name);
+        rec.set(db.DEPARTMENTS.BUSINESS_UNIT, businessUnit);
         try {
             rec.update();
         } catch (Exception e) {
@@ -240,7 +254,7 @@ public class SampleServiceApp
             return 0;
         }
         // Return Department ID
-        return rec.getInt(db.T_DEPARTMENTS.ID);
+        return rec.getInt(db.DEPARTMENTS.ID);
     }
 
     /*
@@ -248,13 +262,13 @@ public class SampleServiceApp
      */
     private static int insertEmployeeSampleRecord(SampleDB db, DBContext 
context, String salutation, String firstName, String lastName, String gender, 
int depID) {
         // Insert an Employee
-        DBRecord rec = new DBRecord(context, db.T_EMPLOYEES);
+        DBRecord rec = new DBRecord(context, db.EMPLOYEES);
         rec.create();
-        rec.set(db.T_EMPLOYEES.SALUTATION, salutation);
-        rec.set(db.T_EMPLOYEES.FIRST_NAME, firstName);
-        rec.set(db.T_EMPLOYEES.LAST_NAME, lastName);
-        rec.set(db.T_EMPLOYEES.GENDER, gender);
-        rec.set(db.T_EMPLOYEES.DEPARTMENT_ID, depID);
+        rec.set(db.EMPLOYEES.SALUTATION, salutation);
+        rec.set(db.EMPLOYEES.FIRST_NAME, firstName);
+        rec.set(db.EMPLOYEES.LAST_NAME, lastName);
+        rec.set(db.EMPLOYEES.GENDER, gender);
+        rec.set(db.EMPLOYEES.DEPARTMENT_ID, depID);
         try {
             rec.update();
         } catch (Exception e) {
@@ -262,9 +276,10 @@ public class SampleServiceApp
             return 0;
         }
         // Return Employee ID
-        return rec.getInt(db.T_EMPLOYEES.ID);
+        return rec.getInt(db.EMPLOYEES.ID);
     }
 
+    /*
     private void initLogging() {
 
         // Init Logging
@@ -289,7 +304,7 @@ public class SampleServiceApp
         // Vue.js Sample
         org.apache.log4j.Logger miLog = 
org.apache.log4j.Logger.getLogger("org.apache.empire.rest");
         miLog.setLevel(loglevel);
-
     }
+    */
     
 }
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
index cdb6505..71719a2 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
@@ -67,14 +67,14 @@ public class EmployeeService extends Service {
         // Query Department options
         SampleDB db = getDatabase();
         DBCommand cmd = context.createCommand();
-        cmd.select(db.T_DEPARTMENTS.ID, db.T_DEPARTMENTS.NAME);
-        cmd.join  (db.T_DEPARTMENTS.ID, db.T_EMPLOYEES.DEPARTMENT_ID);
+        cmd.select(db.DEPARTMENTS.ID, db.DEPARTMENTS.NAME);
+        cmd.join  (db.DEPARTMENTS.ID, db.EMPLOYEES.DEPARTMENT_ID);
         cmd.groupBy(cmd.getSelectExpressions());
-        cmd.orderBy(db.T_DEPARTMENTS.NAME);
+        cmd.orderBy(db.DEPARTMENTS.NAME);
         Options departmentOptions = context.getUtils().queryOptionList(cmd);
         
         // Create Metadata
-        TEmployees TE = db.T_EMPLOYEES;
+        TEmployees TE = db.EMPLOYEES;
         JsoColumnMeta[] meta = new JsoColumnMeta[] { 
           new JsoColumnMeta(TE.ID, textResolver),
           new JsoColumnMeta(TE.FIRST_NAME, textResolver),
@@ -95,8 +95,8 @@ public class EmployeeService extends Service {
 
         SampleDB db = getDatabase();
 
-        TEmployees TE = db.T_EMPLOYEES;
-        TDepartments TD = db.T_DEPARTMENTS;
+        TEmployees TE = db.EMPLOYEES;
+        TDepartments TD = db.DEPARTMENTS;
         DBColumnExpr FULL_NAME  = TE.LAST_NAME.append(", 
").append(TE.FIRST_NAME).as("NAME");
         DBColumnExpr DEPARTMENT = TD.NAME.as("DEPARTMENT");
         FULL_NAME.setTitle("!field.title.employees.fullname");
@@ -105,7 +105,8 @@ public class EmployeeService extends Service {
 
         RecordContext context = getRecordContext();
         DBCommand cmd = context.createCommand();
-        cmd.select(TE.ID, FULL_NAME, DEPARTMENT, TE.GENDER, TE.DATE_OF_BIRTH, 
TE.RETIRED);
+        cmd.select(TE.ID.as("EMPLOYEE_ID"));
+        cmd.select(FULL_NAME, DEPARTMENT, TE.GENDER, TE.DATE_OF_BIRTH, 
TE.RETIRED);
         cmd.join  (TE.DEPARTMENT_ID, TD.ID, DBJoinType.LEFT);
 
         // apply all filters
@@ -169,7 +170,7 @@ public class EmployeeService extends Service {
         try {
             // return a record
             EmployeeRecord rec = new EmployeeRecord(ctx);
-            rec.create();
+            rec.create(null);
             JsoRecordData emp = new JsoRecordData(rec);
             return Response.ok(new JsoResultWithMeta(emp, 
rec.getMeta())).build();
             
@@ -212,7 +213,7 @@ public class EmployeeService extends Service {
         try {
             // return a record
             SampleDB db = getDatabase();
-            db.T_EMPLOYEES.deleteRecord(employeeId, ctx);
+            db.EMPLOYEES.deleteRecord(employeeId, ctx);
             return Response.ok().build();
             
         } catch(EmpireException e) {
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
index fabf12c..c22c195 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
@@ -18,79 +18,100 @@
  */
 package org.apache.empire.vue.sample.db;
 
-import org.apache.empire.commons.Options;
+import java.sql.SQLException;
+
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.db.validation.DBModelErrorLogger;
+import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+/**
+ * <PRE>
+ * This file contains the definition of the data model in Java.
+ * The SampleDB data model consists of three tables and two foreign key 
relations.
+ * The tables are defined as nested classes here, but you may put them in 
separate files if you want to.
+ * 
+ * The class also provided methods to create the database (if it doesn't 
exist) 
+ * and to check the datamodel i.e. to compare this definition to the database 
in the DBMS
+ *
+ * PLEASE NOTE THE NAMING CONVENTION:
+ * Since all tables, views and columns are declared as "final" constants we 
have all put them in upper case.
+ *
+ * You may declare other database tables or views in the same way.
+ * </PRE>
+ */
 public class SampleDB extends DBDatabase
 {
-    // *Deprecated* private static final long serialVersionUID = 1L;
-
-    // Declare all Tables
-    public final TDepartments       T_DEPARTMENTS    = new TDepartments(this);
-    public final TEmployees         T_EMPLOYEES      = new TEmployees(this);
-
+    // Logger
+    private static final Logger log = LoggerFactory.getLogger(SampleDB.class);
+    
     /**
-     * Constructor SampleDB
+     * Gender enum
      */
-    public SampleDB()
+    public enum Gender
     {
-        // Define Foreign-Key Relations
-        addRelation(T_EMPLOYEES.DEPARTMENT_ID.referenceOn(T_DEPARTMENTS.ID));
-    }
-
-    // Needed for the DBELResolver
-    @Override
-    protected void register(String id)
-    {
-        super.register("db");
+        M("Male"),
+        F("Female"),
+        U("Unknown");
+        
+        private final String title;
+        private Gender(String title)
+        {
+            this.title = title;
+        }
+        @Override
+        public String toString()
+        {
+            return title;
+        }
     }
 
     /**
-     * This class represents the definition of the Departments table.
+     * This class represents the Departments table.
      */
     public static class TDepartments extends SampleTable
     {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-
         public final DBTableColumn ID;
         public final DBTableColumn NAME;
         public final DBTableColumn HEAD;
         public final DBTableColumn BUSINESS_UNIT;
         public final DBTableColumn UPDATE_TIMESTAMP;
 
-        public TDepartments(DBDatabase db)
+        public TDepartments(SampleDB db)
         {
             super("DEPARTMENTS", db);
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
  0, true, "DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. Oracle)
-            NAME                       = addColumn("NAME",                     
DataType.VARCHAR,       80, true);
-            HEAD                       = addColumn("HEAD",                     
DataType.VARCHAR,       80, false);
-            BUSINESS_UNIT      = addColumn("BUSINESS_UNIT",    
DataType.VARCHAR,    4, true, "ITTK");
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,  0, true);
-
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(DEPARTMENT_ID);
-            // Set other Indexes
-            addIndex("DEARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+            ID              = addIdentity ("ID",               
"DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. Oracle)
+            NAME            = addColumn   ("NAME",             
DataType.VARCHAR,      80, true);
+            HEAD            = addColumn   ("HEAD",             
DataType.VARCHAR,      80, false);
+            BUSINESS_UNIT   = addColumn   ("BUSINESS_UNIT",    
DataType.VARCHAR,       4, true, "ITTK");
+            UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
+
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
 
+            // Set other Indexes
+            addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+            
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("DEPARTMENT");
         }
     }
 
-  
-
     /**
-     * This class represents the definition of the Employees table.
+     * This class represents the Employees table.
      */
     public static class TEmployees extends SampleTable
     {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-
         public final DBTableColumn ID;
         public final DBTableColumn SALUTATION;
-//      public final DBTableColumn PICTURE;
         public final DBTableColumn FIRST_NAME;
         public final DBTableColumn LAST_NAME;
         public final DBTableColumn DATE_OF_BIRTH;
@@ -98,53 +119,151 @@ public class SampleDB extends DBDatabase
         public final DBTableColumn GENDER;
         public final DBTableColumn PHONE_NUMBER;
         public final DBTableColumn EMAIL;
+        public final DBTableColumn SALARY;
         public final DBTableColumn RETIRED;
         public final DBTableColumn UPDATE_TIMESTAMP;
-        public TEmployees(DBDatabase db)
+
+        public TEmployees(SampleDB db)
         {
             super("EMPLOYEES", db);
-            // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
  0, true, "EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS 
(e.g. Oracle)
-            SALUTATION                 = addColumn("SALUTATION",               
DataType.VARCHAR,        5, false);
-            FIRST_NAME                 = addColumn("FIRST_NAME",               
DataType.VARCHAR,       40, true);
-            LAST_NAME          = addColumn("LAST_NAME",                
DataType.VARCHAR,       40, true);
-            DATE_OF_BIRTH      = addColumn("DATE_OF_BIRTH",    DataType.DATE,  
         0, false);
-            DEPARTMENT_ID      = addColumn("DEPARTMENT_ID",    
DataType.INTEGER,        0, true);
-            GENDER                     = addColumn("GENDER",                   
DataType.VARCHAR,        1, false);
-            PHONE_NUMBER       = addColumn("PHONE_NUMBER",     
DataType.VARCHAR,       40, false);
-            EMAIL                      = addColumn("EMAIL",                    
DataType.VARCHAR,       80, false);
-            RETIRED                    = addColumn("RETIRED",                  
DataType.BOOL,           0, true, false);
-            // PICTURE                 = addColumn("PICTURE",                  
DataType.BLOB,           0, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,  0, true);
-
-            // Primary Key (automatically set due to AUTOINC column)
-            // setPrimaryKey(EMPLOYEE_ID);
-            // Set other Indexes
-            addIndex("PERSON_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
-
-            // Create Options for GENDER column
-            Options genders = new Options();
-            genders.set("M", "!option.employee.gender.male");
-            genders.set("F", "!option.employee.gender.female");
-            GENDER.setOptions(genders);
-            GENDER.setControlType("select");
-
-            Options retired = new Options();
-            retired.set(false, "!option.employee.active");
-            retired.set(true,  "!option.employee.retired");
-            RETIRED.setOptions(retired);
-            RETIRED.setControlType("checkbox");
             
-            // Set special control types
-            DEPARTMENT_ID.setControlType("select");
-            PHONE_NUMBER .setControlType("phone");
+            // ID
+            ID              = addIdentity  ("ID",               
"EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS (e.g. Oracle)
+            SALUTATION      = addColumn    ("SALUTATION",       
DataType.VARCHAR,      5, false);
+            FIRST_NAME      = addColumn    ("FIRST_NAME",       
DataType.VARCHAR,     40, true);
+            LAST_NAME       = addColumn    ("LAST_NAME",        
DataType.VARCHAR,     40, true);
+            DATE_OF_BIRTH   = addColumn    ("DATE_OF_BIRTH",    DataType.DATE, 
        0, false);
+            DEPARTMENT_ID   = addForeignKey("DEPARTMENT_ID",    
db.DEPARTMENTS,           true);
+            GENDER          = addColumn    ("GENDER",           
DataType.VARCHAR,      1, true, Gender.class);
+            PHONE_NUMBER    = addColumn    ("PHONE_NUMBER",     
DataType.VARCHAR,     40, false, "0815-");
+            EMAIL           = addColumn    ("EMAIL",            
DataType.VARCHAR,     80, false);
+            SALARY          = addColumn    ("SALARY",           
DataType.DECIMAL,   10.2, false);
+            RETIRED         = addColumn    ("RETIRED",          DataType.BOOL, 
        0, true, false);
+            UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
             
-            // Set optional formatting attributes
-            DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
+
+            // Set other Indexes
+            addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
+
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("EMPLOYEE");
+        }
+    }
+
+    /**
+     * This class represents the Payments table.
+     */
+    public static class TPayments extends SampleTable
+    {
+        public final DBTableColumn EMPLOYEE_ID;
+        public final DBTableColumn YEAR;
+        public final DBTableColumn MONTH;
+        public final DBTableColumn AMOUNT;
+
+        public TPayments(SampleDB db)
+        {
+            super("PAYMENTS", db);
             
-            // PICTURE.setControlType("blob");
+            // ID
+            EMPLOYEE_ID     = addForeignKey("EMPLOYEE_ID",  db.EMPLOYEES,      
       true);
+            YEAR            = addColumn("YEAR",             DataType.DECIMAL,  
  4.0, true);
+            MONTH           = addColumn("MONTH",            DataType.DECIMAL,  
  2.0, true);
+            AMOUNT          = addColumn("AMOUNT",           DataType.DECIMAL,  
  8.2, true);
+
+            // Primary Key 
+            setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
 
+            // optional: set entity name for selectQualified() to singular 
since table is plural
+            setEntityName("PAYMENT");
         }
     }
+    
+    // Declare all Tables and Views here
+    public final TDepartments  DEPARTMENTS = new TDepartments(this);
+    public final TEmployees    EMPLOYEES   = new TEmployees(this);
+    public final TPayments     PAYMENTS    = new TPayments(this);
 
+    /**
+     * Constructor of the SampleDB data model
+     *
+     * Put all foreign key relations here.
+     */
+    public SampleDB()
+    {
+        // Define additional Foreign-Key Relations here
+        // which have not already been defined by addForeignKey()
+        // addRelation( {Source Column}.referenceOn( {Target Column} ));
+        log.info("SampleDB has been created with {} Tables and {} Relations", 
getTables().size(), getRelations().size());
+    }
+
+    // Needed for the DBELResolver
+    @Override
+    protected void register(String id)
+    {
+        super.register("db");
+    }
+    
+    @Override
+    public void open(DBContext context)
+    {
+        // Enable prepared statements
+        // setPreparedStatementsEnabled(true);
+        // Check exists
+        if (checkExists(context))
+        {   // attach to driver
+            super.open(context);
+            // yes, it exists, then check the model
+            checkDataModel(context);
+        }
+        else
+        {   // PostgreSQL does not support DDL in transaction
+            if(getDbms() instanceof DBMSHandlerPostgreSQL)
+                setAutoCommit(context, true);
+            // create the database
+            createDatabase(context);
+            // PostgreSQL does not support DDL in transaction
+            if(getDbms() instanceof DBMSHandlerPostgreSQL)
+                setAutoCommit(context, false);
+            // attach to driver
+            super.open(context);
+        }
+    }
+
+    private void createDatabase(DBContext context)
+    {
+        // create DDL for Database Definition
+        DBSQLScript script = new DBSQLScript(context);
+        getCreateDDLScript(script);
+        // Show DDL Statement
+        log.info(script.toString());
+        // Execute Script
+        script.executeAll(false);
+        // Commit
+        context.commit();
+    }
+    
+    private void checkDataModel(DBContext context)
+    {   try {
+            DBModelChecker modelChecker = 
context.getDbms().createModelChecker(this);
+            // Check data model   
+            log.info("Checking DataModel for {} using {}", 
getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
+            // dbo schema
+            DBModelErrorLogger logger = new DBModelErrorLogger();
+            modelChecker.checkModel(this, context.getConnection(), logger);
+            // show result
+            log.info("Data model check done. Found {} errors and {} 
warnings.", logger.getErrorCount(), logger.getWarnCount());
+        } catch(Exception e) {
+            log.error("FATAL error when checking data model. Probably not 
properly implemented by DBMSHandler!");
+        }
+    }
+    
+    private void setAutoCommit(DBContext context, boolean enable)
+    {   try {
+            context.getConnection().setAutoCommit(enable);
+        } catch (SQLException e) {
+            log.error("Unable to set AutoCommit on Connection", e);
+        }
+    }
 }
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
index c0320ff..d8c0bfb 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
@@ -27,7 +27,7 @@ public class DepartmentRecord extends 
SampleRecord<TDepartments>
 
     public DepartmentRecord(RecordContext recordContext)
     {
-        super(recordContext.getDb().T_DEPARTMENTS, recordContext);
+        super(recordContext.getDb().DEPARTMENTS, recordContext);
     }
   
 }
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
index 9ac5037..3dcc3c1 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
@@ -32,7 +32,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
 
     public EmployeeRecord(RecordContext recordContext)
     {
-        super(recordContext.getDb().T_EMPLOYEES, recordContext);
+        super(recordContext.getDb().EMPLOYEES, recordContext);
     }
     
        /*
@@ -56,9 +56,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
         {
             SampleDB db = (SampleDB) getDatabase();
             DBCommand cmd = context.createCommand();
-            cmd.select(db.T_DEPARTMENTS.ID);
-            cmd.select(db.T_DEPARTMENTS.NAME);
-            cmd.orderBy(db.T_DEPARTMENTS.NAME);
+            cmd.select(db.DEPARTMENTS.ID);
+            cmd.select(db.DEPARTMENTS.NAME);
+            cmd.orderBy(db.DEPARTMENTS.NAME);
             return recordContext.getUtils().queryOptionList(cmd);
         }
         // base class implementation
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
 
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
index 716fd01..9237547 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
@@ -16,7 +16,7 @@
 # under the License.
 
 #fields
-field.title.employees.employeeId=Mitarbeiter Nr.
+field.title.employees.id=Mitarbeiter Nr.
 field.title.employees.salutation=Anrede
 field.title.employees.firstname=Vorname
 field.title.employees.lastname=Nachname
@@ -28,6 +28,8 @@ field.title.employees.phoneNumber=Telefonnummer
 field.title.employees.email=E-Mail
 field.title.employees.retired=Ausgeschieden
 field.title.employees.updateTimestamp=Zuletzt ge�ndert am
+
+field.title.departments.id=Abteilungsnr
 field.title.departments.name=Abteilungsname
 field.title.departments.head=Abteilugnsleiter
 
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
 
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
index 9693150..a3adc1d 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
@@ -16,7 +16,7 @@
 # under the License.
 
 #fields
-field.title.employees.employeeId=Employee ID
+field.title.employees.id=Employee ID
 field.title.employees.salutation=Salutation
 field.title.employees.firstName=Firstname
 field.title.employees.lastName=Lastname
@@ -28,6 +28,8 @@ field.title.employees.phoneNumber=Phone
 field.title.employees.email=E-Mail
 field.title.employees.retired=Retired
 field.title.employees.updateTimestamp=Last change
+
+field.title.departments.id=Department ID
 field.title.departments.name=Department
 field.title.departments.head=Head of Dept.
 
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak 
b/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak
new file mode 100644
index 0000000..4d9a3da
--- /dev/null
+++ b/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak
@@ -0,0 +1,28 @@
+// http://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+  root: true,
+  parser: 'babel-eslint',
+  parserOptions: {
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    jquery: true
+  },
+  // 
https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
+  extends: 'standard',
+  // required to lint *.vue files
+  plugins: [
+    'html'
+  ],
+  // add your custom rules here
+  'rules': {
+    // allow paren-less arrow functions
+    'arrow-parens': 0,
+    // allow async-await
+    'generator-star-spacing': 0,
+    // allow debugger during development
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
+  }
+}
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
 
b/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
index f550c5b..bfca8d0 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
@@ -16,7 +16,7 @@
 <template>
   <div class="page-content">
 
-    <h1>Employee-Details</h1>
+    <h1>Employee-Details ({{employeeId}})</h1>
 
     <e-record styleClass="formPanel" :record="employeeRecord">
       <table class="inputForm" style="width:400px">
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml 
b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
similarity index 53%
copy from 
empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
copy to 
empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
index 195898d..0170ab3 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
@@ -12,8 +12,7 @@
 <config>
 
        <properties>
-               <!-- provider name must match the property-section containing 
the connection 
-                       data -->
+               <!-- provider name must match the property-section containing 
the connection data -->
                <databaseProvider>hsqldb</databaseProvider>
        </properties>
 
@@ -24,7 +23,11 @@
                <jdbcURL>jdbc:hsqldb:file:hsqldb/sample;shutdown=true</jdbcURL>
                <jdbcUser>sa</jdbcUser>
                <jdbcPwd></jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.hsql.DBMSHandlerHSql</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <!-- no properties -->
+               </dbmsHandlerProperites>
        </properties-hsqldb>
 
        <properties-mysql>
@@ -33,28 +36,84 @@
                <jdbcClass>com.mysql.jdbc.Driver</jdbcClass>
                <jdbcURL>jdbc:mysql://localhost</jdbcURL>
                <jdbcUser>root</jdbcUser>
-               <jdbcPwd>empire-db</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <jdbcPwd>esteam</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.mysql.DBMSHandlerMySQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
        </properties-mysql>
+       
+       <properties-postgresql>
+               <!-- JDBC properties for a PostreSQL Database connection -->
+               <!-- Required jar file: postgresql-8.3-603.jdbc4.jar -->
+               <jdbcClass>org.postgresql.Driver</jdbcClass>
+               <jdbcURL>jdbc:postgresql://localhost</jdbcURL>
+               <jdbcUser>postgres</jdbcUser>
+               <jdbcPwd>postgres</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-postgresql>
+       
+       <properties-h2>
+               <!-- JDBC properties for a H2 Database connection -->
+               <!-- Required jar file: h2-1.1.107.jar -->
+               <jdbcClass>org.h2.Driver</jdbcClass>
+               <jdbcURL>jdbc:h2:h2/DBSAMPLE</jdbcURL>
+               <jdbcUser>sa</jdbcUser>
+               <jdbcPwd></jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.h2.DBMSHandlerH2</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-h2>
+       
+       <properties-derby>
+               <!-- JDBC properties for a Derby Database connection -->
+               <!-- Required jar file: derby-10.4.2.0.jar -->
+               <jdbcClass>org.apache.derby.jdbc.EmbeddedDriver</jdbcClass>
+               <jdbcURL>jdbc:derby:derby/DBSAMPLE;create=true</jdbcURL>
+               <jdbcUser></jdbcUser>
+               <jdbcPwd></jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.derby.DBMSHandlerDerby</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+               </dbmsHandlerProperites>
+       </properties-derby>
 
        <properties-oracle>
                <!-- JDBC properties for an Oracle Database connection -->
                <!-- Required jar file: ojdbc14.jar -->
                <jdbcClass>oracle.jdbc.driver.OracleDriver</jdbcClass>
-               <jdbcURL>jdbc:oracle:thin:@esteams2:1521:ora10</jdbcURL>
+               <jdbcURL>jdbc:oracle:thin:@esteams12:1521:ora12</jdbcURL>
                <jdbcUser>DBSAMPLE</jdbcUser>
                <jdbcPwd>DBSAMPLE</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.oracle.DBMSHandlerOracle</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <!-- no properties -->
+               </dbmsHandlerProperites>
        </properties-oracle>
 
        <properties-sqlserver>
                <!-- JDBC properties for a Microsoft SQL-Server Database 
connection -->
-               <!-- Required jar file: sqljdbc.jar -->
                
<jdbcClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbcClass>
-               <jdbcURL>jdbc:sqlserver://192.168.0.2:1433</jdbcURL>
-               <jdbcUser>sa</jdbcUser>
-               <jdbcPwd>empire-db</jdbcPwd>
-               <schemaName>DBSAMPLE</schemaName>
+               <jdbcURL>jdbc:sqlserver://esteams12\sql17</jdbcURL>
+               <jdbcUser>jdbcUser</jdbcUser>
+               <jdbcPwd>jdbcPwd</jdbcPwd>
+               <!-- Empire-db driver configuration -->
+               
<dbmsHandlerClass>org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL</dbmsHandlerClass>
+               <dbmsHandlerProperites>
+                       <databaseName>DBSAMPLE</databaseName>
+                       <useSequenceTable>false</useSequenceTable>
+                       <!-- useDateTime2: set to false for databases using 
DATETIME for timestamps instead of DATETIME2 -->
+                       <useDateTime2>true</useDateTime2>
+               </dbmsHandlerProperites>
        </properties-sqlserver>
 
        <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index 33d9b86..49af182 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -618,8 +618,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
         // Initialize all Fields
         Object[] fields = record.getFields();
         /* 
-         * DO NOT fill with ObjectUtils.NO_VALUE
-         * ![fields[i] <> ObjectUtils.NO_VALUE];
+         * DO NOT fill with ObjectUtils.NO_VALUE!
          */    
         // Init Key Values
         if (key != null)
@@ -630,7 +629,10 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
             if (key.length!=keyColumns.length)
                 throw new InvalidArgumentException("key", key);
             for (int i = 0; i < keyColumns.length; i++)
-            {   // check
+            {   // ignore null (important!)
+                if (key[i]==null)
+                    continue; 
+                // check key column
                 DBColumn keyColumn = keyColumns[i]; 
                 if (newRecord && keyColumn.isAutoGenerated())
                     throw new FieldReadOnlyException(keyColumn);
diff --git a/pom.xml b/pom.xml
index a8547ff..dd48146 100644
--- a/pom.xml
+++ b/pom.xml
@@ -477,6 +477,7 @@
                                                <exclude>**/.classpath</exclude>
                                                
<exclude>**/.tomcatplugin</exclude>
                                                        
<exclude>**/empire-db-example-vue/src/main/vue/.*</exclude>
+                                               
<exclude>**/_eslintrc.js.bak</exclude>
                                                
<exclude>release.properties</exclude>
                                                <!-- should the sample 
databases be created in target? -->
                                                
<exclude>**/hsqldb/sample.*</exclude>
@@ -553,6 +554,7 @@
                             <exclude>**/.idea/**</exclude>
                                                <exclude>**/*.json</exclude>
                                                <exclude>**/*.vue</exclude>
+                                               
<exclude>**/_eslintrc.js.bak</exclude>
                                                
<exclude>**/static/js/*.js</exclude>
                                                <exclude>**/app.*.css</exclude>
                                                <exclude>**/readme.txt</exclude>

Reply via email to