Jump to: navigation, search

EclipseLink/Examples/JPA/Migration/JBoss

Migrating to JBoss using EclipseLink as JPA provider

  • *Warning: These instructions started on 20080505 are under construction for the next couple days
  • These instructions are for users wishing to migrate EclipseLink to the JBoss container as well as possibly migrating from another persistence provider such as Hibernate.
  • The EJB3 example on jboss.org will be used as a common open-source example of how to migrate a small container managed web application from using Hibernate to using EclipeLink as the JPA provider.

persistence.xml Modifications

<xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="helloworld" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:/JTSEclipseLinkDS</jta-data-source>
    <!-- Entities must be specified for EclipseLink weaving -->
    <class>Todo</class>
    <properties>
      <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"/>
      <!--property name="eclipselink.ddl-generation" value="drop-and-create-tables"/-->
      <!--property name="eclipselink.ddl-generation.output-mode" value="database"/-->
      <property name="eclipselink.target-server" value="org.eclipse.persistence.platform.server.jboss.JBossPlatform"/>
      <!--property name="eclipselink.weaving" value="static"/--><!-- ignored -->
      <property name="eclipselink.logging.level" value="FINEST"/>
    </properties>
  </persistence-unit>
</persistence>
  • The following changes must be done to persistence.xml

Set target-server

The fix for EJBTHREE-572 requires that the PersistenceUnit state the JBoss platform using the target-server property.

<property name="eclipselink.target-server" value="org.eclipse.persistence.platform.server.jboss.JBossPlatform"/>

Set target-database

We currently do not have a defined platform for HSQL yet in our list of 10 platforms, you will need to use a different database such as Oracle or MySQL, by setting the target-database and adjusting the jta-data-source if required.

17:12:50,097 INFO  [STDOUT] [EL Info]: 2008.05.05 17:12:50.097--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Not able to detect platform for vendor name [HSQL Database Engine]. Defaulting to [org.eclipse.persistence.platform.database.DatabasePlatform]. The database dialect used may not match with the database you are using. Please explicitly provide a platform using property eclipselink.target-database.

We will use Oracle 10/11 by defining the following property in persistence.xml.

<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"/>

Create Database

The eclipselink.ddl-generation property is not used in this example, we will manually create our table by executing the following DDL.

CREATE TABLE TODO (ID NUMBER(19) NOT NULL, DTYPE VARCHAR2(31) NULL, DESCRIPTION VARCHAR2(255) NULL, TITLE VARCHAR2(255) NULL, PRIMARY KEY (ID))

JTA Datasource Configuration

  • In this migration we are using an Oracle database - we need to setup the datasource in JBoss.
  • Copy $JBOSS_HOME\docs\examples\jca\oracle-*ds.xml to $JBOSS_HOME\server\default\deploy
  • Edit oracle-xa-ds.xml
  • Enter the following into $JBOSS_HOME\server\default\deploy\oracle-xa-ds.xml
<datasources>
  <xa-datasource>
    <jndi-name>JTSEclipseLinkDS</jndi-name>
    <use-java-context>true</use-java-context>
    <track-connection-by-tx>true</track-connection-by-tx>
	<isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:orcl</xa-datasource-property>
    <xa-datasource-property name="User">username</xa-datasource-property>
    <xa-datasource-property name="Password">password</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <no-tx-separate-pools/>
      <metadata>
        <type-mapping>Oracle9i</type-mapping>
      </metadata>
  </xa-datasource>

@EJB Injection/JNDI lookup Modifications

  • The @EJB injection annotation does not currently work outside of the EJB container - for example in the servlet container. The solution is to use a custom JNDI lookup which is not in standard JNDI naming format such as "java:comp/env/ejb/jsfejb3/TodoDao".
InitialContext ctx = new InitialContext();
return (TodoDaoInt) ctx.lookup("jsfejb3/TodoDao/local");

Static Weaving / EAR Packaging Modifications

  • Dynamic weaving (byte-code instrumentation) is not currently available in JBoss 4.2.2 because of JIRA EJBTHREE-572. Our workaround is to statically weave the entities by running the following Ant task before creating your EJB jar during EAR packaging. You must use the statically weaved classes if you would like to use LAZY 1-1 and many-1 functionality.
  • See 229634: JBoss predeploy workaround
  • Note: that the ant task references persistence.jar, eclipselink.jar and the persistence 1.0 XSD - you may reference these where they exist on your system.
  • Note: persistence.xml must have the <xml> element for NS validation and namespace references in the <persistence> element.
  • Ant static weaving ant task
