1、 簡介
1.JPA規範本質上就是一種ORM規範,它制定了一些規範,提供了一些編程的API接口,具體實現由應用服務器廠商來提供,JBoss應用服務器底層就以Hibernate做爲JPA實現。也就是說,基於JPA基礎的具體JPA實現能夠包括 Hibernate,TopLink以及其餘ORM框架。
2.JPA規範雖然與EJB3規範一同出現,可是JPA規範並不屬於EJB3規範,它是一套徹底獨立的規範。JPA不只能夠在基於EJB的JavaEE中使用,並且能夠在普通Java SE中使用。
3.JPA中最經常使用的3種組件:
實體:就是一個普通的POJO,能夠經過orm.xml映射文件或者Annotation創建實體與底層數據表之間的對應關係
EntityManager:實體沒有任何持久化能力,須要使用EntityManager操做實體,做用相似於Hibernate中的Session
JPQL查詢:相似於Hibernate中的HQL查詢語言。JPA提供了一個Query接口來執行查詢。java
二 、具體應用mysql
1.實體sql
@Entity @Table(name="product") public class ProductType { private Integer typeid; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getTypeid() { return typeid; } public void setTypeid(Integer typeid) { this.typeid = typeid; } }
@Entity和@Table的區別:數據庫
@Entity說明這個class是實體類,而且使用默認的orm規則,即class名即數據庫表中表名,class字段名即表中的字段名
若是想改變這種默認的orm規則,就要使用@Table來改變class名與數據庫中表名的映射規則,
@Column來改變class中字段名與db中表的字段名的映射規則,不過在mybatis中,能夠經過駝峯映射標籤進行自動映射。編程
在進行實際的數據庫訪問以前,Hibernate須要使用hibernate.cfg.xml文件管理數據庫鏈接、鏈接池信息,JPA須要使用persistence.xml來進行管理。不論是哪一種JPA實現,persistence.xml文件老是在放在類加載路徑的META-INF路徑下。緩存
2.persistence.xml
首先下載hibernate,解壓,將hibernate3.jar(Hibernate核心jar包),lib路徑下的required目錄和jpa目錄下的全部jar包添加到應用的類加載路徑中。
如下是一個簡單的persistence.xml文件 安全
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.itcast.bean.product.ProductType</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> <property name="hibernate.connection.url" value="jdbc:mysql:///mydb" /> <property name="hibernate.connection.username" value="root" /> <property name="hibernate.connection.password" value="123456" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="show_sql" value="true" /> <property name="hibernate.format_sql" value="false" /> </properties> </persistence-unit> </persistence>
persistence.xml文件經過<persistence-unit>元素配置持久化單元,其中name指定持久化單元名稱,transaction-type指定事務類型,支持如下兩個屬性值:服務器
JTA:使用JTA全局事務,這是默認值,指定該值後還須要使用<jta-data-resource>元素指定容器管理的XA數據源mybatis
RESOURCE_LOCAL:使用局部事務,JavaSE程序一般採用局部事務app
<persistence-unit>中還包含3個子元素:
(1)<provider>:指定JPA實現的提供類,在應用服務器環境中無須指定該元素
(2)<class>,<mapping-file>,<jar-file>:用於指定實體,其中<class>指定實體類的類名,<mapping-file>指定實體類的映射文件,<jar-file>指定實體類所在的JAR包。
(3)<properties>:能夠包含多個<property>子元素,用於爲特定JPA實現配置對應的屬性。
除此以外,若是但願讓JPA使用容器管理的數據源,則應該在<persistence-unit>元素內添加<jta-data-resource>子元素,該子元素的內容就是JTA數據源的JNDI名稱。
其餘一些配置:
<property name="hibernate.ejb.cfgfile" value=".../../hibernate.cfg.xml" /> 若是程序已經在hibernate.cfg.xml文件中指定了數據庫的相關信息,則能夠在persistence.xml中指定hibernate.cfg.xml的位置便可 hibernate.max_fetch_depth:設置關聯實體的最大抓取深度,0表示不抓取實體,建議在0-3之間,默認爲1
hibernate.default_batch_fetch_size:設置加載關聯實體集時所加載的關聯實體的個數,建議使用2的倍數。
3.EntityManager
JPA的核心API就是EntityManager,EntityManager負責管理JPA持久化上下文中的全部實體,在程序中使用EntityManager大體有三種狀況:
(1)在EJB中使用:直接使用依賴注入進行管理
(2)在Servlet,JSF的託管Bean中使用:不能直接使用依賴注入,由於多個請求線程可能共享同一個Servlet或JSF的託管Bean,而EntityManager並無被設計成線程安全的,所以可能會致使線程安全問題。這個問題有兩種解決方法:使用JNDI查找來得到EntityManager對象;使用依賴注入管理EntityManagerFactory對象,再經過EntityManagerFactory來獲取EntityManager對象
(3)在Java SE應用中使用:須要應用程序顯式的建立EntityManager,過程以下:
經過javax.persistence.Persistence工廠類提供的createEntityManagerFactory()靜態方法建立EntityManagerFactory對象,調用該方法時須要傳入persistence.xml文件中持久化單元的名稱。
調用EntityManagerFactory的createEntityManager()或createEntityManager(Map map)方法來建立EntityManager對象。若是傳入了一個Map參數,那麼這個Map參數傳入的屬性會補充或覆蓋persistence.xml文件中配置的屬性。
這裏能夠將EntityManager類比爲Hibernate中的Session,EntityManagerFactory類比爲Hibernate中的SessionFactory
具體使用:
1 public class ProductTest { 2 private static final EntityManagerFactory=Persistence.createEntityManagerFactory("itcast"); 3 public static void main(String[] args){ 4 final EntityManager em=factory.createEntityManager(); 5 ProductType product =new ProductType(); 6 try{ 7 em.getTransaction().begin(); 8 em.persist(product); 9 em.getTransaction().commit(); 10 }finally{ 11 em.close(); 12 } 13 } 14 }
4.EntityManager包含了大量方法來對實體執行保存、刪除和檢索等操做,經常使用的一些方法以下:
void persist(Object entity):持久化實體到數據庫
T merge(T entity):將指定實體合併到數據庫
void remove(T entity)
void detach(Object entity):將指定實體從緩存中清除
T find(Class<T> entityClass,Object pk):根據主體的主鍵加載實體
T getReference(Class<T> entityClass,Object pk):根據主體的主鍵加載實體,有延遲加載的功能
void setFlushMode(FlushModeType flushMode):設置持久化上下文的flush模式,該模式能夠是AUTO(EntityManager自動管理實體和數據庫的同步)或COMMIT
void flush():將持久化上下文中的實體狀態同步到數據庫
void refresh(Object entity):刷新指定實體狀態
Query createQuery(String sql):根據指定JPQL語句建立查詢
Query createNamedQuery(String name):根據配置中的查詢名建立命名查詢
Query createNativeQuery(String sqlString):根據指定SQL語句建立原生的SQL查詢
void close()
boolean isOpen():判斷EntityManager是否打開
JPA除了用Annotation來管理實體和數據表之間的對應關係外,還可使用orm.xml文件來進行管理,就像Hibernate使用*.hbm.xml文件同樣。
一旦爲實體提供了orm.xml映射文件,就要在persistence.xml中使用<mapping-file>元素來加載該映射文件。
注意:persistence.xml文件必須位於META-INF路徑下,包含META-INF路徑的路徑或JAR包被稱爲持久化單元的根,持久化單元的做用域由持久化單元的根肯定。主要包括如下三種狀況:
對於一個Java SE應用程序而言,若是程序沒有將persistence.xml文件打成JAR包,則應該將該文件放在應用類加載路徑的META-INF路徑下;
若是將persistence.xml文件打包到某個EJB JAR包中,則應該將persistence.xml文件放在該EJB JAR包的META-INF路徑下;
若是將persistence.xml打包成某個Web應用的JAR包,則將persistence.xml放在該WAR的WEB-INF/classes/META-INF路徑下;對於不打包成WAR包的Web應用,也應該將persistence.xml文件放在Web應用的WEB-INF/classes/META-INF路徑下。