This is to show how to setup JPA with Spring, using Hibernate and EclipseLink respectively. We are not talking about ORM, which is a separate topic. So I am going to use a simple POJO.
First, let's create a simple class:
package my.test;
public class Book
{
public int bookId;
public String bookName;
public String category;
}
Here I don't have getter/setter, since I will have field access later. But in the real world, you may have to use getter/setter if there is any lazy loading.
Then we create a DAO interface:
package my.test;
public interface BookDao
{
void save(Book book);
Book update(Book book);
void delete(Book book);
Book findById(int bookId);
}
Next, we are going to create a JPA entity-mapping file. Alternatively, we could use annotations in Book class. but I don't like this approach since in my environment, the domain models are relatively very large in size. I don't want "pollution" of any underlying implementations. So here is the entity mapping:
<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<entity class="my.test.Book" access="FIELD">
<table name="mytest_book"/>
<attributes>
<id name="bookId"><column name="book_id"/></id>
<basic name="bookName"><column name="book_name"/></basic>
<basic name="category"><column name="category"/></basic>
</attributes>
</entity>
</entity-mappings>
I saved this file as book.jpa.xml under package my.test.dao.jpa. Note in JPA, usually we use an orm.xml for entity mapping under META-INF directory. But spring saves me a headache, I can put them anywhere I want. For more info, check: http://wiki.eclipse.org/EclipseLink/Examples/JPA/EclipseLink-ORM.XML
Now let's create the DAO implementation, using spring.
package my.test.dao.jpa;
import my.test.Book;
import my.test.BookDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class BookDaoJpaImpl implements BookDao
{
@PersistenceContext
private EntityManager em;
public void save(Book book)
{
this.em.persist(book);
}
public Book update(Book book)
{
return this.em.merge(book);
}
public void delete(Book book)
{
this.em.remove(book);
}
public Book findById(int bookId)
{
return this.em.find(Book.class, bookId);
}
}
Note that EntityManager is in general not thread safe, but this instance injected by Spring is thread safe since it will create a new transactional entity manager for each thread. Another note is that the annotation usage here is within the DAO implementation, it's not "polluting" my domain model.
Now we need to create the standard persistence.xml.
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<mapping-file>my/test/dao/jpa/book.jpa.xml</mapping-file>
</persistence-unit>
</persistence>
I saved this file in persistence.xml under package my.dao.jpa. In standard JPA, this file has to be under META-INF in classpath. But Spring saves me another headache. I can put it anywhere I want.
Now, we need to create the spring xml to stitch everything together.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="bookDao" class="my.test.dao.jpa.BookDaoJpaImpl"/>
<!-- bean post-processor for JPA annotations -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<aop:config>
<aop:pointcut id="bookDaoMethods" expression="execution(* my.test.dao.jpa.BookDaoJpaImpl.*(..))"/>
<aop:advisor advice-ref="bookDaoTxAdvice" pointcut-ref="bookDaoMethods"/>
</aop:config>
<tx:advice id="bookDaoTxAdvice" transaction-manager="myTxManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf"/>
</bean>
<bean id="mydataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxIdle" value="10"/>
<property name="maxActive" value="100"/>
<property name="maxWait" value="10000"/>
<property name="testOnBorrow" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="1200000"/>
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<property name="numTestsPerEvictionRun" value="5"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
<context:property-placeholder location="classpath:my/test/dao/jpa/jdbc.properties"/>
</beans>
Here we define the DAO class, the transaction manager, and the datasource. The jdbc.properties is like this:
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@*****
jdbc.username=
jdbc.password=
So far we haven't define the EntityManagerFactory yet, since we still stays in JPA.
If we use Hibernate as the JPA implementation, the EntityManagerFactory is like this:
<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myPersistenceUnit"/>
<property name="dataSource" ref="mydataSource"/>
<property name="persistenceXmlLocation" value="classpath:my/test/dao/jpa/persistence.xml"/>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- <property name="showSql" value="true"/> -->
<property name="generateDdl" value="false"/>
<property name="database" value="ORACLE"/>
<property name="databasePlatform" value="org.hibernate.dialect.OracleDialect"/>
</bean>
</property>
</bean>
The only thing specific to Hibernate is the jpaVendorAdapter entry. Also note here we specify the persistence.xml location. For more info on load time weaver, check: http://static.springsource.org/spring/docs/2.5.6/reference/orm.html#orm-jpa-setup-lcemfb and
http://www.eclipse.org/aspectj/doc/released/devguide/ltw.html
If we use EclipseLink, then the above bean becomes:
<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myPersistenceUnit"/>
<property name="dataSource" ref="mydataSource"/>
<property name="persistenceXmlLocation" value="classpath:my/test/dao/jpa/persistence.xml"/>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="generateDdl" value="false"/>
<property name="database" value="ORACLE"/>
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform"/>
</bean>
</property>
</bean>
For spring: we need to following jars: spring jars and commons-logging. We also need aspectjweaver.jar and aopalliance.jar
For hibernate: we need hibernate jar, the jars in the required directory, and the jar in the jpa directory.
For eclipselink: we need eclipselink jar and standard persistence 2.0 jar.
and don't forget jdbc driver jar, I am just using oracle. I am also using commons dbcp and pool jars.
If you are using eclipselink, don't forget to use -javaagent: <spring instrument jar>. Hiberate doesn't need this switch.
And for jdbc/orm, don't forget the nice handy small tool: p6spy. It could print out full SQL statements without ? marks.
Here are some references:
Hibernate: http://www.hibernate.org/
EclipseLink: http://www.eclipse.org/eclipselink/
JPA: http://jcp.org/en/jsr/detail?id=317
P6spy: http://sourceforge.net/projects/p6spy/
SQLProfiler: http://sourceforge.net/projects/sqlprofiler/
分享到:
相关推荐
Spring的核心模块包括`spring-context`和`spring-jpa`,EclipseLink作为JPA实现,其依赖为`javax.persistence`和`org.eclipse.persistence`。Maven的配置通常如下: ```xml <groupId>org.springframework ...
JPA支持各种持久化提供者,如Hibernate,EclipseLink等。 Hibernate是JPA的一个实现,它是一个强大的ORM框架,提供了更丰富的功能和更好的性能优化。Hibernate不仅支持JPA规范,还提供了一套自己的API,包括 ...
它可以与各种JPA供应商(如Hibernate、EclipseLink等)配合使用,提供事务管理、懒加载、查询构造等功能。 最后,**Hibernate**是JPA的一个流行实现,它提供了一套强大的ORM解决方案。Hibernate不仅实现了JPA规范,...
Spring Data JPA是Spring框架的一个模块,它简化了在Java应用程序中使用JPA(Java Persistence API)的工作。...同时,这种方式也适用于其他JPA提供商,如OpenJPA或EclipseLink,只需更换相应的配置即可。
由于压缩包文件名称为"Spring_JPA_EclipseLink",我们可以推测这个压缩包可能包含了使用Spring、JPA(可能包括Hibernate和EclipseLink)的示例项目源代码,可能包含以下文件结构: - src/main/java:存放Java源代码...
SpringDataJPA能够与各种JPA供应商(如Hibernate、EclipseLink等)集成,减少了编写持久化层代码的工作量。 **JdbcTemplate**:JdbcTemplate是Spring提供的一个简单但强大的JDBC抽象层,它降低了直接使用JDBC的复杂...
随着JPA标准的推广和被广泛采用,越来越多的厂商和框架开始支持JPA,其中包括Spring Framework、OpenJPA、EclipseLink(原TopLink)等。这种广泛的采纳使得JPA成为了一个重要的行业标准,为开发者提供了丰富的资源和...
它支持JPA(Java Persistence API)规范,允许开发者使用ORM(对象关系映射)框架如Hibernate、EclipseLink等。通过简单的注解,我们可以轻松地实现CRUD(创建、读取、更新、删除)操作,而无需编写大量重复的SQL...
Spring JPA通过使用Hibernate或EclipseLink等JPA实现,进一步增强了其功能。 1. **Spring JPA操作数据库:** Spring JPA允许我们使用注解来定义实体类,这些类对应于数据库中的表。例如,`@Entity`表示这是一个...
在Spring中,我们可以使用JPA的实现,如Hibernate或EclipseLink,来管理数据库操作。定义一个`EntityManager` bean并配置数据源,然后在需要的地方注入`EntityManager`,就可以进行CRUD操作。 ```xml <!-- Spring ...
Spring Data JPA遵循JPA规范,这意味着它可以与其他JPA提供商(如Hibernate、EclipseLink等)无缝集成。开发者可以选择最适合项目需求的JPA实现。 七、分页和排序 Spring Data JPA提供了PagingAndSortingRepository...
Spring 提供了多种数据访问集成选项,如 JDBC、Hibernate、MyBatis 等,而 JPA 作为标准的 ORM 解决方案,通过统一的 API 能够支持多种 ORM 实现,如 Hibernate、EclipseLink 等。Spring 整合 JPA 可以简化数据库...
JPA 2.0 是Java的一个标准,定义了ORM规范,使得不同的ORM实现(如Hibernate、EclipseLink等)可以共享一套API。它引入了更多的注解,比如@ManyToOne、@OneToMany、@OneToOne、@JoinColumn等,以支持各种关系映射。...
Spring Data JPA 是 Spring 框架的一个模块,主要目的是为了简化数据库访问,并且提供一个统一的抽象层,让开发者能够方便地使用各种持久化技术,如 Hibernate、EclipseLink 等 JPA 实现。Spring Data JPA 提供了对 ...
Spring Data JPA是Spring框架的一个重要模块,专为简化Java持久层编程而设计,它...在实际项目中,开发者通常会将这个jar包与相应的JPA实现(如Hibernate、EclipseLink等)一起引入,以构建高效、简洁的持久层架构。
Spring Data JPA是基于ORM(Object-Relational Mapping)框架(如Hibernate、EclipseLink)构建的,它为开发者提供了与数据库交互的一致性接口。通过定义Repository接口,Spring Data JPA可以自动实现基本的CRUD操作,...
JPA是Java EE的一部分,为ORM提供了一种标准接口,使得开发者可以选择不同的ORM实现,如Hibernate、EclipseLink等。 JPA(Java Persistence API)是Java平台上的一个规范,定义了统一的API来处理对象持久化。在...
Spring框架提供了对JPA的支持,允许开发者选择不同的实现,如Hibernate或EclipseLink。JPA允许我们声明性地定义实体类和它们的关系,简化了数据访问层的代码。 整合这些技术,我们可以创建一个高效、模块化的应用...
在持久层,JPA的配置会涉及persistence.xml文件,这里定义了实体类、数据源、JPA供应商(如Hibernate或EclipseLink)等信息。实体类是与数据库表相对应的Java类,通过注解如@Entity、@Table、@Id等来描述其数据库...
它提供了一个统一的API来访问各种持久化技术,如Hibernate、EclipseLink等。通过SpringData JPA,你可以利用注解驱动的方法来执行CRUD操作,减少了大量编写DAO层代码的工作。此外,它还支持动态查询,使得在不编写...