@NotFound(action=NotFoundAction.IGNORE),意思是找不到引用的外鍵數(shù)據(jù)時忽略,NotFound默認是exception
-------------------------------------------------------------------cascade = CascadeType.REFRESH,cascade=CascadeType.ALL
cascade表示級聯(lián)操作
CascadeType.MERGE級聯(lián)更新:若items屬性修改了那么order對象保存時同時修改items里的對象。對應(yīng)EntityManager的merge方法
CascadeType.PERSIST級聯(lián)刷新:獲取order對象里也同時也重新獲取最新的items時的對象。對應(yīng)EntityManager的refresh(object)方法有效。即會重新查詢數(shù)據(jù)庫里的最新數(shù)據(jù)
CascadeType.REFRESH級聯(lián)保存:對order對象保存時也對items里的對象也會保存。對應(yīng)EntityManager的presist方法
CascadeType.REMOVE級聯(lián)刪除:對order對象刪除也對items里的對象也會刪除。對應(yīng)EntityManager的remove方法
CascadeType.PERSIST只有A類新增時,會級聯(lián)B對象新增。若B對象在數(shù)據(jù)庫存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))
CascadeType.MERGE指A類新增或者變化,會級聯(lián)B對象(新增或者變化)
CascadeType.REMOVE只有A類刪除時,會級聯(lián)刪除B類;
CascadeType.ALL包含所有;
CascadeType.REFRESH沒用過。
綜上:大多數(shù)情況用CascadeType.MERGE就能達到級聯(lián)跟新又不報錯,用CascadeType.ALL時要斟酌下CascadeType.REMOVE
@Fetch:
定義了加載關(guān)聯(lián)關(guān)系的獲取策略. FetchMode 可以是
SELECT (在需要加載關(guān)聯(lián)的時候觸發(fā)select操作), SUBSELECT(只對集合有效,使用了子查詢策略,詳情參考Hibernate參考文檔)
JOIN (在加載主實體(owner entity)的時候使用SQL JOIN來加載關(guān)聯(lián)關(guān)系).
JOIN 將覆寫任何延遲屬性 (通過 JOIN策略加載的關(guān)聯(lián)將不再具有延遲性).
-------------------------------------------------------------------fetch=FetchType.LAZYHibernate的數(shù)據(jù)加載方式: 1.即時加載 immediately loading 實體加載完成后,立即加載其關(guān)聯(lián)的數(shù)據(jù)。
2.延遲加載lazy loading
實體相關(guān)聯(lián)的數(shù)據(jù)在第一次訪問時再進行讀取。
3.預(yù)先加載 eager loading
與immediately loading類似,但實體和相關(guān)聯(lián)的數(shù)據(jù)是通過一條sql同時讀取。
4.批量加載 batch loading
?
------------------------------------------------------------------
EntityManager 的API
下面是EntityManager的一些主要的接口方法:
void
persist(Object entity)
通過調(diào)用EntityManager的persist()方法,新實體實例將轉(zhuǎn)換為受控狀態(tài)。這意謂著當(dāng)persist()方法所在的事務(wù)提交時,實體的數(shù)據(jù)將保存到數(shù)據(jù)庫中。如果實體已經(jīng)被持久化,那么調(diào)用persist()操作不會發(fā)生任何事情。如果對一個已經(jīng)刪除的實體調(diào)用persist()操作,刪除態(tài)的實體又轉(zhuǎn)變?yōu)槭芸貞B(tài)。如果對游離狀的實體執(zhí)行persist()操作,將拋出IllegalArgumentException。 在一個實體上調(diào)用persist()操作,將廣播到和實體關(guān)聯(lián)的實體上,執(zhí)行相應(yīng)的級聯(lián)持久化操作;
void
remove(Object entity)
通過調(diào)用remove()方法刪除一個受控的實體。如果實體聲明為級聯(lián)刪除(cascade=REMOVE 或者cascade=ALL ),被關(guān)聯(lián)的實體也會被刪除。在一個新建狀態(tài)的實體上調(diào)用remove()操作,將被忽略。如果在游離實體上調(diào)用remove()操作,將拋出IllegalArgumentException,相關(guān)的事務(wù)將回滾。如果在已經(jīng)刪除的實體上執(zhí)行remove()操作,也會被忽略;
void
flush()
將受控態(tài)的實體數(shù)據(jù)同步到數(shù)據(jù)庫中;
T
merge(T entity)
將一個游離態(tài)的實體持久化到數(shù)據(jù)庫中,并轉(zhuǎn)換為受控態(tài)的實體;
T
find(Class entityClass, Object primaryKey)
以主鍵查詢實體對象,entityClass是實體的類,primaryKey是主鍵值,如以下的代碼查詢Topic實體: Topic t = em.find(Topic.class,1); Query createQuery(String qlString) 根據(jù)JPA的查詢語句創(chuàng)建一個查詢對象Query,如下面的代碼:
Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString)
使用本地數(shù)據(jù)庫的SQL語句創(chuàng)建一個Query對象,Query通過getResultList()方法執(zhí)行查詢后,返回一個List結(jié)果集,每一行數(shù)據(jù)對應(yīng)一個Vector。
使用本地數(shù)據(jù)庫的SQL語句創(chuàng)建一個Query對象,Query通過getResultList()方法執(zhí)行查詢后,返回一個List結(jié)果集,每一行數(shù)據(jù)對應(yīng)一個Vector。
看來要學(xué)習(xí)的東東還有好多啊~~努力吧!
object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be
reattached to a new Session at a later point in time, making it (and all the modifications) persistent again
現(xiàn)在應(yīng)該明白了吧,在刪除之前把這個Detached instance綁定到當(dāng)前的Sesssion,在用當(dāng)前Sesssion刪除此instance。修改后的代碼如