<target name="run-weaver">
  <taskdef name="weave" classname="org.eclipse.persistence.tools.weaving.jpa.StaticWeaveAntTask">
    <classpath>
      <pathelement path="${libs}/persistence.jar"/>
      <pathelement path="${libs}/eclipselink.jar"/>
      <pathelement path="${libs}/persistence_1_0.xsd"/>
    </classpath>
  </taskdef>
 
  <!-- process the weaving function, persistenceInfo references persistence.xml -->
  <weave source="build/classes_unweaved"
    target="build/classes"
    persistenceinfo="build/jars/app_unweaved.jar"
    loglevel="FINEST">
  </weave>
</target>

Results

Building

  • You should see the following on your Ant log.
C:\wse\w34b\jbossHWEAR>ant -lib c:\wse\w34b\jbossHWEAR -f build.xml
Buildfile: build.xml
clean:
   [delete] Deleting directory C:\wse\w34b\jbossHWEAR\build
compile:
    [mkdir] Created dir: C:\wse\w34b\jbossHWEAR\build\classes
    [mkdir] Created dir: C:\wse\w34b\jbossHWEAR\build\classes_unweaved
    [javac] Compiling 5 source files to C:\wse\w34b\jbossHWEAR\build\classes_unweaved
    [javac] Note: C:\wse\w34b\jbossHWEJB\ejbModule\TodoDao.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
ejb3jar0:
    [mkdir] Created dir: C:\wse\w34b\jbossHWEAR\build\jars
      [jar] Building jar: C:\wse\w34b\jbossHWEAR\build\jars\app_unweaved.jar
run-weaver:
    [weave] [EL Finer] : 2008.05.05 16:30:41.216--ServerSession(29857804)--Thread(Thread[main,5,main])--Searching for default mapping file in file:/C:/wse/w34b/jbossHWEAR/build/jars/app_unweaved.jar
    [weave] [EL Finer] : 2008.05.05 16:30:41.246--ServerSession(29857804)--Thread(Thread[main,5,main])--Found a default mapping file at jar:file:/C:/wse/w34b/jbossHWEAR/build/jars/app_unweaved.jar!/META-INF/orm.xml for root URL file:/C:/wse/w34b/jbossHWEAR/build/jars/app_unweaved.jar
    [weave] [EL Config]: 2008.05.05 16:30:41.878--ServerSession(29857804)--Thread(Thread[main,5,main])--The table name for entity [Todo] is being defaulted to: TODO.
    [weave] [EL Config]: 2008.05.05 16:30:41.891--ServerSession(29857804)--Thread(Thread[main,5,main])--The discriminator column name for the root inheritance class [class Todo] is being defaulted to: DTYPE.
    [weave] [EL Config]: 2008.05.05 16:30:41.928--ServerSession(29857804)--Thread(Thread[main,5,main])--The column name for element [public java.lang.String Todo.getDescription()] is being defaulted to: DESCRIPTION.
    [weave] [EL Config]: 2008.05.05 16:30:41.937--ServerSession(29857804)--Thread(Thread[main,5,main])--The column name for element [public java.lang.String Todo.getTitle()] is being defaulted to: TITLE.
    [weave] [EL Finer] : 2008.05.05 16:30:41.950--ServerSession(29857804)--Thread(Thread[main,5,main])--Class [Todo] registered to be processed by weaver.
    [weave] [EL Finest]: 2008.05.05 16:30:41.974--ServerSession(29857804)--Thread(Thread[main,5,main])--Begin weaver class transformer processing class [Todo].
    [weave] [EL Finest]: 2008.05.05 16:30:42.020--ServerSession(29857804)--Thread(Thread[main,5,main])--Weaved persistence (PersistenceEntity) [Todo].
    [weave] [EL Finest]: 2008.05.05 16:30:42.029--ServerSession(29857804)--Thread(Thread[main,5,main])--Weaved change tracking (ChangeTracker) [Todo].
    [weave] [EL Finest]: 2008.05.05 16:30:42.040--ServerSession(29857804)--Thread(Thread[main,5,main])--Weaved fetch groups (FetchGroupTracker) [Todo].
    [weave] [EL Finest]: 2008.05.05 16:30:42.053--ServerSession(29857804)--Thread(Thread[main,5,main])--End weaver class transformer processing class [Todo].
war:
      [war] Building war: C:\wse\w34b\jbossHWEAR\build\jars\app.war
