2007 JavaOne SM Conference | Session BOF-4181 | BOF-4181 Migrating a Spring/Hibernate Application to...

Post on 30-Jan-2016

221 views 0 download

Transcript of 2007 JavaOne SM Conference | Session BOF-4181 | BOF-4181 Migrating a Spring/Hibernate Application to...

2007 JavaOneSM Conference | Session BOF-4181 |

BOF-4181

Migrating a Spring/Hibernate Application to Java Platform, Enterprise Edition (Java EE) 5

Adrian Görler &Robin de Silva Jayasinghe

SAP AGwww.sap.com

YOUR LOGOHERE

2007 JavaOneSM Conference | Session BOF-4181 | 2

Goal of our BOF-Session

Learn about possible migration paths from Spring/Hibernate to Java EE 5

2007 JavaOneSM Conference | Session BOF-4181 | 3

Agenda

IntroductionHibernate vs. JPAMigrating PersistenceSpring Beans vs. EJB 3Migrating Business Logic

2007 JavaOneSM Conference | Session BOF-4181 | 4

J2EE 1.4

• Widely adopted standard environment for Enterprise Java

• Many implementations by different vendors

• But:• Complex to use & implement• Heavy-weight persistence model (EJB CMP)• Invasive• Boilerplate coding

2007 JavaOneSM Conference | Session BOF-4181 | 5

Rise of Spring and Hibernate

• Spring• Application framework• Dependency Injection• AOP support• Non-invasiveness as a basic principle• O/R persistence support for various frameworks

• Hibernate• POJO based O/R persistence

• Spring and Hibernate have become a popular alternative to J2EE development.

2007 JavaOneSM Conference | Session BOF-4181 | 6

Java EE 5

• Major goal: Ease of development

• Adopted patterns from the community:• POJO based persistence (JPA 1.0)• IoC (Resource Injection)• Limited AOP capability (EJB Interceptors)

• Reduced configuration effort by enhanced defaulting.

• Emphasizes on configuration via annotations• XML still possible

2007 JavaOneSM Conference | Session BOF-4181 | 7

Motivation for a Migration

• Acceptance of Java EE 5 in the community• Support of Java EE 5 by major platform vendors• Fully exploit the features of your Java EE 5 server• Adopt the new JPA standard• Have a portable persistence layer• Independence off 3rd party libraries

2007 JavaOneSM Conference | Session BOF-4181 | 8

Agenda

IntroductionHibernate vs. JPAMigrating PersistenceSpring Beans vs. EJB 3Migration Business Logic

2007 JavaOneSM Conference | Session BOF-4181 | 9

Hibernate vs. Java Persistence API

• JPA 1.0• Part of Java EE 5• Basic but complete persistence solution• Integrates very smoothly with EJB 3• Pluggable persistence provider

• Hibernate 3• Open source• Very capable, solid and mature

2007 JavaOneSM Conference | Session BOF-4181 | 10

Roots of Java Persistence APIFeatures and Restrictions

Hibernate

JDO

Toplink

JPA

2007 JavaOneSM Conference | Session BOF-4181 | 11

Hibernate vs. JPA: Mapping

• Java Persistence API• standardized object-relational mapping• common ground (incl. relationships, inheritance, ...)• annotations or XML (orm.xml)

• Hibernate • XML (*.hbm.xml)• very powerful and flexible

• Hibernate Annotations• bridge between Hibernate and JPA• makes Hibernate understand JPA annotations• Hibernate-specific extensions

2007 JavaOneSM Conference | Session BOF-4181 | 12

Hibernate vs. JPA: API

persistgetReferencerefreshfindno equivalent no equivalentmerge

saveload(Class, id) load (Object, id) getsaveOrUpdate/update evictmerge

JPAHibernate

2007 JavaOneSM Conference | Session BOF-4181 | 13

Hibernate vs. JPA: Queries

• Common Features• very similar SQL-like query languages• Named, dynamic and native (SQL) queries

• Java Persistence Query Language (JPQL)• Less prone to portability issues

• Hibernate Query Language (HQL)• Fully exploits database• Bridge: Hibernate understands both HQL and JPQL

• Hibernate beyond JPA: API• Query.iterate, Scrollable iteration, Criteria, ...

2007 JavaOneSM Conference | Session BOF-4181 | 14

Hibernate to JPA: Migration Options

• JPA with default Persistence Provider• Hardly any Hibernate-specific Mapping• Uses only a subset of the API covered by JPA

• JPA with Hibernate EM as Persistence Provider• Hibernate-specific Mapping• Uses only a subset of the API covered by JPA• partly sacrifices standard-adoption• depends on different third-party libs

2007 JavaOneSM Conference | Session BOF-4181 | 15

Agenda

IntroductionHibernate vs. JPAMigrating PersistenceSpring Beans vs. EJB 3Migrating Business Logic

2007 JavaOneSM Conference | Session BOF-4181 | 16

Persistent C

lassesP

ersistent Classes

DBDB

UIUISpringSpring

LocalSession

FactoryBean

LocalSession

FactoryBean

TxHibernateTxManagerHibernate

TxManager

