EJB 3.0 Java Persistence with Oracle TopLink

46
IOUG Collaborate ‘08 EJB 3.0 Java Persistence API JPA with Oracle TopLink Bill Lyons Systems Architect Huntsford Consulting [email protected]

description

Getting started with Oracle TopLink and EJB 3.0 Java Persistence API JPA

Transcript of EJB 3.0 Java Persistence with Oracle TopLink

Page 1: EJB 3.0 Java Persistence with Oracle TopLink

IOUG Collaborate ‘08

EJB 3.0 Java Persistence API JPA with Oracle TopLink

Bill LyonsSystems Architect

Huntsford [email protected]

Page 2: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

2

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Introduction• Applications using a back end database and a web

front end are the most common development architecture in use today.

• Persistence frameworks provide a clean way to separate presentation logic and business logic from database operations.

• Persistence frameworks help improve database performance through the use of a mid-tier cache.

• The mid-tier improves user experience by caching frequently used data for recall without having to requery data from the database.

• Caching improves performance, but it must be used appropriately.

Page 3: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

3

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Overview• Examine the development of code that

manages interaction between the database and applications.

• Take a close look at TopLink - an Oracle owned persistence framework.

• Discuss design tradeoffs and common issues associated with using a persistence tier.

Page 4: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

4

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

J2EE Architecture Overview

Page 5: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

5

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

J2EE Application Deployment View

Page 6: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

6

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Design separation in a typical web-based J2EE application

We’ll follow the Model-View-Controller OO Design Pattern:

TopLink simplifies the development and maintenance of the ‘Model’ portion of an MVC application.

Page 7: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

7

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

The Persistence Management Problem

• Relational Databases and Object Oriented Languages organize data differently.

• This makes it difficult for web developers to store and retrieve data from a database.

• JDBC code provides access to the database, but is difficult to maintain as the data model changes.

• JDBC code can be a significant source of performance and maintenance problems if not maintained properly.

• Persistence frameworks are designed to improve performance while standardizing and simplifying development.

Page 8: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

8

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Competing Technologies that solve the persistence problem:• Create your own connection pool and write JDBC

and SQL code – ugly!• Use a persistence framework:

– Hibernate– Spring– JDO– BC4J– TopLink– …and many others…

Page 9: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

9

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink: recommended for new development efforts

• Amongst Java developers it and Hibernate are the most widely used.

• Easy to use and maintain• Rich feature set• Easy for Java developers to learn: very well documented• Easy for DBAs to understand• Supported by Oracle• However, probably not appropriate for Oracle Apps

integration. • Design Limitation/Recommendation: Use Only 1

persistence framework/strategy per database table.

Page 10: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

10

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Demo Development/ Deployment Environment

Database Oracle XE

Integrated Development Environment Oracle JDeveloper 10.1.3.3

Application Server Oracle 10g Application Server (OC4J) (embedded in JDeveloper for

today’s demo)

Development Platform Windows, Unix, Mac

Page 11: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

11

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink Project Artifacts• A JDeveloper Database Connection• TopLink Plain old Java Objects (POJOs) that

represent table metadata and table row instances• An EJB session bean that provides a way for users

to connect to the persistence tier and perform data operations.

• Developer constructed queries.• Code to test out the persistence implementation

using an EJB test client.

Page 12: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

12

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink Getting Started• Download and install database (or connect to an existing

one)• Download and install JDeveloper 10.1.3.3• Build tables, indexes, sequences and constraints on the

database: (We’ll use the Oracle SRDemo today as an example)

• Install the SRDemo Tables, Indexes and Sequences. For the SRDemo, these are generated by running the build.sql script bundled with the application.

• Be sure to get the SRDemo for TopLink – not ADF/BC or SRDemo for 4GL. There are different versions out there!

Page 13: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

13

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink My First Persistence Tier• Create a Connection from JDeveloper to the Database.• Create a new TopLink project and workspace in

