Let’s use the previous JPA sample in an EJB. We start creating a datasource on the OC4J container. Then we create the entities again. After this we use the entities in a Stateless EJB which we will deploy to OC4J 11g. Finally we create a stand-alone client which calls the EJB.
We start with the creation of the datasource. We need a ConnectionPool.
java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -CreateJDBCConnectionPool -applicationName default -name HrConnectionPool -factoryClass oracle.jdbc.pool.OracleDataSource -user hr -password hr -url jdbc:oracle:thin:@localhost:1521:orcl
Test the connectionpool:
java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome
-testConnectionPool -connectionPoolName HrConnectionPool -sqlStatement “select
* from dual” And the datasource:
java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -createManagedDataSource -applicationName default -dataSourceName HrDataSource -jndiLocation jdbc/HrDataSource -connectionPoolName HrConnectionPool
After this we create the entities:
/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/entity/Country.java:
package com.bekijkhet.entity;
import java.io.Serializable;
import javax.persistence.*;
@Entity
@Table(name="COUNTRIES")
public class Country implements Serializable {
private String id;
private String name;
private Region region;
@Id
@Column(name="COUNTRY_ID")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Column(name="COUNTRY_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="REGION_ID",nullable=false)
public Region getRegion() {
return region;
}
public void setRegion(Region region) {
this.region = region;
}
}
/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/entity/Region.java
package com.bekijkhet.entity;
import java.io.Serializable;
import javax.persistence.*;
import static javax.persistence.CascadeType.*;
import static javax.persistence.FetchType.*;
import java.util.List;
import java.util.ArrayList;
@Entity
@Table(name="REGIONS")
public class Region implements Serializable {
private int id;
private String name;
private List<Country> countries = new ArrayList<Country>();;
@Id
@Column(name="REGION_ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="REGION_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy="region")
public List<Country> getCountries() {
return countries;
}
public void setCountries(List<Country> newValue) {
this.countries = newValue;
}
}
The EJB:/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJBLocal.java:
package com.bekijkhet.country;
import com.bekijkhet.entity.*;
import java.util.List;
public interface CountryEJBLocal {
public List<Country> getCountriesByRegion(String region);
public Region getRegionByCountry(String country);
}
/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJB.java:
package com.bekijkhet.country;
import java.util.List;
import com.bekijkhet.entity.*;
public interface CountryEJB {
public List<Country> getCountriesByRegion(String region);
public Region getRegionByCountry(String country);
public void addorchangeCountry(Country country) ;
public void addorchangeRegion(Region region) ;
public void removeCountry(Country country) ;
public void removeRegion(Region region) ;
public List<Region> getAllRegions() ;
public List<Country> getAllCountries();
}
/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJBBean.java
package com.bekijkhet.country;
import javax.ejb.Stateless;
import javax.ejb.Remote;
import javax.ejb.Local;
import java.util.List;
import com.bekijkhet.entity.*;
import javax.persistence.*;
@Stateless
@Remote(CountryEJB.class)
@Local(CountryEJBLocal.class)
public class CountryEJBBean implements CountryEJB,CountryEJBLocal {
@PersistenceContext
EntityManager em;
public List<Country> getCountriesByRegion(String region) {
Query q = em.createQuery("select r from Region r where r.name = :name");
q.setParameter("name",region);
Region r = (Region) q.getSingleResult();
// r.getCountries().size(); // get the LAZY relation
return r.getCountries();
}
public Region getRegionByCountry(String country) {
Query q = em.createQuery("select c from Country c where c.name = :name");
q.setParameter("name",country);
Country c = (Country) q.getSingleResult();
return c.getRegion();
}
public void addorchangeCountry(Country country) {
em.persist(country);
}
public void addorchangeRegion(Region region) {
em.persist(region);
}
public void removeCountry(Country country) {
Country c = em.merge(country);
em.remove(c);
}
public void removeRegion(Region region) {
Region r = em.merge(region);
em.remove(r);
}
public List<Region> getAllRegions() {
Query q = em.createQuery("select r from Region r");
List<Region> l = q.getResultList();
return l;
}
public List<Country> getAllCountries() {
Query q = em.createQuery("select c from Country c");
List<Country> l = q.getResultList();
return l;
}
}
We need a persistence descriptor : /home/broersa/work/CountryApp/CountryJPAEJB/src/META-INF/persistence.xml:
<persistence>
<persistence-unit name="MyPU">
<jta-data-source>jdbc/HrDataSource</jta-data-source>
</persistence-unit>
</persistence>
We need the build file:/home/broersa/work/CountryApp/CountryJPAEJB/build.xml:
<project name="CountryJPAEJB" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<path id="files-classpath">
<!--fileset dir="$HOME/oc4j_client_11110_preview/j2ee/home/lib" >
<include name="persistence.jar"/>
</fileset-->
<pathelement location="/home/broersa/oc4j_client_11110_preview/j2ee/home/lib/persistence.jar"/>
<pathelement location="/home/broersa/oc4j_client_11110_preview/j2ee/home/lib/ejb.jar"/>
</path>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}">
<classpath refid="files-classpath" />
</javac>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}"/>
<copy todir="${build}/META-INF">
<fileset dir="src/META-INF">
<include name="*" />
</fileset>
</copy>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/CountryBean.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
We can build and deploy the EJB:type “ant” to build the EJB.use the next command to deploy the ejb:
java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -deploy -file $HOME/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar -deploymentName CountryBean
Now this is done we can create the client:
/home/broersa/work/CountryApp/CountryClient/com/bekijkhet/CountryClient.java:
package com.bekijkhet;
import javax.naming.*;
import com.bekijkhet.country.CountryEJB;
import com.bekijkhet.entity.*;
import java.util.Properties;
import java.util.List;
public class CountryClient {
public static void main(String[] args) {
try {
Properties props = new Properties();
props.put("java.naming.factory.initial","com.evermind.server.ApplicationClientInitialContextFactory");
props.put("java.naming.provider.url","ormi://localhost/CountryBean");
props.put("java.naming.security.principal","oc4jadmin");
props.put("java.naming.security.credentials","welcome");
InitialContext ctx = new InitialContext(props);
CountryEJB h = (CountryEJB)ctx.lookup("CountryEJBBean");
System.out.println("The Netherlands has region: " + h.getRegionByCountry("Netherlands").getName());
List<Country> l1 = h.getCountriesByRegion("Europe");
System.out.println("Europe has the following countries:");
for (Country c : l1) {
System.out.println(" " + c.getName());
}
System.out.println("All regions:");
List<Region> l2 = h.getAllRegions();
for (Region r : l2) {
System.out.println(" " + r.getName());
}
System.out.println("All countries:");
List<Country> l3 = h.getAllCountries();
for (Country c2 : l3) {
System.out.println(" " + c2.getName() + " - " + c2.getRegion().getName());
}
Region r3 = new Region();
r3.setName("MyRegion1");
r3.setId(1001);
Country c3 = new Country();
c3.setName("MyCountry1");
c3.setId("31");
c3.setRegion(r3);
r3.getCountries().add(c3);
h.addorchangeCountry(c3);
Region r4 = new Region();
r4.setName("MyRegion2");
r4.setId(1002);
Country c4 = new Country();
c4.setName("MyCountry2");
c4.setId("32");
c4.setRegion(r4);
r4.getCountries().add(c4);
h.addorchangeRegion(r4);
System.out.println("All regions:");
List<Region> l5 = h.getAllRegions();
for (Region r5 : l5) {
System.out.println(" " + r5.getName());
}
System.out.println("All countries:");
List<Country> l6 = h.getAllCountries();
for (Country c6 : l6) {
System.out.println(" " + c6.getName() + " - " + c6.getRegion().getName());
}
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
/home/broersa/work/CountryApp/CountryClient/com/bekijkhet/META-INF/application-client.xml:
<?xml version="1.0" encoding="UTF-8"?>
<application-client version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/application-client_1_4.xsd">
<display-name>CountryClient</display-name>
<description>test</description>
</application-client>
Compile the client:javac -cp $OC4J_HOME/j2ee/home/oc4jclient.jar:/home/broersa/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar:. -d . CountryClient.javaAnd test the client:java -cp $OC4J_HOME/j2ee/home/oc4jclient.jar:/home/broersa/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar:. com.bekijkhet.CountryClient
The Netherlands has region: Europe
Europe has the following countries:
Belgium
Switzerland
Germany
Denmark
France
Italy
Netherlands
United Kingdom
All regions:
Europe
Americas
Asia
Middle East and Africa
All countries:
Argentina – Americas
Australia – Asia
Belgium – Europe
Brazil – Americas
Canada – Americas
Switzerland – Europe
China – Asia
Germany – Europe
Denmark – Europe
Egypt – Middle East and Africa
France – Europe
HongKong – Asia
Israel – Middle East and Africa
India – Asia
Italy – Europe
Japan – Asia
Kuwait – Middle East and Africa
Mexico – Americas
Nigeria – Middle East and Africa
Netherlands – Europe
Singapore – Asia
United Kingdom – Europe
United States of America – Americas
Zambia – Middle East and Africa
Zimbabwe – Middle East and Africa
All regions:
Europe
Americas
Asia
Middle East and Africa
MyRegion1
MyRegion2
All countries:
MyCountry1 – MyRegion1
MyCountry2 – MyRegion2
Argentina – Americas
Australia – Asia
Belgium – Europe
Brazil – Americas
Canada – Americas
Switzerland – Europe
China – Asia
Germany – Europe
Denmark – Europe
Egypt – Middle East and Africa
France – Europe
HongKong – Asia
Israel – Middle East and Africa
India – Asia
Italy – Europe
Japan – Asia
Kuwait – Middle East and Africa
Mexico – Americas
Nigeria – Middle East and Africa
Netherlands – Europe
Singapore – Asia
United Kingdom – Europe
United States of America – Americas
Zambia – Middle East and Africa
Zimbabwe – Middle East and Africa