SpringBeansSpringBeans

Business LayerBusiness Layer

DAO LayerDAO Layer

HibernateSessionHibernateSession

*.hmb.xmlSpring

Hibernate

Java EE

Initial Application

2007 JavaOneSM Conference | Session BOF-4181 | 17

Migration Step 1: Mapping: Hibernate/Annotations

• Mapping: Hibernate -> JPA• Hibernate XML -> JPA Annotations

• Data Access API: Hibernate• Resources/Transactions : Spring• Integration Technology: Spring

2007 JavaOneSM Conference | Session BOF-4181 | 18

Hibernate/Annotations -Convert the model to JPA

• Evaluate applicability: Can mappings be expressed using JPA annotations?

• Declare mapping of entities using JPA annotations: @Entitypublic class Customer { @Id int id; String name;}

• Remove *.hbm.xml files

2007 JavaOneSM Conference | Session BOF-4181 | 19

Hibernate/Annotations -Configure SessionFactory for Annotations

application context xml:<bean id="efsSessionFactory“

class="AnnotationSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="annotatedClasses"> <list> <value>com.sap...Organization</value> ... </list> </property> <property name="annotatedPackages"> <list> <value>com.sap.efs.model</value> </list> </property> ...</bean>

2007 JavaOneSM Conference | Session BOF-4181 | 20

Entities

Entities

DBDB

UIUISpringSpring

AnnotationsSession

FactoryBean

AnnotationsSession

FactoryBean

TxHibernateTxManagerHibernate

TxManager

SpringBeansSpringBeans

Business LayerBusiness Layer

DAO LayerDAO Layer

HibernateSessionHibernateSession

JPAAnnotations

JPAAnnotations

Spring

Hibernate

Java EE

Hibernate Annotations

2007 JavaOneSM Conference | Session BOF-4181 | 21

Migration Step 2: Data Access Layer: Spring/JPA

• Mapping: JPA• Data Access API: Hibernate -> JPA

• SessionFactory -> EntityManagerFactory• HibernateTransactionManager -> JpaTransactionManager• HibernateTemplate -> JPA

• Resources/Transactions : Spring• Integration Technology: Spring

2007 JavaOneSM Conference | Session BOF-4181 | 22

Spring/JPA -Convert the DAO Layer to JPA

Evaluate applicability: Can Hibernate API be replaced by JPA?

Use JPA annotations in your business logic: @PersistenceContext (unitName="EFSApplication")

EntityManager em;

...

Customer findCustomer(int id) {return em.find(Customer.class, id)}

2007 JavaOneSM Conference | Session BOF-4181 | 23

Spring/JPA - Declare the Persistence Unit

• persistence.xml:<persistence ... > <persistence-unit name="EFSApplication“ transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect“ value="org.hibernate.dialect.SAPDBDialect"/> </properties> </persistence-unit></persistence>

2007 JavaOneSM Conference | Session BOF-4181 | 24

Spring/JPA -Configuration Options

• LocalEntityManagerFactoryBean• Application perspective• EMF created using javax.persistence.Persistence• little control

• LocalContainerEntityManagerFactoryBean• JPA Container Perspective• EMF created using javax.persistence.spi.PersistenceProvider• full control

• EntityMangerFactory or EntityManager from JNDI

2007 JavaOneSM Conference | Session BOF-4181 | 25

Spring/JPA -Configure Spring for JPA

<bean id="entityManagerFactory"class="LocalContainerEntityManagerFactoryBean">

<property name="dataSource" ref="dataSource"/> <property name="persistenceUnitName“ value="EFSApplication"/>

...</bean>

<bean id="transactionManager“ class="JpaTransactionManager"> <property name="entityManagerFactory“ ref="entityManagerFactory" /></bean>

<bean class="PersistenceAnnotationBeanPostProcessor"/>

2007 JavaOneSM Conference | Session BOF-4181 | 26

Entities

Entities

DBDB

UIUISpringSpring

EntityManagerFactoryBean

EntityManagerFactoryBean

TxJpaTxManager

JpaTxManager

SpringBeansSpringBeans

Business LayerBusiness Layer

DAO LayerDAO Layer

EntityManagerEntityManager

JPAAnnotations

JPAAnnotations

Spring

Hibernate

Java EE

Spring & JPA

2007 JavaOneSM Conference | Session BOF-4181 | 27

Migration Step 3: Resources/Transactions

• Mapping: JPA• Data Access API: JPA• Resources/Transactions: Java EE/JTA

• Resource Creation: Spring -> Java EE• Resource Management: Spring -> Java EE• Transactions: Local -> JTA

• Integration Technology: Spring

2007 JavaOneSM Conference | Session BOF-4181 | 28

Spring/JPA –Bind/Lookup EntityManager in JNDI • web.xml: <persistence-context-ref>

<persistence-context-ref-name> em/EFS </persistence-context-ref-name> <persistence-unit-name> EFSApplication </persistence-unit-name></persistence-context-ref>

• application context xml: <bean

class="PersistenceAnnotationBeanPostProcessor"> <property name="persistenceContexts"> <map> <entry key="EFSApplication" value="em/EFS"/> </map> </property></bean>