ejb3jar:
      [jar] Building jar: C:\wse\w34b\jbossHWEAR\build\jars\app.jar
ear:
      [ear] Building ear: C:\wse\w34b\jbossHWEAR\build\jars\jsfejb3.ear
deploy:
     [copy] Copying 1 file to C:\opt\jboss422\server\default\deploy
main:
BUILD SUCCESSFUL
Total time: 3 seconds

Deployment

  • Make sure the JBoss server is running when the ear is copied to the deploy directory or start the server.
17:11:07,633 INFO  [JmxKernelAbstraction] 	jboss.jca:name=DefaultDS,service=DataSourceBinding
17:11:07,635 INFO  [PersistenceUnitDeployment] Starting persistence unit persistence.units:ear=jsfejb3.ear,jar=app.jar,unitName=helloworld
17:11:07,801 INFO  [STDOUT] [EL Warning]: 2008.05.05 17:11:07.784--Thread(Thread[main,5,jboss])--The temporary classLoader for PersistenceLoadProcessor [helloworld] is not available.  Switching classLoader to [org.jboss.mx.loading.UnifiedClassLoader3@18b995c{ url=file:/C:/opt/jboss422/server/default/tmp/deploy/tmp46857jsfejb3.ear ,addedOrder=45}].  Weaving has been disabled for this session. EclipseLink may be unable to get a spec mandated temporary class loader from the server, you may be able to use static weaving as an optional workaround. 
17:11:07,809 INFO  [STDOUT] [EL Finest] : 2008.05.05 17:11:07.802--ServerSession(9262213)--Thread(Thread[main,5,jboss])--Begin predeploying Persistence Unit helloworld; state Initial; factoryCount 0
17:11:07,811 INFO  [STDOUT] [EL Finest] : 2008.05.05 17:11:07.811--ServerSession(9262213)--Thread(Thread[main,5,jboss])--property=eclipselink.weaving; value=true
17:11:07,812 INFO  [STDOUT] [EL Finest] : 2008.05.05 17:11:07.812--ServerSession(9262213)--Thread(Thread[main,5,jboss])--property=eclipselink.orm.throw.exceptions; default value=true
17:11:07,830 INFO  [STDOUT] [EL Finer]  : 2008.05.05 17:11:07.827--ServerSession(9262213)--Thread(Thread[main,5,jboss])--Searching for default mapping file in file:/C:/opt/jboss422/server/default/tmp/deploy/tmp46857jsfejb3.ear-contents/app.jar
17:11:07,846 INFO  [STDOUT] [EL Finer]  : 2008.05.05 17:11:07.846--ServerSession(9262213)--Thread(Thread[main,5,jboss])--Found a default mapping file at jar:file:/C:/opt/jboss422/server/default/tmp/deploy/tmp46857jsfejb3.ear-contents/app.jar!/META-INF/orm.xml for root URL file:/C:/opt/jboss422/server/default/tmp/deploy/tmp46857jsfejb3.ear-contents/app.jar
17:11:08,600 INFO  [STDOUT] [EL Config] : 2008.05.05 17:11:08.599--ServerSession(9262213)--Thread(Thread[main,5,jboss])--The table name for entity [Todo] is being defaulted to: TODO.
17:11:08,604 INFO  [STDOUT] [EL Config] : 2008.05.05 17:11:08.604--ServerSession(9262213)--Thread(Thread[main,5,jboss])--The discriminator column name for the root inheritance class [class Todo] is being defaulted to: DTYPE.
17:11:08,635 INFO  [STDOUT] [EL Config] : 2008.05.05 17:11:08.635--ServerSession(9262213)--Thread(Thread[main,5,jboss])--The column name for element [public java.lang.String Todo.getDescription()] is being defaulted to: DESCRIPTION.
17:11:08,639 INFO  [STDOUT] [EL Config] : 2008.05.05 17:11:08.639--ServerSession(9262213)--Thread(Thread[main,5,jboss])--The column name for element [public java.lang.String Todo.getTitle()] is being defaulted to: TITLE.
17:11:08,642 INFO  [STDOUT] [EL Finest] : 2008.05.05 17:11:08.642--ServerSession(9262213)--Thread(Thread[main,5,jboss])--End predeploying Persistence Unit helloworld; state Predeployed; factoryCount 1
17:11:08,685 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
17:11:08,690 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:ear=jsfejb3.ear,jar=app.jar,name=TodoDao,service=EJB3 with dependencies:
17:11:08,690 INFO  [JmxKernelAbstraction] 	persistence.units:ear=jsfejb3.ear,jar=app.jar,unitName=helloworld
17:11:08,842 INFO  [EJBContainer] STARTED EJB: TodoDao ejbName: TodoDao
17:11:08,864 INFO  [EJB3Deployer] Deployed: file:/C:/opt/jboss422/server/default/tmp/deploy/tmp46857jsfejb3.ear-contents/app.jar
17:11:08,868 INFO  [TomcatDeployer] deploy, ctxPath=/jsfejb3, warUrl=.../tmp/deploy/tmp46857jsfejb3.ear-contents/app-exp.war/
17:11:09,509 INFO  [EARDeployer] Started J2EE application: file:/C:/opt/jboss422/server/default/deploy/jsfejb3.ear