JDeveloper.• Run the TopLink wizard to create EJB 3.0 JPA Entity

Objects and an EJB Session Bean.• Refine the design if necessary.• Deploy to an application server. (JDeveloper includes a

small OC4J application server that we’ll use for local testing.)

• Write a test client to test out the implementation.

Page 14: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

14

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08 SRDemo Schema

Page 15: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

15

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Setting up the Project

• Start Database• Start JDeveloper• Create a Connection to the Database in

JDeveloper• Create an Application and Workspace in

JDeveloper

Page 16: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

16

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Create a new Application and Workspace in JDeveloper

You can type anything for Application Name and Directory Name. In general, JDeveloper like most Java Development Environments will behave inconsistently with spaces between characters so don’t use them in names or directory paths.Choose Web Application [JSF, EJB, TopLink] for the Application Template and click OK.

Page 17: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

17

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Create EJB 3.0 Entity Objects using TopLink

• A TopLink Entity Object will be created for each table and view referenced.

• Entity Objects provide an interface into a database tables • Entity Objects expose methods to operate on database

columns.• Database views and synonyms are also viable selections

for TopLink entities.• TopLink can reference database sequences or stored

procedures to populate columns.

Page 18: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

18

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Using JDeveloper wizards to create TopLink objects using EJB 3.0 APIs

Be sure to choose EJB and Entities from Tables (JPA/EJB 3.0) when creating the persistence tier

Page 19: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

19

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Examining the Generated TopLink Entity Objects

A Java Entity object will be created for every table that is selected in the wizard. It is possible to also select database views and synonyms for generation.The Entity object contains table metadata, get/set methods for each column and named queries for the Entity.A separate Java object will be created for querying and enforcing primary key constraints.

Page 20: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

20

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Examining the Generated Java Source Code: for the ExpertiseAreas POJO

