JPA(Java Persistence API )也就是說,java存儲數據API,它提供的接口更方便的存儲數據,當然,經過一些復雜的,並需要使用查詢操作Java Persistence query language,個和sql基本一樣,僅僅是須要遵循還有一些語法規則。能夠參考http://download.oracle.com/javaee/5/tutorial/doc/bnbuf.html 。
在使用JPA時,比方你的MySql中有定義了一個Lesson表格,如今想對Lesson表格進行加入一個記錄,這時候你須要寫的代碼主要有兩個:
1、寫一個Lesson.java,就是一個pojo啦。一個簡單的java對象。里面包含了數據庫中Lesson表格的全部字段,這里見Lesson.java中的屬性名稱同數據庫的名稱保存一致便ok了。然后再User.java類定義前面加上@Entity這個annotation。這樣子相當標注了這個Lesson.java類將作為存儲時的一個實體來對待。
2、寫一個存儲接口,比方LessonServiceImpl.java。這個類里面須要有一個javax.persistence.EntityManager類的屬性,比方命名為em。這樣對應的數據操作就能夠通過這個em來實現,比方要加入一天記錄,僅僅須要調用em.persist。更新時em.merge,刪除時em.remove。JPA考慮到這些通常的應用因此設計了這些簡單的接口方便操作。以下是該類的部分代碼
@Transactional
public class LessonServiceImpl implements LessonService {
private EntityManager em;
@PersistenceContext
public void SetEntityManager(EntityManager em)
{
this.em = em;
}
public void remove(int id) {
// TODO Auto-generated method stub
Lesson lesson = em.find(Lesson.class, id);
if(lesson != null)
{
em.remove(lesson);
}
}
.............
當然須要注意到的是存儲的接口LessonServiceImpl.java在設計的時候一般是作為singleton的類型,因此一般是在類工廠里面將來。
並且通常LessonServiceImpl.java中的那個EntityManager對象是通過依賴注入的方式在類工廠中直接設置。比方以下的代碼spring factory中的樣例
................
<bean id="LessonService" class="quickstart.service.LessonServiceImpl" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
.......................
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
...................
這里使用的不是純粹的JPA,而是使用hibernate-jpa-2.0-api-1.0.0.Final.jar中的JPA。對LessonServiceImpl.java這個類的定義前增加@Transactional,表示這個類須要進行事務管理,而使用的事務則是通過<tx:annotation-driven />來指定的。也就是LessonServiceImpl要通過這個類工廠中定義的transactionManager來進行數據的操作時的事務處理。能夠參考http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative 。
定義一個set函數這個函數傳遞進一個EntityManager的類參數,通過這個接口類工廠才干夠將LessonServiceImpl須要EntityManager由類工廠中注入進去。然后這個set函數須要加上@PersistentContext這個annotation,表示這個就是注入存儲上下文對象的接口。能夠參考http://download.oracle.com/javaee/5/tutorial/doc/bnbqw.html 。
當然另外我想最簡單清楚表現JPA使用的方法可能是這樣,採取直接注入的方式:
<bean id="LessonService" class="quickstart.service.LessonServiceImpl" >
<property name="entityManager" ref="entityManager"/>
</bean>
可是這樣一個問題就是全部的訪問數據的接口都要注入一次。
所以這里通過AOP的方法及結合annotation的方法(經常使用的是xml方式)來進行依賴注入。對於事務處理通過@Transactional來實現在,,所以在這里,我們假設刪除@Transactional這相當於刪除事務管理,這將導致只能夠查詢該數據不能被刪除或更新;對於管理entity通過@PersistentContext,類工廠將這里命名entityManagerFactory(默認名稱)的bean傳遞到所有的植物bean要加入@PersistentContext接口(這里是LessonService)