Table of Contents
Project Versions
EclipseLink Version: 2.5.2 - [ EclipseLink 2.5.2 == JPA 2.1] JBDC Driver Name : Oracle JDBC driver JDBC Driver Version : 12.1.0.2.0 Database Version : Database Product Version: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options Database Name and Instances : DB Name: BANKA 1. Instance Name: bankA_2 - Host: hract21.example.com 2. Instance Name: bankA_1 - Host: hract22.example.com Netbeans Version : 8.0.2 Wildfly Version : 8.2 Entity Manger Type : Application Managed Transaction Type : JTA
Setup EclipseLink as a Wildfly Module
Check modules/system/layers/base/org/eclipse/persistence/main directory oracle@wls1 main]$ pwd /usr/local/wildfly-8.2.0.Final/modules/system/layers/base/org/eclipse/persistence/main Copy eclipselink-2.5.2.jar from MAVEN repository to modules/system/layers/base/org/eclipse/persistence/main [oracle@wls1 main]$ ls eclipselink-2.5.2.jar jipijapa-eclipselink-1.0.1.Final.jar module.xml Add eclipselink-2.5.2.jar to module.xml in modules/system/layers/base/org/eclipse/persistence/main [oracle@wls1 main]$ cat module.xml <module xmlns="urn:jboss:module:1.3" name="org.eclipse.persistence"> <resources> <resource-root path="jipijapa-eclipselink-1.0.1.Final.jar"/> <resource-root path="eclipselink-2.5.2.jar"/> </resources> <dependencies> <module name="asm.asm"/> <module name="javax.api"/> <module name="javax.annotation.api"/> <module name="javax.enterprise.api"/> <module name="javax.persistence.api"/> <module name="javax.transaction.api"/> <module name="javax.validation.api"/> <module name="javax.xml.bind.api"/> <module name="org.antlr"/> <module name="org.apache.commons.collections"/> <module name="org.dom4j"/> <module name="org.javassist"/> <module name="org.jboss.as.jpa.spi"/> <module name="org.jboss.logging"/> <module name="org.jboss.vfs"/> </dependencies>
Configure your pom.xml
- Remove the hibernate reference and add the EclipseLink reference
As we provided the EclipseLink Jar as a Wildlfly module add : <scope>provided</scope> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.5.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId> <version>2.5.2</version> <scope>provided</scope> </dependency>
Create a new Netbeans project
Create new Maven project : Maven -> Web Application Add JSF support : Properties -> Add Framework -> JSF 2.2 Source Package -> New -> Entity Class from Database Add New File -> Persistence -> Entity Class from Database -> Select Datasource: Host : ract2-scan.grid12c.example.com Port : 1521/banka URL : jdbc:oracle:thin:@ract2-scan.grid12c.example.com:1521/banka -> Select table : EMP2 Select ; x Generate Named Query Annotations for Persistent Fields x Generate JAXB Annotations x Create Persistence Unit Create persistence.xml New File -> Persistence -> Create new Persistence Unit -> Select Datasource: .. x Use Java Transaction API A working persistence.xml sample may look like : <?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_2_0.xsd" version="2.0"> --> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="jpaPU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>java:/jboss/datasources/myRacDS</jta-data-source> <jar-file>MyFirstRACPU.jar</jar-file> <class>com.hhu.wfjpa2el.Emp2</class> <class>com.hhu.wfjpa2el.Logemp2</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="eclipselink.logging.level" value="FINEST"/> <property name="eclipselink.cache.shared.default" value="false"/> </properties> </persistence-unit> </persistence>
- JTA is used and the datasoruce name is : java:/jboss/datasources/myRacDS
- org.eclipse.persistence.jpa.PersistenceProvider is the Persistence Provider
- The perstistence Unit name is jpaPU [ this is used by our JAVA code ]
JAVA Code to create a thread safe access to the Entity Manager
- Persistence.createEntityManagerFactory(“jpaPU“) must match <persistence-unit name=”jpaPU” transaction-type=”JTA“>
- <class>com.hhu.wfjpa2el.Logemp2</class> must match the Classes we have created by using Netbeans menu option : Create Entity Class from Database
- For the Entity Manger access we use the “ThreadLocal Pattern”
static { emf = Persistence.createEntityManagerFactory("jpaPU"); threadLocal = new ThreadLocal<EntityManager>(); } public static EntityManager getEntityManager() { EntityManager em = threadLocal.get(); if (em == null) { // setRunTimeInfo(getRunTimeInfo() + Tools.add_hmtl_pre_tag("Creating Entity Manager ! " )); logger.info("Creating Entity Manager Factory ..." ); em = emf.createEntityManager(); // set your flush mode here threadLocal.set(em); } return em; } public static void closeEntityManager() { EntityManager em = threadLocal.get(); if (em != null) { logger.info("Closing Entity Manager" ); em.close(); threadLocal.set(null); } } Note for each request you have to open and close the Entity Manager .. em=getEntityManager(); .. closeEntityManager(); ..
A more Complete Code fragment
public String addEntity() { EntityManager em; String methodName = "addEntity()"; short eno= getEmpno(); cleanall(); try { setRunTimeInfo("Calling " + methodName + "in progress - ID: " + eno + " - useJoinTransaction : " + isUseJoinTransaction() ); Emp2 e = new Emp2(eno); e.setEname("Helmut"); e.setJob("Progr."); e.setSal(new BigDecimal(1000.0)); setRunTimeInfo("Requesting Entity Manager.. "); em=getEntityManager(); ut.begin(); em.joinTransaction(); setRunTimeInfo("Running em.persists() ... "); em.persist(e); setRunTimeInfo("Running em.flush() ... "); em.flush(); setRunTimeInfo("Running ut.commit() ... "); ut.commit(); setRunTimeInfo("Closing Entity Manager.. !"); setRunTimeInfo("Leaving " + methodName + " without Exceptions !"); } catch ( Throwable t1) { jpa_exception(t1, methodName); } closeEntityManager(); setRunTimeInfo("Leaving " + methodName + " - Entity manager closed !\n"); return "index"; }
The related Server.log File shoud look like :
2015-05-20 18:38:23,361 INFO [org.eclipse.persistence] (default task-5) EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd 2015-05-20 18:38:23,496 INFO [org.eclipse.persistence.connection] (default task-5) connecting(DatabaseLogin( 2015-05-20 18:38:23,497 INFO [org.eclipse.persistence.connection] (default task-5) Connected: jdbc:oracle:thin:@ract2-scan.grid12c.example.com:1521/banka 2015-05-20 18:38:23,497 INFO [org.eclipse.persistence.connection] (default task-5) connecting(DatabaseLogin( 2015-05-20 18:38:23,497 INFO [org.eclipse.persistence.connection] (default task-5) Connected: jdbc:oracle:thin:@ract2-scan.grid12c.example.com:1521/banka 2015-05-20 18:38:23,653 INFO [org.eclipse.persistence.connection] (default task-5) vfs:/usr/local/wildfly-8.2.0.Final/standalone/deployments/t-1.0.war/WEB-INF/classes/_jpaPU login successful
One thought on “Using Eclipselink as a Persistence Provider in a Netbeans/Wildfly project for JTA transaction”