【正文】
(Batch Remove)JPQL支持批量刪除。為了避免N+1的性能問題,我們可以利用join fetch一次過用一條SQL語句把Order的所有信息查詢出來。 inner join foo39。 COUNT // 直接查詢我們感興趣的屬性(列) final Query query = ( select , , from Order o order by )。 ( customerName, foo )。 final Query query = ( select o from Order o where = 1)。 final Iterator iterator = ()。 // 脫離EntityManager后,我們?nèi)匀豢梢孕薷腇ather的屬性 ( newName )。 // 更新對象引用 Son newSon = new Son()。 Father = new Father( 1, mySon )。 Son mySon = new Son()。 EntityTransaction trans = ()。 Entity的生命周期和狀態(tài)在EJB3中定義了四種Entity的狀態(tài): public Person() { } Person的復合主鍵類: public class PersonPK implements { private String firstName。 主鍵和實體標識(Primary Key and Entity Identity)每個Entity類都必須有一個主鍵。 如果采用access=PROPERTY, EJB3 Persistence運行環(huán)境將通過Entity類上的getter來訪問對象的屬性變量,這就要求每個屬性變量要有g(shù)etter/setter方法。 事務也通常是聲明式的。下面的代碼演示了如何通過 JPA 提供的接口和 JPQL 查詢語言完成實體查詢和更新的例子,例子中的代碼假定運行在非 Java EE 環(huán)境中。支持面向?qū)ο蟮母呒壧匦訨PA 中能夠支持面向?qū)ο蟮母呒壧匦?,比如類之間的繼承、多態(tài)和類之間的復雜關(guān)系,這樣的支持能夠讓開發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計企業(yè)應用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫的持久化。JPA開發(fā)文檔JPA 11. 發(fā)展中的持久化技術(shù) 3 JDBC 3 關(guān)系對象映射(Object Relational Mapping,ORM) 3 Java 數(shù)據(jù)對象(Java Data Object,JDO) 3 Java Persistence API(JPA) 32. JPA 體系架構(gòu) 53. Entity Bean 7 7 主鍵和實體標識(Primary Key and Entity Identity) 94. EntityManager 10 配置和獲得EntityManager 10 Entity的生命周期和狀態(tài) 10 持久化Entity(Persist) 11 獲取Entity 13 更新Entity 13 刪除Entity 13 脫離/附合(Detach/Merge) 145. JPA Query 14 Query接口 15 簡單查詢 15 使用參數(shù)查詢 16 排序(order by) 16 查詢部分屬性 17 查詢中使用構(gòu)造器(Constructor) 17 聚合查詢(Aggregation) 18 關(guān)聯(lián)(join) 19 20 批量更新(Batch Update) 21(Batch Remove) 211. 發(fā)展中的持久化技術(shù) JDBC很多企業(yè)應用的開發(fā)者選擇使用 JDBC 管理關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)。支持內(nèi)容:JDBCORMJDOEJB 3(JPA)Java 對象NoYesYesYes高級OO原理NoYesYesYes事務完整性YesYesYesYes并發(fā)YesYesYesYes大數(shù)據(jù)集YesYesYesYes現(xiàn)有 SchemaYesYesYesYes關(guān)系型和非關(guān)系型數(shù)據(jù)存儲NoNoYesNo查詢YesYesYesYes嚴格的標準/可移植NoNoYesYes簡單易用YesYesYesYes表 1 持久化技術(shù)的優(yōu)缺點2. JPA 體系架構(gòu)JPA 中定義一套類和接口用于實現(xiàn)持久化管理和對象/關(guān)系的映射,下面這張圖中顯示了 JPA 的主要組件以及它們之間的相互關(guān)系。清單 1 在非 Java EE 環(huán)境使用 JPA 接口的例子EntityManagerFactory factory = (“mysql”)。*/// 查找所有公司中的女性雇員Query query = (select e from Employee e where = 39。 Entity類中的屬性變量不可以是public。在EJB3中,默認的屬性訪問方式是PROPERTY。 在EJB3中定義了兩種主鍵:鍵單主鍵和復合主鍵。 private String lastName。 新實體(new)。 ()。 Father = new Father( 1, father mySon )。 // 保存Father。 ( newSon )。 // 在稍后的,我們可以將father重新附和到一個新的或者原來的EntityManager中 EntityManager newEntityManager = ()。 while( () ){ // 處理Order }注意from Order。 final Query query = ( select o from Order o where = 1 and = 39。 final Query query = ( select o from Order o where = ?1)。 // 集合中的不再是Order,而是一個Object[]對象數(shù)組 final List result = ()。 MAX 為條件 final Query query = ( select , , sum() FROM Order o group by , having =39。 left join/inner join fetch left join, left out join等義,都是允許符合條件的右邊表達式中的Entiies為空。 // 返回所有地址為2000的Order紀錄,Order中必須有OrderItem final Query query = ( select o from Order o inner join fetch where =2000 order by )。 Query query = (DELETE FROM Order)。 // update的記錄數(shù) int result = ()。為了查詢N個Order,我們需要一條SQL語句獲得所有的Order的原始/對象屬性, 但需要另外N條語句獲得每個Order的orderItems集合屬性。 left out join/left join // 返回所有的訂單的生產(chǎn)廠商是foo的貨物號碼和每種貨物的訂單價值總額 // 這里having = 39。 SUM 在一些Entity中屬性特別多的情況,這樣的查詢可以提高性能。 // 設(shè)置查詢中的參數(shù) ( myId, 2 )。 // 這里我們可以處理海量的數(shù)據(jù) while( () ){ // 處理Order } 簡單查詢下面是一個簡單查詢的例子,可以看到和SQL的使用方法很類似。 final List result = ()。 // 當entityManger關(guān)閉的時候,當前被entityManager管理的Ent