Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
EclipseLink/Examples/JPA/Migration/JBoss
< EclipseLink | Examples | JPA | Migration
Contents
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.
- See the RedHat JBoss EJB3 Example documentation.
- See the JBoss EJB3 example jsfejb3.ear binary.
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:/DefaultDS</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.HSQLPlatform"/> <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.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
To continue to use the HSQL (Hypersonic) Database all you need to do is define the target-database in the persistence unit.
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.HSQLPlatform"/>
Drop/Create Database
The tables will be automatically dropped and created by EclipseLink with the following 2 properties in the persistence unit.
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.ddl-generation.output-mode" value="database"/>
JTA Datasource Configuration
No changes are required in the deploy directory of JBoss 4.2.2 out of the box to run HSQL.
@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
- This example does not require weaving - this section is for reference and can be skipped.
- 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
- http://127.0.0.1:8080/jsfejb3
- Action create, read
10:13:22,482 INFO [STDOUT] >>>>new Todo: Todo@1397218 10:13:22,525 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.525--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--property=eclipselink.target-server; value=org.eclipse.persistence.platform.server.jboss.JBossPlatform 10:13:22,526 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.526--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--property=eclipselink.target-database; value=org.eclipse.persistence.platform.database.HSQLPlatform 10:13:22,556 INFO [STDOUT] [EL Config]: 2008.05.08 10:13:22.556--ServerSession(2522904)--Connection(28982303)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Connected: jdbc:hsqldb:C:\opt\jboss422\server\default\data\hypersonic\localDB User: SA Database: HSQL Database Engine Version: 1.8.0 Driver: HSQL Database Engine Driver Version: 1.8.0 10:13:22,596 INFO [STDOUT] [EL Info]: 2008.05.08 10:13:22.596--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--file:/C:/opt/jboss422/server/default/tmp/deploy/tmp20649jsfejb3.ear-contents/app.jar-helloworld login successful 10:13:22,621 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.621--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query DataModifyQuery() 10:13:22,621 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.621--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--reconnecting to external connection pool 10:13:22,622 INFO [STDOUT] [EL Fine]: 2008.05.08 10:13:22.622--ServerSession(2522904)--Connection(9673691)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--DROP TABLE TODO 10:13:22,627 INFO [STDOUT] [EL Warning]: 2008.05.08 10:13:22.624--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.0 (Build SNAPSHOT - 20080502)): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Table not found: TODO in statement [DROP TABLE TODO] Error Code: -22 Call: DROP TABLE TODO Query: DataModifyQuery() 10:13:22,627 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.627--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query DataModifyQuery() 10:13:22,628 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.628--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--reconnecting to external connection pool 10:13:22,628 INFO [STDOUT] [EL Fine]: 2008.05.08 10:13:22.628--ServerSession(2522904)--Connection(24215639)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--CREATE TABLE TODO (ID NUMERIC(19) NOT NULL, DTYPE VARCHAR(31), DESCRIPTION VARCHAR(255), TITLE VARCHAR(255), PRIMARY KEY (ID)) 10:13:22,629 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.628--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--End deploying Persistence Unit helloworld; state Deployed; factoryCount 1 10:13:22,639 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.639--ServerSession(2522904)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--client acquired 10:13:22,641 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.641--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX binding to tx mgr, status=STATUS_ACTIVE 10:13:22,641 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.641--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query DoesExistQuery() 10:13:22,647 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.647--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--PERSIST operation called on: Todo@1397218. 10:13:22,648 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.648--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX beforeCompletion callback, status=STATUS_ACTIVE 10:13:22,648 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.648--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--begin unit of work commit 10:13:22,652 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.652--ClientSession(25769070)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX beginTransaction, status=STATUS_ACTIVE 10:13:22,653 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.652--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Execute query InsertObjectQuery(Todo@1397218) 10:13:22,655 INFO [STDOUT] [EL Finest]: 2008.05.08 10:13:22.655--ClientSession(25769070)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--reconnecting to external connection pool 10:13:22,655 INFO [STDOUT] [EL Fine]: 2008.05.08 10:13:22.655--ClientSession(25769070)--Connection(21848338)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--INSERT INTO TODO (ID, DESCRIPTION, TITLE, DTYPE) VALUES (?, ?, ?, ?) bind => [0, TEST, TEST, Todo] 10:13:22,665 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.664--UnitOfWork(9517133)--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--TX afterCompletion callback, status=COMMITTED 10:13:22,666 INFO [STDOUT] [EL Finer]: 2008.05.08 10:13:22.666--UnitOfWork(9517133)--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
- See Another example of how to use EclipseLink as JPA provider on the JBoss container.
- See Developing JPA Projects in the EclipseLink User's Guide.