Spring 整合 JPA

1. JPA 簡介

JPA(JavaPersistenceAPI,Java 持久化 API),定義了對象-關係映射(ORM)以及實體 對象持久化的標準接口。  JPA 是 JSR-220(EJB3.0)規範的一部分,在 JSR-220 中規定實體對象(EntityBean)由 JPA 進行支持。  所以 JPA 不侷限於 EJB3.0,而是作爲 POJO 持久化的標準規範,可以脫離容器獨立運行, 開發和測試更加方便。


2. JPA 與 Hibernate 的關係
JPA 是一種規範,而 Hibernate 是它的一種實現。除了 Hibernate,還有 EclipseLink(曾經的 TopLink),OpenJPA等可供選擇,所以使用 JPA 的一個好處是,可以更換實現而不必改動太多 代碼。

注意:我們該項目使用的 JPA 標準,底層使用 Hibernate 實現。


3. Spring 整合 JPA 的步驟
3.1.加入 JPA座標
在 bos-dao 項目的 pom.xml 加入 JPA 座標
<dependency>

       <groupId>org.hibernate</groupId> 

        <artifactId>hibernate-entitymanager</artifactId> 

</dependency>

3.2 配置applicationContext.xml

<!-- Spring整合JPA -->

    <bean id="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

         <property name="dataSource" ref="dataSource"/>

        

         <!--

             配置JPA的實現            

          -->

         <property name="jpaVendorAdapter">

             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

                  <!-- hibernate屬性 -->

                  <!-- 是否顯示sql -->

                  <property name="showSql" value="true"/>

                  <!-- 生成建表語句 -->

                  <!--<property name="generateDdl" value="true"/> -->

                  <!-- 數據庫平臺:就是方言 -->

                  <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect"/>

             </bean>

         </property>

        

         <property name="packagesToScan">

             <array>

                  <value>com.itheima.bos.domain</value>

             </array>

         </property>

    </bean>

<!-- JPA事務管理器 -->

    <bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">

         <property name="entityManagerFactory" ref="entityManagerFactory"/>

    </bean>

   

4. 編寫Dao和實現

接口:

package com.itheima.bos.dao.base;

 

import com.itheima.bos.domain.base.Standard;

 

publicinterface StandardDao {

 

    publicvoid save(Standard standard);

}

 


實現:

package com.itheima.bos.dao.base.impl;

 

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.springframework.stereotype.Repository;

 

import com.itheima.bos.dao.base.StandardDao;

import com.itheima.bos.domain.base.Standard;

/**

 * Spring整合JPADao寫法

 * @author lenovo

 *

 */

@Repository

publicclass StandardDaoImpl implements StandardDao {

 

    //注入EntityManager

    @PersistenceContext   //先到Spring容器中查詢EntityManagerFactory,找到了就從EntityManagerFactory對象開啓EntityManager對象,然後把EntityManager對象賦值給em變量

    private EntityManager em;

   

    @Override

    publicvoid save(Standard standard) {

         em.persist(standard);

    }

 

}

 

5. 編寫測試類

package com.itheima.test;

 

import javax.annotation.Resource;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

import com.itheima.bos.dao.base.StandardDao;

import com.itheima.bos.domain.base.Standard;

 

@RunWith(SpringJUnit4ClassRunner.class) // 導入Spring環境

@ContextConfiguration("classpath:applicationContext.xml") // 加載applicationContext.xml配置文件

publicclass StandardDaoTest {

 

    //注入dao

    @Resource

    private StandardDao standardDao;

   

    @Test

    publicvoid testSave(){

         Standard standard = new Standard();

         standard.setName("10-20斤");

         standard.setMinWeight(10L);

         standard.setMaxWeight(20L);

         standard.setMinLength(1000L);

         standard.setMaxLength(2000L);

        

         standardDao.save(standard);

    }

}

 

 

這時運行測試方法, 報錯:

原因:目前的save方法執行的過程中沒有事務管理。

 

解決辦法:在save方法測試方法加入事務註解

    @Test

    @Transactional// 在測試方式裏面使用事務管理

    publicvoid testSave(){

         Standard standard = new Standard();

         standard.setName("10-20斤");

         standard.setMinWeight(10L);

         standard.setMaxWeight(20L);

         standard.setMinLength(1000L);

         standard.setMaxLength(2000L);

        

         standardDao.save(standard);

    }

 

注意:必須加上Rollback:

    @Test

    @Transactional// 在測試方式裏面使用事務管理,注意:@Transactional用在@Test方法裏面,事務會自動回滾的

    @Rollback(false) //   取消自動回滾

    publicvoid testSave(){

         Standard standard = new Standard();

         standard.setName("10-20斤");

         standard.setMinWeight(10L);

         standard.setMaxWeight(20L);

         standard.setMinLength(1000L);

         standard.setMaxLength(2000L);

        

         standardDao.save(standard);

    }












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章