UNIQUE
constraint from the @Column
definition on an JPA entity bean, and have it handled properly with the Toplink JPA. I was actually surprised that even with build 40 or Toplink Essentials v2.1 this was still an issue. The problem was, if you defined a value of unique=true
in your JPA column annotation, Toplink Essentials would insert the UNIQUE
keyword in the create table routine. This would break on HSQLDB, which does not support this keyword during column descriptor creation. The challenge was to fool Toplink into handling the unique attributes like contraints which it would add after the table was created with an ALTER TABLE
sequence. The route I have chosen for now to solve this for my unit testing needs was to provide replacement Toplink-Essentials class files ahead of the Toplink-Essentials JAR file used by my application. Therefore my applications all run with the approved Toplink distributable, however my unit tests run with the instrumented files. There were two small changes I had to make:
(1) Modified
oracle.toplink.essentials.tools.schemaframework.FieldDefinition
to not write out the unique field keyword if the database was HSQL. From Line 168 of the appendDBString
method:if(isUnique() && !session.getPlatform().isHSQL()) { session.getPlatform().printFieldUnique(writer, shouldPrintFieldIdentityClause); }
(2) Modified
oracle.toplink.essentials.tools.schemaframework.DefaultTableGenerator
to add the unique constraints if the database is HSQL on line 253 of initTableSchema()
if( dbField.isUnique() && databasePlatform.isHSQL()) { tblDef.addUniqueKeyConstraint(dbTbl.getName(),dbField.getName()); }
Currently I have not posted any information to the Glassfish project with these updates. I am not certain this is the ideal way to achieve this, but from my unit testing perspective I appear to be off to the races. If you are interested in these changes, please contact me and I'll look into working to get them submitted for Glassfish.
1 comment:
Post a Comment