P. 1
4 Spring JPA Hibernate

4 Spring JPA Hibernate

|Views: 858|Likes:
Published by Minh Hai

More info:

Published by: Minh Hai on Aug 08, 2011
Copyright:Attribution Non-commercial


Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less





Spring + JPA + Hibernate



– JdbcTemplate – Hibernate JPA Spring
– Spring 2.x – JPA features

J2EE 1.4 Reality Check
Common Technology Stack – Spring (IoC) – Hibernate (Light-Weight Persistence) – Stateless EJB

JPA – Java Persistence API
JEE 5 / EJB3 Persistence Provides an ORM framework similar to Hibernate / JDO

Good Bye Entity Beans!!!

Spring Persistence Spring JDBC Spring Hibernate Spring JPA Spring iBatis 5 .

just tedious redundant.Issues with SQL SQL isn’t hard.. repeating code 6 ....

Focus DRY .Don’t Repeat Yourself Testable Concise Stop forcing all the checked exceptions 7 .

JDBCTemplate 8 .

Remaining Challenges? Testability.. – in-memory DB – HSQLDB vs. Oracle – The code is tied to a dialect! 9 ..

ORM .The Good Object Relational Mapping – Makes the Dialect configurable! – Testable – Used to increase time to market 10 .

– Lazy vs...The Good Issues / Warnings – Forces compromises in the relational datastore • • • primary keys triggers .ORM . Eager decisions – As the project grows the ORM pain grows 11 .

However it wasn’t a standard.... 12 . Hibernate Hibernate was the clear winner in the ORM race.And the winner is....

Spring Provides Hibernate Support 13 .

Spring Hibernate Template 14 .

Spring HibernateDaoSupport 15 .

Spring HibernateTransactionManager 16 .

Hibernate Consequences XML focused – at least at the time Not standard Alternatives: JDO – Focused on ubiquitous data access instead of relational 17 .

JPA 18 .

JPA Benefits Standards-Based No Descriptors necessary Annotated POJOs Detached Object Support – Reduce Overhead of DTO / VO Improve Testability .

Specification Packaging Entities Entity Operations Queries Metadata Life-cycle Model Callbacks .JPA .

<persistence-unit name="unit1" transaction-type="RESOURCE_LOCAL"> <provider>org.username" value="sa"/> <property name="hibernate.jdbcDriver"/> <property name="hibernate.url" value="jdbc:hsqldb:hsql://localhost:1234/employee"/> <property name="hibernate.ejb.autodetection" value="class"/> <property name="hibernate.HibernatePersistence</provider> <properties> <property name="hibernate.connection.ejb.connection.hbm2ddl.auto" value="create"/> <property name="hibernate.hsqldb.connection.driver_class" value="org.Persistence.hibernate.password" value=""/> </properties> </persistence-unit> </persistence> .connection.xml In the classpath under the META-INF directory.

Entity Requirements Must be annotated an Entity Public or Protected No-arg Constructor Must not be final – No final methods or variables Must be Serializable to be detached and serialized… .

Persistent Fields Primitives and Strings – automatically become columns in the database Object fields – must be mapped by joins and foreign key relationships Fields marked transient are not persisted Fields annotated @Transient are not persisted .

