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

Reply via email to