Hi Lennart,
You are using an in-memory database and "shutdown=true" in the URL. This causes
the database be shut down when the last connection terminates. I guess that
what's happening here is the sequence is created, then the connection
terminates and when a new connection starts you are in fact in a new and clean
database without any objects. Try dropping the "shutdown=true" from the URL.
You might also experiment with a connection pool which could keep a connection
open throughout the test.
For the H2 database, use this syntax: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1.
Greetings,
Milosz
> 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
>