mappedBy="customer") Collection orders = new Vector(). @OneToMany(targetEntity=com. @ManyToMany(mappedBy="customers") Set<DeliveryService> serviceOptions = new HashSet().Customer Entity (from spec) @Entity(access=FIELD) public class Customer { @Id(generate=AUTO) Long id.class. public Customer() {} public Collection getOrders() { return orders. } public Set<DeliveryService> getServiceOptions() { .Order. @ManyToOne Address address. @Version protected int version. @Basic String description.acme.

POGO for Exceptional Terseness 25 .

– @PersistenceContext EntityManagerFactory – Creates an EntityManager – @PersistenceUnit .JPA Persistence Interfaces EntityManager – Interface to interact with persistence context.

void remove(Object entity).Entity Manager void persist(Object entity). void flush(). <T> T merge(T entity). EntityTransaction getTransaction(). void refresh(Object entity). void close(). Object primaryKey). boolean isOpen(). <T> T find(Class<T> entityClass. . boolean contains(Object entity). <T> T getReference(Class<T> entityClass. Object primaryKey).

Acquiring a Manager Injection in Stateless Bean @PersistenceContext public EntityManager em. Persistence.createEntityManager(). From Java Application EntityManagerFactory emf = ("unit1").createEntityManagerFactory EntityManager em = emf. OR @PersistenceContext(unitName="order") EntityManager em. .

JPA Query JPQL Example: public List<Session> findSessionByCatagory(String name) { return entityManager.name=:name") .setParameter("name". } .createQuery( "from Session session where session. name).catagory.getResultList().

JPA Challenges 2 Programming Models – Standalone application – container managed Bootstrapping 30 .

x Spring 2 introduces JPA support .Spring 2.

JPA Relationship Persistence.Spring .xml Persistence EntityManager Factory JpaTemplate Query persist() EntityManager find() merge() delete() EntityManagerFactoryBean Transaction 4 .

jpa package – Contains subset of the JPA container JpaDaoSupport – similar to other DAO support classes like HibernateDaoSupport LocalEntityManagerFactoryBean – Provides resource bootstrapping for non-jndi lookups .orm.springframework.Spring 2 JPA Support org.

Spring / JPA Approaches JpaDaoSupport Approach – Not preferred approach – Similar to HibernateDaoSupport – Requires Spring Configuration of the EntityManager Pure JPA Approach – Preferred approach – No spring references necessary in the code • with the exception of @Transactional 34 .

Approach 1: JpaDaoSupport Provides great support with JpaDaoSupport with JpaTemplate to simplify common code – very familiar to hibernate developers Consequences: – import of spring framework • not exactly POJO – requires spring configuration of entitymanager .

import java.name=?1 and session. Session session where session.jpa. } 36 .find("select distinct s from Speaker s.nfjs.speaker.id = s.JpaDaoSupport Example: SpeakerDaoImpl package com.springframework.catagory.jpa.util.List.JpaDaoSupport. import org.id).id". } public List<Speaker> findSpeakerByCatagory(String catagory) { return getJpaTemplate().support. public class SpeakerDAOImpl extends JpaDaoSupport implements SpeakerDAO { public Speaker findSpeaker(long id) { return getJpaTemplate().find(Speaker.catagory).class.orm.

domain.SpeakerDAOImpl"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <bean id="transactionManager" class="org.jpa.LocalEntityManagerFactoryBean“ > <property name="persistenceUnitName" value="unit1"/> </bean> <bean id="speakerDao" class="com.Spring JpaDaoSupport Configuration <bean id="entityManagerFactory" class="org.jpa.codementor.orm.springframework.springframework.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory“ / > </bean> <tx:annotation-driven transactionManager=“transactionManager” /> .orm.

jpa.Approach 2: Spring / Pure JPA Configuration Leverage the persistence.jpa.orm.domain.jpa.orm.springframework.PersistenceAnnotationBeanPostProces sor“ /> .codementor.LocalEntityManagerFactoryBean" > <property name="persistenceUnitName" value="unit1"/> </bean> DAO with no Spring references.ConferenceDAOImpl"/> Spring configuration which injects JPA annotationed EntityManager <bean class="org. however it contains @PersistenceContext annotated EntityManager <bean id="conferenceDao" class="com.springframework.support.xml in classpath:/META-INF <bean id="entityManagerFactory" class="org.

import javax. import org. import java.. public void setEntityManager(EntityManager entityManager) { this.nfjs.transaction. 39 .persistence.PersistenceContext.. import javax.Transactional.persistence.EntityManager.entityManager = entityManager.jpa.List.util.annotation.Pure JPA Code Example: ConferenceDaoImpl package com. public class ConferenceDAOImpl implements ConferenceDAO { @PersistenceContext private EntityManager entityManager. } – .springframework.

Pure JPA Spring Configuration <bean id="entityManagerFactory" class="org.jpa.jpa.LocalEntityManagerFactoryBean" > <property name="persistenceUnitName" value="nfjs"/> </bean> <bean id="conferenceDao" class="com.nfjs.springframework.support.orm.springframework.PersistenceAnnotationBeanPostProcessor" /> </beans> 40 .ConferenceDAOImpl"/> <bean class="org.jpa.orm.

hibernate.No PU No Problem The LocalContainerEntityManagerFactoryBean can be configured with all Persistent Unit information.orm.orm.dialect.jpa. <bean id="entityManagerFactory" class="org.vendor.springframework.springframework.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.HibernateJpaVendorAdapter"> <property name="showSql" value="true"/> <property name="generateDdl" value="true"/> <property name="databasePlatform" value="org.HSQLDialect"/> </bean> </property> </bean> .

REQUIRES_NEW) Public void doSomething() { ** transaction manger bean id must be transactionManger or configured with the xml configuration above. propagation = Propagation.Transactions XML Configuration <tx:annotation-driven /> Annotation @Transactional(readOnly = false. .

Scoping the Transactional Transactions are best at the level of a service class 43 .

name. 'CodeMentor')"). public void setSpeakerDao(SpeakerDAO speakerDao) { this. 'Ken'.Test JPA with Spring public class SpeakerDAOTest extends AbstractJpaTests { private SpeakerDAO speakerDao.speakerDao = speakerDao. } protected String[] getConfigLocations() { return new String[] {"classpath:/jpaContext. company) values (1.xml"}.execute( "insert into speaker (id. . } protected void onSetUpInTransaction() throws Exception { jdbcTemplate.

AbstractJpaTests Benefits getConfigLocations () – Separates test from production configuration – Allows for multiple configurations Injected Dependencies By Type – field references Every Test – Starts a Transactions – Rolls back Transaction Leverage jdbcTemplate for SQL checks .

Demo JPA with Spring .

org/ http://java.html .springframework.com/developer/technicalArticles/J2EE/jpa http://www.sun.References http://www.hibernate.org/hib_docs/annotations/ reference/en/html/entity.

Questions kensipe@codementor.net twitter: @kensipe .

You're Reading a Free Preview

/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->