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