DataNucleus

DataNucleus Performance Summary

The following charts show the performance of DataNucleus (in green) relatively to other JPA/DBMS combinations (in gray).

Position #1 on the X-Axis (the fastest) is about 100 times faster than position #33 (the slowest).
In the chart below the Y-Axis represents result score (maximum 100) in logarithmic scale - higher is better:
JPA performance benchmark comparision Hibernate, EclipseLink, OpenJPA, DataNucleus, ObjectDB
In the chart below the Y-Axis represents result score (maximum 100) in linear scale - higher is better:
JPA performance benchmark comparision Hibernate, EclipseLink, OpenJPA, DataNucleus, ObjectDB


The configurations in which DataNucleus has been tested are listed in the following table:

 Database + JPA ProviderNormalized Score
100 - Best,  0 - Worst
Final Position
1 - Best,  33 - Worst
Failed Tests
1DataNucleus with H2 embedded7.813  (out of 33)4
2DataNucleus with HSQLDB embedded7.015  (out of 33)3
3DataNucleus with Derby embedded6.916  (out of 33)6
4DataNucleus with PostgreSQL server6.019  (out of 33)4
5DataNucleus with Derby server3.324  (out of 33)6
6DataNucleus with H2 server2.926  (out of 33)4
7DataNucleus with MySQL server2.129  (out of 33)5
8DataNucleus with DB4O embedded0.7331  (out of 33)26

About DataNucleus

DataNucleus Access Platform (formerly JPOX) is a data management framework that implements the JPA and JDO specifications. It is more than just an object-relational mapping (ORM) because it can also map and manage data from sources other than relational databases (e.g. DB4O). DataNucleus also serves as the Java persistence layer in Google App Engine.

DataNucleus is available under the Apache open source license.

In this benchmark DataNucleus 3.0.7 (which was released in February 2012) has been tested.

DataNucleus Performance Tuning

The DataNucleus default configuration is far from being optimized. For example, unlike other JPA implementations, in DataNucleus connection pooling is disabled by default.

To get the best possible performance out of DataNucleus we followed the DataNucleus Performance Tuning instructions and applied the following optimizations:

  • A connection pool (DBCP) was enabled.
  • EntityManagerFactory was created only once per test.
  • Every thread had its own private EntityManager.
  • Database schema generation was completed before time measurement started.
  • Database schema validation was disabled.
  • A discriminator was defined in the base class of a class hierarchy.
  • The datanucleus.autoStartMechanism property was set to None.
  • The datanucleus.rdbms.initializeColumnInfo property was set to None.
  • The datanucleus.persistenceByReachabilityAtCommit property was set to false.
  • The datanucleus.manageRelationships property was set to false.
  • Logging was disabled.

All the entity classes have been enhanced by DataNucleus, by running the tests with a Java Agent
(javaagent:datanucleus-enhancer-3.0.1.jar).

Class enhancement time was completely excluded from the test time measurement.

Solved Problems and Issues

The stack traces below demonstrate some exceptions that have been thrown when using DataNucleus in previous runs of this benchmark and have been fixed by upgrading software and setting.

javax.persistence.RollbackException: Transaction failed to commit
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
	at org.jpab.Test.persist(Test.java:217)
	at org.jpab.Test.persist(Test.java:200)
	at org.jpab.Runner$PersistAction.run0(Runner.java:529)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.persistence.PersistenceException: Error(s) were found while auto-creating/validating the datastore for classes. The errors are printed in the log, and are attached to this exception.
	at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:244)
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:118)
	... 5 more
Caused by: java.sql.SQLSyntaxErrorException: In an ALTER TABLE statement, the column 'LOGINCOUNT' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.TableImpl.validateColumns(TableImpl.java:263)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2745)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:113)
	at org.datanucleus.jdo.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3273)
	at org.datanucleus.jdo.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4664)
	at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3156)
	at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3096)
	at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:3235)
	at org.datanucleus.ObjectManagerImpl$2.transactionPreCommit(ObjectManagerImpl.java:316)
	at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:394)
	at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:279)
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:106)
	... 5 more
