Question

Summary

I'm trying to run a Java web application JPA 2.0 example. The example application was written to run in Glassfish, using EclipseLink as JPA provider. I would like to convert it to run in TomEE with OpenJPA as the JPA provider, but I can't any detailed tutorials for getting up and running with OpenJPA.

Problem

I'm having trouble converting persistence.xml to work with OpenJPA instead of EclipseLink. More specifically, the given persistence.xml doesn't specify:

  • Entity classes. Are these necessary?
  • The desired JPA provider. Will the container default to something?
  • The JDBC driver. How do I specify an "in-memory" DB (just for initial testing purposes)?

Also:

  • How are the DDL generation properties expressed in OpenJPA? I wasn't able to find them the OpenJPA User Guide.

Details

Below is the EclipseLink persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    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_2_0.xsd">
    <persistence-unit name="order" transaction-type="JTA">
        <jta-data-source>jdbc/__default</jta-data-source>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.ddl-generation.output-mode"
                value="both" />
        </properties>
    </persistence-unit>
</persistence>

I have the following Entity classes:

  • order.entity.LineItem
  • order.entity.LineItemKey
  • order.entity.Order
  • order.entity.Part
  • order.entity.PartKey
  • order.entity.Vendor
  • order.entity.VendorPart

Question

  • Does anyone know what the equivalent persistence.xml would look like for OpenJPA?
  • Alternatively, if anyone could point me to an OpenJPA tutorial that covers these issues that would be just as good
Was it helpful?

Solution

If you add the openjpa.jdbc.SynchronizeMappings property as shown below OpenJPA will auto-create all your tables, all your primary keys and all foreign keys exactly to match your objects

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

Alternatively, you can use EclipseLink in TomEE by just adding the EclipseLink jars to <CATALINA_HOME>/lib/

refer here for Common PersistenceProvider properties

OTHER TIPS

Foreign key constraints

The next line does not create foreign keys:

<property name="openjpa.jdbc.SynchronizeMappings" 
          value="buildSchema(ForeignKeys=true)"/>

Only creates schema and deletes content of a database.

But if you want create foreign keys, use the following lines:

<property name="openjpa.jdbc.SynchronizeMappings" 
          value="buildSchema(foreignKeys=true,schemaAction='dropDB,add')"/>
<property name="openjpa.jdbc.SchemaFactory" 
          value="native(foreignKeys=true)" />
<property name="openjpa.jdbc.MappingDefaults" 
          value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict"/>

See generated SQL

In another way, if you want to see the SQL output:

<property name="openjpa.Log" 
          value="DefaultLevel=TRACE,SQL=TRACE" />

NOTE: In order to see the generated output in the TomEE console, you need to change the log level in the file loggin.properties with openjpa.level = FINEST


See more in http://openjpa.apache.org/faq.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top