2007 JavaOneSM Conference | Session BOF-4181 | 29

Spring/JPA - Switch Transaction Type to JTA

• persistence.xml:<persistence ... > <persistence-unit name="EFSApplication“ transaction-type="JTA">... </persistence-unit></persistence>

• application context xml: <bean id="transactionManager"

class="JtaTransactionManager"><property name="transactionManagerName">

<value>TransactionManager</value></property>

</bean>

2007 JavaOneSM Conference | Session BOF-4181 | 30

Entities

Entities

DBDB

UIUISpringSpring

Tx

SpringBeansSpringBeans

Business LayerBusiness Layer

DAO LayerDAO Layer

JPAAnnotations

JPAAnnotations

Java EEJava EE

JNDIJNDI

JTAJTA

EJB3EJB3

JPA ContainerJPA Container

EntityManagerEntityManagerJPAPostProcessor

JPAPostProcessor

JtaTxManager

JtaTxManager

Spring

Hibernate

Java EE

Backed by Java EE

2007 JavaOneSM Conference | Session BOF-4181 | 31

Agenda

IntroductionHibernate vs. JPAMigrating PersistenceSpring Beans vs. EJB 3Migrating Business Logic

2007 JavaOneSM Conference | Session BOF-4181 | 32

Spring vs. EJB 3

• Evaluate if migration-step is evaluable.

• Following areas have to be analyzed:• Declarative transactions• Aspect-oriented Programming (AOP)• Inversion of Control (IoC)

• If all is applicable: Remove the middleman! ;-)

2007 JavaOneSM Conference | Session BOF-4181 | 33

AOP Support

• EJB 3 Interceptors• Pointcut declaration with interceptor-binding

• Per class/method and default interceptors

• One Joinpoint definition (@AroundInvoke)

• Spring AOP• Flexible pointcut-expression language• Joinpoint-types

2007 JavaOneSM Conference | Session BOF-4181 | 34

Declarative Transactions

• EJB 3.0 CMT• JTA• Global transactions only

• Spring transactions-management-framework• Pluggable transaction-managers• Global & local transactions

2007 JavaOneSM Conference | Session BOF-4181 | 35

Inversion of Control

• EJB 3 Resource Injection• Defined injectable types and targets• Configuration via annotations (and XML)

• Spring IoC • Fully configurable Dependency Injection• Configuration is done via XML-configuartion

2007 JavaOneSM Conference | Session BOF-4181 | 36

Agenda

IntroductionHibernate vs. JPAMigrating PersistenceSpring Beans vs. EJB 3Migrating Business Logic

2007 JavaOneSM Conference | Session BOF-4181 | 37

Migration Step 4: Business Layer

• Mapping: JPA• Data Access API: JPA• Resources/Transactions: Java EE/JTA• Integration Technology: EJB 3

• pure Web Application -> EAR• Spring Beans -> EJB 3 Session Beans

2007 JavaOneSM Conference | Session BOF-4181 | 38

Spring Beans to EJB Session BeansPrerequisites

• Prerequisite• Java EE 5 compatible dependencies only• Beans don‘t depend on any Spring API• JPA-DAOs should use plain JPA

• Beans without Spring dependecies can be directly used as EJB 3 sessionbeans.

• Spring transaction-declaration has to be migrated to EJBs counterpart.

• @Transactional --> @Stateless(ful)

2007 JavaOneSM Conference | Session BOF-4181 | 39

Spring Beans to EJB Session BeansRepackaging

Web

Services

Data access

Entities (JPA)

web archive

web archive ejb archive

Web Services

Data access

Entities (JPA)

ear archive

Libraries

2007 JavaOneSM Conference | Session BOF-4181 | 40

Entities

Entities

DBDB

UIUIJava EEJava EE

JPAJPA

TxJTAJTA

EJB3EJB3

Business LayerBusiness Layer

DAO LayerDAO Layer

EntityManagerEntityManager

JPAAnnotations

JPAAnnotations

Spring

Hibernate

Java EE

Migration Result

2007 JavaOneSM Conference | Session BOF-4181 | 41

Conclusion

• Spring/Hibernate and Java EE 5 address same issues and have many commonalities.

• An application can be migrated in a controlled fashion with fully functional intermediate steps.

• Most work is done by adapting configuration and refactoring the data access layer.

Give it a try!

2007 JavaOneSM Conference | Session BOF-4181 | 42

For More Information

• Other sessions at JavaOne• TS-4902 - Java Persistence API: Best Practices and Tips• TS-4568 - Java Persistence API: Portability Do’s and Don’ts• TS-4721 - Implementing Java EE Applications, Using Enterprise

JavaBeans (EJB) 3 Technology: Real-World Tips, Tricks, and New Design Patterns

• TS-43350 - Harnessing the Power of Java Platform, Enterprise Edition (Java EE) Technology With Spring

• TS-4945 - Java Persistence 2.0

• Pro EJB 3: Java Persistence API

• Java Persistence Migration Guide

• Java Persistence with Hibernate

2007 JavaOneSM Conference | Session BOF-4181 | 43

Q&A