Caused by: java.sql.SQLException: In an ALTER TABLE statement, the column 'LOGINCOUNT' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
	... 34 more
Caused by: ERROR 42601: In an ALTER TABLE statement, the column 'LOGINCOUNT' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.
	at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
	at org.apache.derby.impl.sql.compile.ColumnDefinitionNode.bindAndValidateDefault(Unknown Source)
	at org.apache.derby.impl.sql.compile.TableElementList.validate(Unknown Source)
	at org.apache.derby.impl.sql.compile.AlterTableNode.bindStatement(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
	at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
	... 28 more
An exception was thrown while adding/validating class(es) : object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
java.sql.SQLException: object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.AbstractTable.create(AbstractTable.java:402)
	at org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:458)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2732)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:298)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileQueryFull(JPQLQuery.java:745)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileInternal(JPQLQuery.java:249)
	at org.datanucleus.store.query.Query.setImplicitParameter(Query.java:736)
	at org.datanucleus.store.rdbms.query.JPQLQuery.setImplicitParameter(JPQLQuery.java:136)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:390)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:53)
	at org.jpab.Test.retireveEntities(Test.java:380)
	at org.jpab.Test.doAction(Test.java:251)
	at org.jpab.Runner$RemoveAction.run0(Runner.java:578)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.hsqldb.HsqlException: object name already exists: COLLECTIONPERSON_STRING
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.SchemaObjectSet.checkAdd(Unknown Source)
	at org.hsqldb.SchemaManager.checkSchemaObjectNotExists(Unknown Source)
	at org.hsqldb.StatementSchema.setOrCheckObjectName(Unknown Source)
	at org.hsqldb.StatementSchema.getResult(Unknown Source)
	at org.hsqldb.StatementSchema.execute(Unknown Source)
	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 26 more

org.datanucleus.exceptions.NucleusDataStoreException: An exception was thrown while adding/validating class(es) : object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
java.sql.SQLException: object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.AbstractTable.create(AbstractTable.java:402)
	at org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:458)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2732)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:298)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileQueryFull(JPQLQuery.java:745)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileInternal(JPQLQuery.java:249)
	at org.datanucleus.store.query.Query.setImplicitParameter(Query.java:736)
	at org.datanucleus.store.rdbms.query.JPQLQuery.setImplicitParameter(JPQLQuery.java:136)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:390)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:53)
	at org.jpab.Test.retireveEntities(Test.java:380)
	at org.jpab.Test.doAction(Test.java:251)
	at org.jpab.Runner$RemoveAction.run0(Runner.java:578)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.hsqldb.HsqlException: object name already exists: COLLECTIONPERSON_STRING
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.SchemaObjectSet.checkAdd(Unknown Source)
	at org.hsqldb.SchemaManager.checkSchemaObjectNotExists(Unknown Source)
	at org.hsqldb.StatementSchema.setOrCheckObjectName(Unknown Source)
	at org.hsqldb.StatementSchema.getResult(Unknown Source)
	at org.hsqldb.StatementSchema.execute(Unknown Source)
	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 26 more

	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2569)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:298)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileQueryFull(JPQLQuery.java:745)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileInternal(JPQLQuery.java:249)
	at org.datanucleus.store.query.Query.setImplicitParameter(Query.java:736)
	at org.datanucleus.store.rdbms.query.JPQLQuery.setImplicitParameter(JPQLQuery.java:136)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:390)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:53)
	at org.jpab.Test.retireveEntities(Test.java:380)
	at org.jpab.Test.doAction(Test.java:251)
	at org.jpab.Runner$RemoveAction.run0(Runner.java:578)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.AbstractTable.create(AbstractTable.java:402)
	at org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:458)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2732)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	... 17 more
Caused by: org.hsqldb.HsqlException: object name already exists: COLLECTIONPERSON_STRING
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.SchemaObjectSet.checkAdd(Unknown Source)
	at org.hsqldb.SchemaManager.checkSchemaObjectNotExists(Unknown Source)
	at org.hsqldb.StatementSchema.setOrCheckObjectName(Unknown Source)
	at org.hsqldb.StatementSchema.getResult(Unknown Source)
	at org.hsqldb.StatementSchema.execute(Unknown Source)
	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 26 more
