Hello there,
I am trying to make automated JPA integration tests using OpenJPA and HSQLDB.
The entities use automated IDs generated with Database Sequences, as shown in
the entity code snippets below.
However, I encounter strange behavior when running unit tests - the
OpenJPA-generated Sequence seems
not generated within HSQLDB, despite log messages indicating the opposite.
I have run the unit tests on both OpenJPA 1.2.X and 2.0.X, with identical
results:
<openjpa-1.2.2-r422266:898935 fatal store error>
org.apache.openjpa.persistence.RollbackException:
Sequence not found: DEBUGTINDRAENTITYSEQ in statement
[SELECT NEXT VALUE FOR DebugTindraEntitySeq FROM
INFORMATION_SCHEMA.SYSTEM_SEQUENCES]
{SELECT NEXT VALUE FOR DebugTindraEntitySeq FROM
INFORMATION_SCHEMA.SYSTEM_SEQUENCES}
[code=-191, state=S0002]
This seems to be caused by the sequences not being created, although the
OpenJPA log claims:
"executing stmnt 547527790 CREATE SEQUENCE DebugTindraEntitySeq START WITH 1"
However, firing the query
String query = "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES";
Query q = unitTestEM.createNativeQuery(query);
List result = q.getResultList();
log.info("Got [" + result.size() + "] sequences");
I get the log printout: Got [0] sequences
The same behavior is seen in the H2 database.
What should be done in OpenJPA to make the sequences actually being created
within the HSQLDB?
Any other suggestions to create working automated JUnit tests using OpenJPA?
============ Code snippet #1: Entity class ============
@SequenceGenerator(name = DebugTindraEntity.SEQ, sequenceName =
DebugTindraEntity.SEQ, allocationSize = 1)
@Entity
public class DebugTindraEntity extends TindraEntity {
// Constants
private static final long serialVersionUID = 8829990017L;
public static final String SEQ = "DebugTindraEntitySeq";
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQ)
@XmlElement(nillable = true, required = false)
private int id;
@Basic
@Column(nullable = false)
private String name;
....
============ Code snippet #2: Mapped superclass ============
The TindraEntity mapped superclass holds the JPA version field. I would have
loved to place
@MappedSuperclass
public abstract class TindraEntity implements Serializable {
// Internal state
private static final long serialVersionUID = 8829990001L;
// Internal state
@Version
@XmlElement(nillable = true, required = false)
private int version;
....
============ Code snippet #2: Persistence.xml file ============
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="InjectedInmemoryPU"
transaction-type="RESOURCE_LOCAL">
<description>
PersistenceUnit containing the Entity classes.
</description>
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.teliasonera.tindra.core.common.persistence.TindraEntity</class>
<class>com.teliasonera.tindra.core.common.persistence.DebugTindraEntity</class>
<!--
When set to true then only listed classes and jars will
be scanned for persistent classes, otherwise the enclosing
jar or directory will also be scanned. Not applicable to
Java SE persistence units.
-->
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="openjpa.jdbc.DBDictionary"
value="hsql(SimulateLocking=true, SchemaCase=upper)"/>
<property name="openjpa.ConnectionDriverName"
value="org.hsqldb.jdbcDriver" />
<property name="openjpa.ConnectionURL"
value="jdbc:hsqldb:mem:unittestDatabaseID;shutdown=true"/>
<property name="openjpa.ConnectionUserName" value="sa"/>
<property name="openjpa.ConnectionPassword" value=""/>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
<property name="openjpa.InverseManager" value="true"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO,
SQL=TRACE"/>
<property name="openjpa.RuntimeUnenhancedClasses"
value="supported"/>
</properties>
</persistence-unit>
</persistence>
--
// Bästa hälsningar,
// [sw. "Best regards,"]
//
// Lennart Jörelid