Thursday, February 4, 2016

Java Persistance API (JPA) Hello world example with EclipseLink and Oracle

Java Persistance API (JPA) provides the interface for the java Object Relational Mapping (ORM) tools such as EclipseLink, OpenJPA, Hibernate etc. These ORM tools helps to change the application data bases without doing any code level changers on Aplication logics. In other words ORM tools reduce the coupling between application layer and database layer.

On this post I will describe step by step aproche to develop simple Java application using EclipseLink ORM tool. In another post I will explain how to do the same operation with Hibernate.

Prerequisites 
  1. You should have install java in your PC and set path variable correctly (JAVA_HOME, JRE_HOME)
  2. You should have install Eclipse Java EE LUNA 4.4 IDE or any IDE you preferred (In this post I'm Using Eclipse )
  3. You should have install Oracle on your PC. In my application I connect to the Oracle 11g database and based on that database vertion you may need to select proper databse connection driver.

Step 1 Lets create database table for our simple application
 First of all we have to have table with set of data. I will create student table using following sql.

create table student
(
studentid number,
firstName varchar2(20) not null,
lastName varchar2(20) not null,
age number(2),
primary key(studentid)
);


As you can see student will have studentid as primary key and firstName, lastName, age as other attributes.

Then I'll add some data in to this table using following SQL.

insert into student values(1,'Lakshan','Silva',21);
insert into student values(2,'Kuma','Sangakara',35);
insert into student values(3,'Nilakshi','Dissanayaka',29);


Then after retrive all the student details using "select * from student" SQL you may able to see similar result to below graph.


Our table is ready at the moment so lets move to next step.

Step 2 Lets Create Dynamic web project

First of all lets download the required jar files to this project. You should download the following jar files
1) javax.persistence-2.1.0-rc1.jar (http://mvnrepository.com/artifact/org.eclipse.persistence/javax.persistence/2.1.0-RC1)
2) ojdbc6.jar (Since I have using Oracle 11g I downloaded it from http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html)
 
 Go to File->New->Other select JPA project as show in below image.


Then click on Next and provide project name I use HelloworldJPA as my project name. Then select target runtime as installed JDK(In my case it's jdk1.7.0_17). Then select JPA version as 2.1 and click next.
At the end interface should be similar to below graph.


Then click next on interface ask you to select src folder( since we use default folder no need to do any modification). The you can see similar interface to below screen shot.



In this interface select platform as EclipseLink Then click on Manage User Libraries icon which show as No 1 red box in above image. Then click on new add user library name I use Javax.Persistence and then click Ok. The click on Add external Jars button and select the downloaded javax.persistence-2.1.0-rc1.jar then click OK.
Then lets add EclipseLink related jar files in to our project. To add that click on Download Library button(show on No 2 red box in above image). Then select the compatible EclipseLink library vertion and Click next. Then agree the agreement and download the relevant ExlipseLink jars in to project

Then lets add our database details for that click on Add connection then select connection profile type as Oracle and provide proper name for the connection I'm use "New Connection" 
Then provide details about database connection and click finish. (I have used oracle thin driver)
Then final image would be similar to below image.


 Then you may able to see project structure similar to below image.

Then double click on persistance.xml file and then go to connection tab. Select Transaction Type as Resource local. Then Click on Popular From Connection and select the database details which added on previous section. Then save the persistance.xml

Then we have to add databse drivers in to class path. Since in this example i'm using Oracle 11g I need to add ojdbc6.jar in to Build path. Right click on project and go to Build path -> Configure Build Path. Then click on Add External JARs and select the downloaded ojdbc6.jar. After adding database connecting driver in to project Java Build Path interface would be similar to below image. Then click Ok.



Step 3 Lets Create Entity class

In Object relational mapping process object table mapping done through the Entity class. On this mapping class we use different JPA anotations to spesify diferent kind of relationships on database tables.
Lets create new java class by right click on src folder and go to New-> class. then provide prefered class name with package name. I use class name as Student and package as "com.jpa.entity".

package com.jpa.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name="Student")
@Table(name="Student")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)

    @Column(name="studentid")
    int ID;
    @Column(name="firstName")
    String FirstName;
    @Column(name="lastName")
    String LastName;
    @Column(name="age")
    int Age;
   
    public int getID() {
        return ID;
    }
    public void setID(int iD) {
        ID = iD;
    }
    public String getFirstName() {
        return FirstName;
    }
    public void setFirstName(String firstName) {
        FirstName = firstName;
    }
    public String getLastName() {
        return LastName;
    }
    public void setLastName(String lastName) {
        LastName = lastName;
    }
    public int getAge() {
        return Age;
    }
    public void setAge(int age) {
        Age = age;
    }
   
    @Override
    public String toString() {
        return "Student [ID=" + ID + ", FirstName=" + FirstName + ", LastName="
                + LastName + ", Age=" + Age + "]";
    }
   
}

 

Then we have to spesify that we use EclipseLink as ORM tool and we use Student as entity class in persistance.xml. Final persistence.xml would similar to this.

<?xml version="1.0" encoding="UTF-8"?>
<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="HellowWorldJPA" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>com.jpa.entity.Student</class>

        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
            <property name="javax.persistence.jdbc.user" value="DBUserName"/>
            <property name="javax.persistence.jdbc.password" value="DBPassword"/>
            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
        </properties>
    </persistence-unit>
</persistence>
 


Step 4 Lets Create class to save details in to database using ORM tool
   
Right click on src folder and go to New-> class. Then provide prefered class name with package name. I use class name as MainApp and package as "com.jpa.mainApp". Then add following content in to that class.

package com.jpa.mainApp;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.jpa.entity.Student;

public class MainApp {
    public static void main(String[] args) {
       
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("HellowWorldJPA");
        //"HellowWorldJPA" is the persistence unit name which we spesify in persistence.xml
        EntityManager em=emf.createEntityManager();
       
        em.getTransaction().begin();
       
        Student std=new Student();
        std.setID(4);
        std.setFirstName("Nilanka");
        std.setLastName("Subhash");
        std.setAge(35);
       
        em.persist(std);
        em.getTransaction().commit();
       
        em.close();
        emf.close();
    }
}



 Then lets run the class by right click on the class and go to Run As -> Java Application.
Then you should able to see similar log in colsole related to your project name and path details.

[EL Info]: 2016-02-04 17:56:10.874--ServerSession(1528705718)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Info]: connection: 2016-02-04 17:56:12.674--ServerSession(1528705718)--file:/G:/Programming/LUNA_WK_SPACES/JPA_SAMPLE/HellowWorldJPA/build/classes/_HellowWorldJPA login successful
[EL Info]: connection: 2016-02-04 17:56:13.19--ServerSession(1528705718)--file:/G:/Programming/LUNA_WK_SPACES/JPA_SAMPLE/HellowWorldJPA/build/classes/_HellowWorldJPA logout successful


Then if you query student table you can see folowing output.


I will provide more advance features using Java Persistence API in my future posts. You can download the source code from following GIT location https://github.com/NirmalBalasooriya/HelloWorldJPA.