Nested Throwables StackTrace:
java.sql.SQLException: object name already exists: COLLECTIONPERSON_STRING in statement [CREATE TABLE COLLECTIONPERSON_STRING
(
    COLLECTIONPERSON_ID INTEGER NOT NULL,
    PHONES_ELEMENT VARCHAR(255) NULL
)]
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.AbstractTable.create(AbstractTable.java:402)
	at org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:458)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2732)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:298)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileQueryFull(JPQLQuery.java:745)
	at org.datanucleus.store.rdbms.query.JPQLQuery.compileInternal(JPQLQuery.java:249)
	at org.datanucleus.store.query.Query.setImplicitParameter(Query.java:736)
	at org.datanucleus.store.rdbms.query.JPQLQuery.setImplicitParameter(JPQLQuery.java:136)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:390)
	at org.datanucleus.jpa.JPAQuery.setParameter(JPAQuery.java:53)
	at org.jpab.Test.retireveEntities(Test.java:380)
	at org.jpab.Test.doAction(Test.java:251)
	at org.jpab.Runner$RemoveAction.run0(Runner.java:578)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.hsqldb.HsqlException: object name already exists: COLLECTIONPERSON_STRING
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.SchemaObjectSet.checkAdd(Unknown Source)
	at org.hsqldb.SchemaManager.checkSchemaObjectNotExists(Unknown Source)
	at org.hsqldb.StatementSchema.setOrCheckObjectName(Unknown Source)
	at org.hsqldb.StatementSchema.getResult(Unknown Source)
	at org.hsqldb.StatementSchema.execute(Unknown Source)
	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
	at org.hsqldb.Session.executeDirectStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 26 more
javax.persistence.RollbackException: Transaction failed to commit
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
	at org.jpab.Test.persist(Test.java:217)
	at org.jpab.Test.persist(Test.java:200)
	at org.jpab.Runner$PersistAction.run0(Runner.java:529)
	at org.jpab.Runner$TestAction.run(Runner.java:508)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.persistence.PersistenceException: Error(s) were found while auto-creating/validating the datastore for classes. The errors are printed in the log, and are attached to this exception.
	at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:244)
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:118)
	... 5 more
Caused by: java.sql.SQLSyntaxErrorException: In an ALTER TABLE statement, the column 'LOGINCOUNT' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.
	at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
	at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
	at org.apache.derby.client.am.Statement.execute(Unknown Source)
	at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:261)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:681)
	at org.datanucleus.store.rdbms.table.TableImpl.validateColumns(TableImpl.java:263)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:2745)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:2546)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2191)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:113)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:966)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:914)
	at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:356)
	at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:113)
	at org.datanucleus.jdo.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3273)
	at org.datanucleus.jdo.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4664)
	at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3156)
	at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3096)
	at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:3235)
	at org.datanucleus.ObjectManagerImpl$2.transactionPreCommit(ObjectManagerImpl.java:316)
	at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:394)
	at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:279)
	at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:106)
	... 5 more
Caused by: org.apache.derby.client.am.SqlException: In an ALTER TABLE statement, the column 'LOGINCOUNT' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.
	at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)
	at org.apache.derby.client.am.Statement.completeExecuteImmediate(Unknown Source)
	at org.apache.derby.client.net.NetStatementReply.parseEXCSQLIMMreply(Unknown Source)
	at org.apache.derby.client.net.NetStatementReply.readExecuteImmediate(Unknown Source)
	at org.apache.derby.client.net.StatementReply.readExecuteImmediate(Unknown Source)
	at org.apache.derby.client.net.NetStatement.readExecuteImmediate_(Unknown Source)
	at org.apache.derby.client.am.Statement.readExecuteImmediate(Unknown Source)
	at org.apache.derby.client.am.Statement.flowExecute(Unknown Source)
	at org.apache.derby.client.am.Statement.executeX(Unknown Source)
	... 27 more