Runtime Add new TODO and display

))
23:39:11,949 INFO  [STDOUT] [EL Config]: 2008.05.05 23:39:11.949--ServerSession(30958654)--Connection(10445386)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Connected: jdbc:oracle:thin:@127.0.0.1:1521:orcl
	User: STAT
	Database: Oracle  Version: Oracle Database 11g Release 11.1.0.0.0 - Production
	Driver: Oracle JDBC driver  Version: 11.1.0.0.0-Beta5
23:39:11,986 INFO  [STDOUT] [EL Info]  : 2008.05.05 23:39:11.986--ServerSession(30958654)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--file:/C:/opt/jboss422/server/default/tmp/deploy/tmp29686jsfejb3.ear-contents/app.jar-helloworld login successful
23:39:11,986 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:11.986--ServerSession(30958654)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--End deploying Persistence Unit helloworld; state Deployed; factoryCount 1
23:39:11,997 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:11.997--ServerSession(30958654)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--client acquired
23:39:11,998 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:11.998--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX binding to tx mgr, status=STATUS_ACTIVE
23:39:12,000 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:11.999--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query DoesExistQuery()
23:39:12,005 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:12.005--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--PERSIST operation called on: Todo@1b2601c.
23:39:12,006 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:12.006--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX beforeCompletion callback, status=STATUS_ACTIVE
23:39:12,006 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:12.006--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--begin unit of work commit
23:39:12,009 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:12.009--ClientSession(18229945)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX beginTransaction, status=STATUS_ACTIVE
23:39:12,010 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:12.010--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query InsertObjectQuery(Todo@1b2601c)
23:39:12,016 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:12.015--ClientSession(18229945)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--reconnecting to external connection pool
23:39:12,016 INFO  [STDOUT] [EL Fine]  : 2008.05.05 23:39:12.016--ClientSession(18229945)--Connection(14510823)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--INSERT INTO TODO (ID, DESCRIPTION, TITLE, DTYPE) VALUES (?, ?, ?, ?)
	bind => [0, test0, test0, Todo]
23:39:12,265 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:12.265--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX afterCompletion callback, status=COMMITTED
23:39:12,266 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:12.266--UnitOfWork(11898483)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--end unit of work commit
23:39:17,431 INFO  [STDOUT] >>>>new Todo: Todo@e77ca4
23:39:17,433 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.433--ServerSession(30958654)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--client acquired
23:39:17,433 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.433--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX binding to tx mgr, status=STATUS_ACTIVE
23:39:17,599 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:17.599--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query ReadAllQuery(Todo)
23:39:17,600 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:17.600--ServerSession(30958654)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--reconnecting to external connection pool
23:39:17,613 INFO  [STDOUT] [EL Fine]  : 2008.05.05 23:39:17.613--ServerSession(30958654)--Connection(28560534)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--SELECT ID, DTYPE, DESCRIPTION, TITLE FROM TODO WHERE (DTYPE = ?)
	bind => [Todo]
23:39:17,677 INFO  [STDOUT] [EL Finest]: 2008.05.05 23:39:17.677--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Register the existing object Todo@11df416
23:39:17,679 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.678--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX beforeCompletion callback, status=STATUS_ACTIVE
23:39:17,679 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.679--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--begin unit of work commit
23:39:17,679 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.679--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX afterCompletion callback, status=COMMITTED
23:39:17,680 INFO  [STDOUT] [EL Finer] : 2008.05.05 23:39:17.679--UnitOfWork(1102187)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--end unit of work commit

Output of http://127.0.0.1:8080/jsfejb3/todos.faces

The Todo List
 Title Description  
test0 test0 Edit 

References