给同事做的Spring data JPA培训的教程及例子

项目中用到了 Spring data jpa 这个框架来实现持久层,但 jpa本身来说只是一个标准接口,所以还是用到了Hibernate JPA 的实现。spring data jpa 用起来非常简单,主要从下面四个方面来讲解 Spring data jpa 的使用.

1. 入门,使用配置 persistence.xml 文件并结合spring bean 管理 entityManagerFactory 方式测试JPA
2. 基于spirng data jpa 实现增删改查
3. 基于spring data jpa 实现自定义查询
4. 如果spring data jpa 不能完成的sql 采用 自定义扩展类完成。
5. 在实际项目中去掉 persistence.xml 文件,完全采用配置 entityManagerFactory  来管理.

入门
一个典型的 persistence.xml  配置文件如下
程序代码 程序代码

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="Simple" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.training.jpa.domain.UserInfo</class>
        <class>com.training.jpa.domain.AccountInfo</class>
        <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

请注意这个文件的位置,不是 webcontent目录下的 META-INF, 而是 classpath  目录下的META-INF目录下,一般来说也就是src目录下自己创建这个一个文件夹,然后把persistence.xml 放进去, 当然还需要相应的SPRING 配置
程序代码 程序代码

<tx:annotation-driven transaction-manager="transactionManager"/>

    <jpa:repositories base-package="com.training.jpa.dao"  repository-impl-postfix="Impl" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="generateDdl" value="false"/>
                    <property name="showSql" value="true"/>
                </bean>
            </property>
            
            <!-- <property name="persistenceUnitName" value="Simple" /> -->
    </bean>


配置了transactionManager, entityManagerFactory 以及 JPA 采用 hibernate 的实现.

2. 基于spirng data jpa 实现增删改查
如果是单表的增删改查,很简单,直接调用 repository 的 save,delete,findAll,findOne 等方法。

3. 基于spring data jpa 实现自定义查询
这种情况下,需要在 repository  里面自定义方法,以及写 查询语句,类似如下:
程序代码 程序代码



public interface UserDao extends CrudRepository<AccountInfo, Long> {
    
    public Page<AccountInfo> findByBalanceGreaterThan(Integer balance,Pageable pageable);
        
    @Query("Select account FROM AccountInfo account INNER JOIN FETCH account.userInfo user Where user.username like ? ")
    public List<AccountInfo> findAccountsByName(String name);
    
}

这样,在 service 中就能直接调用这个方法.

4. 如果spring data jpa 不能完成的sql 采用 自定义扩展类完成。
如果直接在 repository 中无法直接完成你的sql ,你可以自己扩展一个接口,然后,实现这个接口。比如:
程序代码 程序代码

自己扩展的接口

public interface UserDaoCustomize {        
    public List<UserInfo> getAllUsers();
}
实现这个接口

public class UserDaoImpl implements UserDaoCustomize{        
    @PersistenceContext(unitName = "JPA")
    private EntityManager em;

    public List<UserInfo> getAllUsers() {
        List<UserInfo> users = em.createQuery("Select user FROM UserInfo user").getResultList();
        return users;
    }

}
再来看 repository 也要继承自己实现的接口

public interface UserDao extends CrudRepository<AccountInfo, Long>, UserDaoCustomize {
    
    public Page<AccountInfo> findByBalanceGreaterThan(Integer balance,Pageable pageable);
        
    @Query("Select account FROM AccountInfo account INNER JOIN FETCH account.userInfo user Where user.username like ? ")
    public List<AccountInfo> findAccountsByName(String name);
    
}

这里面的重点就是实现类的写法,以及实现类的后缀是 Impl, 这点很重要,因为在配置文件中这样配置的,同时也是  spring data jpa 的默认配置. 另外实现类的名称要注意,我发现一般按照  repository的名字+Impl 一般没问题.

5. 在实际项目中去掉 persistence.xml 文件,完全采用配置 entityManagerFactory  来管理.
如果数据源都配置在persistence.xml  中是很郁闷的事,所以一般会采用 spring 来管理 datasource bean. 所以在实际项目中,可以不要  persistence.xml 配置文件,但需要在 spring 配置文件中这样配置:
程序代码 程序代码

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="persistenceUnitName" value="spring-jpa"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false" />
                <property name="showSql" value="false" />                
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
                <property name="database" value="MYSQL" />
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.yihaomen.entity</value>
            </list>
        </property>
    </bean>

    <jpa:repositories base-package="com.yihaomen.repository"
        entity-manager-factory-ref="entityManagerFactory" repository-impl-postfix="Impl"></jpa:repositories>    


这样全部由spring 注入.

参考: http://projects.spring.io/spring-data-jpa/, 下载spring-data-jpa.jar和spring-data-commons.jar包, Hibernate 与 Spring 所需要的包可以在官网下载.

测试源代码下载(里面包含了4个测试工程):

下载文件 spring data jpa hibernate sample free download


除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
[本日志由 轻舞肥羊 于 2014-04-10 09:16 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: spring data jpa
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.