Generated UNIQUE constraint names and HSQL
-------------------------------------------
Key: OPENJPA-1489
URL: https://issues.apache.org/jira/browse/OPENJPA-1489
Project: OpenJPA
Issue Type: Improvement
Components: sql
Affects Versions: 1.2.2
Environment: OpenJPA 1.2.2
HSQL 1.8.0.10 and HSQL 1.8.1.1 and 2.0.0-rc8
Mac OS X 10.6.2
Java 1.6.0_17 Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
Reporter: Hannes Schmidt
Priority: Minor
In my unit tests, I'm using the openjpa.jdbc.SynchronizeMappings feature to
have OpenJPA create the schema in an HSQL in-memory database. Two of the tables
in my schema each have a unique constraints that list the same column names
(foo,bar) in the same order. The generated name for both constraints is
UNQ_foobar. HSQL apparently puts the names of unique constraints into a
schema-wide namespace which causes the CREATE TABLE statement for the second
table to fail with "constraint already exist".
@Entity
@Table( uniqueConstraints = { @UniqueConstraint( columnNames = { "foo", "bar" }
) } )
public class X {
...
private String foo;
private long bar;
...
}
@Entity
@Table( uniqueConstraints = { @UniqueConstraint( columnNames = { "foo", "bar" }
) } )
public class Y {
...
private String foo;
private long bar;
...
}
912 test TRACE [main] openjpa.jdbc.SQL - <t 7224872, conn 1720095856>
executing stmnt 1211647530 CREATE TABLE X ( ... , foo VARCHAR(22) NOT NULL, ...
, bar BIGINT NOT NULL, PRIMARY KEY (id), CONSTRAINT UNQ_foobar UNIQUE (foo,
bar))
915 test TRACE [main] openjpa.jdbc.SQL - <t 7224872, conn 1720095856> [3 ms]
spent
915 test TRACE [main] openjpa.jdbc.SQL - <t 7224872, conn 579409826>
executing stmnt 853942561 CREATE TABLE Y ( ... , foo VARCHAR(22) NOT NULL, ...
, bar BIGINT NOT NULL, PRIMARY KEY (id), CONSTRAINT UNQ_foobar UNIQUE (foo,
bar))
920 test TRACE [main] openjpa.jdbc.SQL - <t 7224872, conn 579409826> [5 ms]
spent
Jan 30, 2010 11:46:16 AM org.springframework.test.context.TestContextManager
beforeTestMethod
WARNING: Caught exception while allowing TestExecutionListener
[org.springframework.test.context.transaction.transactionaltestexecutionliste...@2773a64a]
to process 'before' execution of test method [public void
com.eyealike.ps.core.test.CollectionDaoTest.setup()] for test instance
[com.eyealike.ps.core.test.collectiondaot...@19aa5882]
org.springframework.transaction.CannotCreateTransactionException: Could not
open JPA EntityManager for transaction; nested exception is
<openjpa-1.2.2-r422266:898935 nonfatal general error>
org.apache.openjpa.persistence.PersistenceException: Constraint already exists:
UNQ_OWNERIDKEY in statement [CREATE TABLE Y ... } [code=-60, state=S0011]
Note that I tweaked my sample code and log trace a little to simplify the test
case.
I didn't try to reproduce this with OpenJPA 2.0.0 yet. From looking at the code
in the 2.0.0 trunk, I can tell that this part has been rewritten completely and
this issue might not apply to 2.0.0. I also don't know whether HSQL is
violating the SQL standard by requiring unique constaint names to be
schema-unique, not just table-unique.
What works for me as a workaround is to reorder the columns in the constraint
on the second table.
Assuming this is not a bug in HSQL and assuming it also reproduces in 2.0.0
beta, I'd naively prefix constraint names with the table name but I'm no
specialist in either SQL or JPA ...
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.