實(shí)體對象擁有以下4個(gè)狀態(tài),這些狀態(tài)通過(guò)調用EntityManager接口方法發(fā)生遷移:
新建態(tài):新創(chuàng )建的實(shí)體對象,尚未擁有持久化主鍵,沒(méi)有和一個(gè)持久化上下文關(guān)聯(lián)起來(lái)。受控態(tài):已經(jīng)擁有持久化主鍵并和持久化上下文建立了聯(lián)系;
游離態(tài):擁有持久化主鍵,但尚未和持久化上下文建立聯(lián)系; 刪除態(tài):擁有持久化主鍵,已經(jīng)和持久化上下文建立聯(lián)系,但已經(jīng)被安排從數據庫中刪除。
EntityManager 的API
下面是EntityManager的一些主要的接口方法:
void persist(Object entity)
通過(guò)調用EntityManager的persist()方法,新實(shí)體實(shí)例將轉換為受控狀態(tài)。這意謂著(zhù)當persist ()方法所在的事務(wù)提交時(shí),實(shí)體的數據將保存到數據庫中。如果實(shí)體已經(jīng)被持久化,那么調用persist()操作不會(huì )發(fā)生任何事情。如果對一個(gè)已經(jīng)刪除的 實(shí)體調用persist()操作,刪除態(tài)的實(shí)體又轉變?yōu)槭芸貞B(tài)。如果對游離狀的實(shí)體執行persist()操作,將拋出 IllegalArgumentException。
在一個(gè)實(shí)體上調用persist()操作,將廣播到和實(shí)體關(guān)聯(lián)的實(shí)體上,執行相應的級聯(lián)持久化操作;
void remove(Object entity)
通過(guò)調用remove()方法刪除一個(gè)受控的實(shí)體。如果實(shí)體聲明為級聯(lián)刪除(cascade=REMOVE 或者cascade=ALL ),被關(guān)聯(lián)的實(shí)體也會(huì )被刪除。在一個(gè)新建狀態(tài)的實(shí)體上調用remove()操作,將被忽略。如果在游離實(shí)體上調用remove()操作,將拋出 IllegalArgumentException,相關(guān)的事務(wù)將回滾。如果在已經(jīng)刪除的實(shí)體上執行remove()操作,也會(huì )被忽略;
void flush()
將受控態(tài)的實(shí)體數據同步到數據庫中;
T merge(T entity)
將一個(gè)游離態(tài)的實(shí)體持久化到數據庫中,并轉換為受控態(tài)的實(shí)體;
T find(Class entityClass, Object primaryKey)
以主鍵查詢(xún)實(shí)體對象,entityClass是實(shí)體的類(lèi),primaryKey是主鍵值,如以下的代碼查詢(xún)Topic實(shí)體:
Topic t = em.find(Topic.class,1);
Query createQuery(String qlString)
根據JPA的查詢(xún)語(yǔ)句創(chuàng )建一個(gè)查詢(xún)對象Query,如下面的代碼:
Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString)
使用本地數據庫的SQL語(yǔ)句創(chuàng )建一個(gè)Query對象,Query通過(guò)getResultList()方法執行查詢(xún)后,返回一個(gè)List結果集,每一行數據對應一個(gè)Vector。
Query
JPA使用javax.persistence.Query接口代表一個(gè)查詢(xún)實(shí)例,Query實(shí)例由EntityManager通過(guò)指定查詢(xún)語(yǔ)句構建。該接口擁有眾多執行數據查詢(xún)的接口方法:
Object getSingleResult():執行SELECT查詢(xún)語(yǔ)句,并返回一個(gè)結果;
List getResultList() :執行SELECT查詢(xún)語(yǔ)句,并返回多個(gè)結果;
Query setParameter(int position, Object value):通過(guò)參數位置號綁定查詢(xún)語(yǔ)句中的參數,如果查詢(xún)語(yǔ)句使用了命令參數,則可以使用Query setParameter(String name, Object value)方法綁定命名參數;
Query setMaxResults(int maxResult):設置返回的最大結果數;
int executeUpdate():如果查詢(xún)語(yǔ)句是新增、刪除或更改的語(yǔ)句,通過(guò)該方法執行更新操作。