@Entity@NamedQuery( name = "ExpertiseAreas.findAll", query = "select o from ExpertiseAreas o" )@Table( name = "EXPERTISE_AREAS" )@IdClass( ExpertiseAreasPK.class )public class ExpertiseAreas implements Serializable { @Column( name="EXPERTISE_LEVEL", nullable = false ) private String expertiseLevel; private String notes; @Id @Column( name="PROD_ID", nullable = false, insertable = false,

updatable = false ) private Long prodId; @Id @Column( name="USER_ID", nullable = false, insertable = false,

updatable = false ) private Long userId; @ManyToOne @JoinColumn( name = "PROD_ID", referencedColumnName = "PROD_ID" ) private Products products;

Page 21: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

21

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Examining the Generated Java Source Code: Column Code

//…public String getExpertiseLevel() { return expertiseLevel;}public void setExpertiseLevel( String expertiseLevel ) { this.expertiseLevel = expertiseLevel;}public String getNotes() { return notes;}

public void setNotes( String notes ) { this.notes = notes;}

public Long getProdId() { return prodId;}

public void setProdId( Long prodId ) { this.prodId = prodId;}

//… and so on…

Page 22: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

22

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Build a session bean to expose the Entities and provide session functionality

From the New Gallery choose Business Tier, EJB, Session Bean (EJB 1.1/2.x/3.0)…Accept all defaults.

Page 23: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

23

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Purpose of the Session Bean• Encapsulates behavior needed by a client (could

be web, swing client, or web service) so that the client can connect and query objects out of the persistence tier without having to know about database connections, SQL or database connectivity.

• Deployed with our POJOs to an EJB container.

Page 24: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

24

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Examining the Generated Source Code for the Session Bean

@Stateless( name="SessionEJB" )public class SessionEJBBean implements SessionEJB, SessionEJBLocal { @PersistenceContext( unitName="Model" ) private EntityManager em;

public Object mergeEntity( Object entity ) { return em.merge(entity); }

public Object persistEntity( Object entity ) { em.persist(entity); return entity; }

/** <code>select o from ExpertiseAreas o</code> */ public List<ExpertiseAreas> queryExpertiseAreasFindAll() { return em.createNamedQuery("ExpertiseAreas.findAll").getResultList(); }

public void removeExpertiseAreas( ExpertiseAreas expertiseAreas ) { expertiseAreas = em.find(ExpertiseAreas.class, new

ExpertiseAreasPK(expertiseAreas.getProdId(), expertiseAreas.getUserId())); em.remove(expertiseAreas); }

Page 25: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

25

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Build a simple test client

To create a test client right click on the SessionEJBBean.java that we generated earlier in the project and choose New Sample Java Client…

Page 26: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

26

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Examine the Generated Code for the Test EJB Client

public class SessionEJBClient { public static void main( String [] args ) { try {

final Context context = getInitialContext(); SessionEJB sessionEJB = (SessionEJB)context.lookup("SessionEJB");

System.out.println( sessionEJB.queryExpertiseAreasFindAll( ) );

// Call other methods of the Remote object to access the EJB // sessionEJB.mergeEntity( expertiseAreas ); // sessionEJB.persistEntity( expertiseAreas );

// sessionEJB.removeExpertiseAreas( expertiseAreas ); } catch ( Exception ex ) { ex.printStackTrace(); } }

Page 27: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

27

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Testing it all out• Run the SessionEJBBean

– This deploys the SessionEJBBean, connection and Entity objects to the OC4J container embedded in JDeveloper.

• Run the SessionEJBClient– The client will connect to the Web Application Server, locate the

SessionEJBBean and execute methods on the remote session bean.

• Remember, you must run the SessionEJBBean first to deploy it to the container, otherwise you will get an error!

• As you make changes to your Entities, remember you will have to redeploy (make/rebuild, run) in order to have the changes take effect on the App Server.

Page 28: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

28

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

It works! …sort of ;-(• What does this mean?com.ioug.model.ExpertiseAreas@193c0cf

Page 29: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

29

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Refining the generated code• Need a way to query (and see) data• Need a way to make changes to data• Need a way to commit work

Page 30: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

30

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink CRUD query methods Match Up Question:

SQL TopLinkSELECT removeEntity()INSERT queryEntityNameFindAll()UPDATE persistEntity() DELETE mergeEntity()

?

Page 31: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

31

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

TopLink CRUD query operations: ANSWER

SQL TopLinkSELECT queryEntityNameFindAll()INSERT persistEntity() UPDATE mergeEntity()DELETE removeEntityName()

Page 32: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

32

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Select All data querySelecting data using the queryEntityNameFindAll() method:

// Selects all rows from the Products table:System.out.println("Products Query Result:");

List<Products> productsList = sessionEJB.queryProductsFindAll();

for ( Products p: productsList ) { System.out.println( "Product ID: " + p.getProdId() ); System.out.println( "Product Name: " + p.getName() ); System.out.println( "Product Description: " + p.getDescription() ); }// end for

Page 33: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

33

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Inserting Data using the persistEntity() method

// Insert a row into the products table:Products p1 = new Products();

p1.setName( "IOUG Washing Machine" );p1.setDescription( "Having fun at IOUG" );

sessionEJB.persistEntity( p1 );

Page 34: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

34

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Updating data using the mergeEntity() method:

// Update a row in the products table:// productsList.size() returns the size of the List// Remember: Java like C/C++ is zero based so we must// subtract 1 to find the last element in the List:

Products p2 = new Products();

p2 = productsList.get( productsList.size() - 1 );

p2.setName( "IOUG iPod" );p2.setDescription( "We updated this row!" );

sessionEJB.mergeEntity( p2 );

Page 35: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

35

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Delete data using the removeEntityName() method

// delete a Product from the Products table:Products p3 = new Products();

p3 = productsList.get( productsList.size() - 1 );

sessionEJB.removeProducts( p3 );

Page 36: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

36

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

How do you find an Entity Row by Primary Key?

• Need to create a new Named Query• Expose the new Query in the Session Bean• Test it out in the Client Test Harness

Page 37: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

37

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Find a row by primary Key: Step 1. Create a Named Query in

Products.java EntityBeanCreate a new Named Query. If you have more than 1 query in a POJO,

you’ll need to wrap the named queries in an @NamedQueries Annotation.

@NamedQueries({

@NamedQuery( name = "Products.findAll", query = "select o from Products o" ) ,

@NamedQuery( name = "Products.findByProdId", query = "select p from Products p where p.prodId = :prodId")

})

Code that we added

Page 38: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

38

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Find a row by primary Key: Step 2. Expose the new method

Right click on the SessionEJBBean.java file and then Select Edit Session Façade…

• Expose the findByProdId() method in the Session Bean:

Page 39: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

39

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Find a row by primary Key: Step 3.

Check the newly created Products.findByProdId method. This will make it available to clients at runtime.

• Expose/Enable methods in the Session Façade wizard:

Page 40: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

40

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Method generated for our new query in the session bean:

/** <code>select p from Products p where p.prodId = :prodId</code> */

public List<Products> queryProductsFindByProdId( Object prodId ) { return em.createNamedQuery( "Products.findByProdId“ ) .setParameter( "prodId", prodId ).getResultList();}

This cryptic little stub performs the following.1. Accepts a prodId parameter.2. Creates an instance of the findByProdId NamedQuery using the Entity

Manager instance em.3. Sets the prodId parameter to the value passed in to the method.4. Returns a java.util.List object that contains all of the objects (rows) that

satisfied this query by invoking the getResultList() method of the NamedQuery.

Page 41: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

41

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Test our new query in the EJB test client

System.out.println( "Products by Prod ID Query Result:" );

List<Products> productsList = sessionEJB.queryProductsFindByProdId( 100 );for ( Products p: productsList ) {

System.out.println( "Prod ID: " + p.getProdId() ); System.out.println( "Name: " + p.getName() ); System.out.println( "Description: " + p.getDescription() );

}

Remember: Because we added a new named query to Products.java and a method to the Session Bean we’ll need to redeploy the application to the application server to get the changes to be published.

Page 42: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

42

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Handling Schema Design Changes

• Have a look at Offline Database Object Generation/Reconciliation.

Page 43: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

43

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Persistence Framework Issues

• Very important to understand the relationship between your persistence framework and the database regarding synchronization.

• Very important to implement and understand a synchronization strategy so that database/mid-tier consistency is maintained.

Page 44: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

44

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Recommendations• Use a persistence framework• Have a J2EE data architect role on project

that works closely with the administrator responsible for database schema administration.

• Watch out for DML that is performed outside of the persistence framework.

• Get to know how to tune your persistence framework

• Be on the lookout for rogue developers

Page 45: EJB 3.0 Java Persistence with Oracle TopLink

Inspiring Your Next Success!®

45

Hitachi Consulting

Bill Lyons EJB 3.0

IOUG Collaborate ‘08

Helpful information• EJB 3.0 TopLink Presentation Materials and Source Code

– http://www.4shared.com/dir/6445050/5b75ff18/IOUG_2008.html• Oracle TopLink Homepage

– www.oracle.com/technology/products/ias/toplink/index.html• EJB 3.0 Resources

– www.oracle.com/technology/tech/java/ejb30.html• Oracle JDeveloper Homepage

– www.oracle.com/technology/products/jdev/index.html• EJB 3.0 Specification

– java.sun.com/products/ejb/docs.html• TopLink Cache Invalidation

– www.oracle.com/technology/products/ias/toplink/technical/tips/DbChangeNotification/index.htm

• Spy Mid-Tier SQL to Database– www.p6spy.com/

Page 46: EJB 3.0 Java Persistence with Oracle TopLink

IOUG Collaborate ‘08

EJB 3.0 Java Persistence API (JPA) with Oracle TopLink

Bill LyonsSystems Architect

Huntsford [email protected]