Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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