openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Lennart Jörelid <lennart.jore...@gmail.com>
Subject OpenJPA Sequence Generation in HSQLDB broken?
Date Tue, 05 Apr 2011 08:17:55 GMT
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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message