Presentation File: 2008_478_Lyons_ppt
Download
Report
Transcript Presentation File: 2008_478_Lyons_ppt
Hitachi Consulting
EJB 3.0 Java Persistence API
(JPA) with Oracle TopLink
Bill Lyons
Systems Architect
Hitachi Consulting
[email protected]
IOUG Collaborate ‘08
Hitachi Consulting
Hitachi Consulting
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
take a trip to the database.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
2
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
3
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
EJB
3.0Consulting
Top Link Presentation Goals
• Develop a high level understanding of J2EE
design.
• Understand how persistence frameworks simplify
development.
• Understand persistence tier development choices.
• Understand and be able to develop a simple
persistence framework using Oracle TopLink.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
4
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
J2EE Overview
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
5
Bill Lyons EJB 3.0
Hitachi Consulting
HitachiApplication
Consulting
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
Layout
6
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Design
artifacts
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
7
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
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.
• JDBC code can be a significant source of performance
problems if not maintained properly.
• Persistence frameworks are designed to improve
performance while standardizing and simplifying
development.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
8
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
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…
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
9
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
TopLink:
recommended
for
new development efforts
•
•
•
•
•
•
•
Has the largest installed base
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
10
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Demo
Development
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
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
11
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Typical
TopLink
Project
Artifacts
• A JDeveloper Database Connection
• TopLink Plain old Java Objects (POJOs) that
represent table metadata and table row instances
from an Oracle database
• An EJB session bean that allows 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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
12
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
TopLink Getting Started
• Download and install database (or connect to 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)
• SRDemo Tables, Indexes and Sequences are generated by
running the build.sql script bundled with SRDemo
• Be sure to get the SRDemo for TopLink – not ADF/BC or
SRDemo for 4GL. There are different versions out there
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
13
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
TopLink Getting Started (cont.)
• 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.
• Write a test client to test out the implementation.
• If everything works, version the source code along with the
database DDL.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
14
Bill Lyons EJB 3.0
Hitachi Consulting
SRDemo Schema
Hitachi Consulting
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
15
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
TopLink
My First
Persistence Tier
• Start Database
• Start JDeveloper
• Create a Connection to the Database in
JDeveloper
• Create an Application and Workspace in
JDeveloper
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
16
Bill Lyons EJB 3.0
Hitachi Consulting
Create
new Application and Workspace
HitachiaConsulting
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
17
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Create EJB 3.0 Entity Objects using
TopLink
• A TopLink Entity Object will be created for each
table and view referenced
• Entity Objects define database tables and
operations that can be performed on entity rows.
• Database views and synonyms are also viable
selections for TopLink entities.
• TopLink can reference database sequences or
stored procedures to populate columns
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
18
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
UsingConsulting
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
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
19
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consultingthe
Examining
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
20
Bill Lyons EJB 3.0
Hitachi Consulting
Examining
the
Hitachi
Consulting
Generated Java
Source Code: Table Code
@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;
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
21
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
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…
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
22
Bill Lyons EJB 3.0
Hitachi Consulting
Create Consulting
a class diagram from the Entity
Hitachi
Objects
From inside of the rmoug
Model project right click and
choose New…
The New Gallery appears.
Choose Diagrams…
Database Diagram
Name the diagram SRDemo
class diagram.
Then drag and drop the Java
Beans that we created in the
previous step.
Arrange the diagram objects so
that all elements are visible.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
23
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
JDeveloper class diagram
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
24
Bill Lyons EJB 3.0
Hitachi Consulting
Build
a session
bean to expose the Entities
Hitachi
Consulting
and provide session functionality
From the New Gallery choose
Business Tier, EJB, Session
Bean (EJB 1.1/2.x/3.0)…
Accept all defaults.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
25
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Purpose
of the
Session Bean
• Encapsulates all of the behavior needed by a java
service (could be web, swing client, or web
service) so that a client can connect and query
objects out of the persistence tier.
• Deployed with our POJOs to an EJB container.
• We’ll use OC4J: a local application server
embedded in JDeveloper that is fully EJB 3.0
compliant
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
26
Bill Lyons EJB 3.0
Hitachi Consulting
Examining
the
Hitachi
Consulting
Session Bean
Generated Source Code
@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);
}
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
27
Bill Lyons EJB 3.0
Hitachi Consulting
HitachiBuild
Consulting
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…
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
28
Bill Lyons EJB 3.0
Hitachi Consulting
Examine
the Generated Code for the
Hitachi Consulting
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();
}
}
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
29
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
30
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
It Consulting
works! …sort
of ;-(
• What does this mean?
com.rmoug.model.ExpertiseAreas@193c0cf
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
31
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
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
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
32
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
TopLink
CRUD query methods Match
Up Question:
SQL
SELECT
INSERT
UPDATE
DELETE
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
?
TopLink
removeEntity()
queryEntityNameFindAll()
persistEntity()
mergeEntity()
33
Bill Lyons EJB 3.0
Hitachi Consulting
TopLink
CRUD
query
operations
Hitachi Consulting
Match Up Answer
SQL
SELECT
INSERT
UPDATE
DELETE
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
TopLink
removeEntity()
queryEntityNameFindAll()
persistEntity()
mergeEntity()
34
Bill Lyons EJB 3.0
Hitachi Consulting
TopLink
CRUD query
Hitachi
Consulting
operations:
ANSWER
SQL
SELECT
INSERT
UPDATE
DELETE
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
TopLink
queryEntityNameFindAll()
persistEntity()
mergeEntity()
removeEntityName()
35
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Select All data query
Selecting data using the queryEntityNameFindAll() method:
// Selects and prints out all rows:
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
We’ll Build a named query with a where clause later in the session…
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
36
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Inserting
Data
using the
persistEntity() method
// Inserts a row into the products table:
Products p1 = new Products();
p1.setName( “IOUG Washing Machine" );
p1.setDescription( "Having fun at IOUG" );
sessionEJB.persistEntity( p1 );
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
37
Bill Lyons EJB 3.0
Hitachi Consulting
HitachiUpdating
Consulting
data
using the
mergeEntity() method:
//
//
//
//
Perform an update:
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 );
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
38
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Delete data
using the
removeEntityName() method
// delete a Product from the List
Products p3 = new Products();
p3 = productsList.get( productsList.size() - 1 );
sessionEJB.removeProducts( p3 );
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
39
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
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
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
40
Bill Lyons EJB 3.0
Hitachi Consulting
a row by primary Key:
HitachiFind
Consulting
Step 1. Create a Named Query in
Products.java EntityBean
Creating 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.
Code that we
added
@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")
})
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
41
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Find
a row by
primary Key:
Step 2. Expose the new method
• Expose the findByProdId() method in the
Session Bean:
Right click on the
SessionEJBBean.java file and
then Select Edit Session
Façade…
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
42
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
Find
a row by
primary Key:
Step 3.
• Expose/Enable methods in the Session
Façade wizard:
Check the newly created
Products.findByProdId method.
This will make it available to
clients at runtime.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
43
Bill Lyons EJB 3.0
Hitachi Consulting
Method
generated for our new query
Hitachi Consulting
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 required prodId parameter to the value passed to this 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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
44
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
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()
);
}
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
45
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
ConsultingTransactions
Database
• What if I need a database transaction?
• When we accepted the default settings, it set up the Entity
objects to use Container Managed Persistence (CMP) and
optimistic locking for row data.
• This means that persistence operations will commit and
rollback work automatically.
• To get finer grained control you’ll need to review TopLink’s
transaction documentation in the Developer’s Guide.
• TopLink provides support for commit, rollback and twophase commit as expected.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
46
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Handling
Schema Design Changes
• Have a look at Offline Database Object
Generation/Reconciliation.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
47
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi
Consulting
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.
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
48
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Recommendations
• Use a persistence framework
• Have a data architect role on project that
works closely with the database administrator
responsible for the 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
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
49
Bill Lyons EJB 3.0
Hitachi Consulting
Hitachi Consulting
Helpful information
• EJB 3.0 TopLink Presentation Materials and Source Code
–
http://www.4shared.com/dir/5686418/9daee38b/RMOUG_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/DbChangeNo
tification/index.htm
• Spy Mid-Tier SQL to Database
– www.p6spy.com/
Inspiring
Your Next Success!
IOUG
Collaborate
‘08
®
50
Bill Lyons EJB 3.0
Hitachi Consulting
EJB 3.0 Java Persistence API
(JPA) with Oracle TopLink
Bill Lyons
Systems Architect
Hitachi Consulting
[email protected]
IOUG Collaborate ‘08