欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JPA概要

本文最新版已更新至:http://thinkinside.tk/2012/12/30/JPA.html

JPA定義了Java ORM及實(shí)體操作API的標準。本文摘錄了JPA的一些關(guān)鍵信息以備查閱。

如果有hibernate的基礎,通過(guò)本文也可以快速掌握JPA的基本概念及使用。

1 JPA概述

JPA(Java Persistence API,Java持久化API),定義了對象-關(guān)系映射(ORM)以及實(shí)體對象持久化的標準接口。

JPA是JSR-220(EJB3.0)規范的一部分,在JSR-220中規定實(shí)體對象(EntityBean)由JPA進(jìn)行支持。

所以JPA不局限于EJB3.0,而是作為POJO持久化的標準規范,可以脫離容器獨立運行,開(kāi)發(fā)和測試更加方便。

JPA在應用中的位置如下圖所示:

 

JPA維護一個(gè)Persistence Context(持久化上下文),在持久化上下文中維護實(shí)體的生命周期。主要包含三個(gè)方面的內容:

  1. ORM元數據。JPA支持annotion或xml兩種形式描述對象-關(guān)系映射。
  2. 實(shí)體操作API。實(shí)現對實(shí)體對象的CRUD操作。
  3. 查詢(xún)語(yǔ)言。約定了面向對象的查詢(xún)語(yǔ)言JPQL(Java Persistence Query Language)。

JPA的主要API都定義在javax.persistence包中。如果你熟悉Hibernate,可以很容易做出對應:

 
org.hibernatejavax.persistence說(shuō)明
cfg.ConfigurationPersistence讀取配置信息
SessionFactoryEntityManagerFactory用于創(chuàng )建會(huì )話(huà)/實(shí)體管理器的工廠(chǎng)類(lèi)
SessionEntityManager提供實(shí)體操作API,管理事務(wù),創(chuàng )建查詢(xún)
TransactionEntityTransaction管理事務(wù)
QueryQuery執行查詢(xún)

2 實(shí)體生命周期

實(shí)體生命周期是JPA中非常重要的概念,描述了實(shí)體對象從創(chuàng )建到受控、從刪除到游離的狀態(tài)變換。對實(shí)體的操作主要就是改變實(shí)體的狀態(tài)。

JPA中實(shí)體的生命周期如下圖:

  1. New,新創(chuàng )建的實(shí)體對象,沒(méi)有主鍵(identity)值
  2. Managed,對象處于Persistence Context(持久化上下文)中,被EntityManager管理
  3. Detached,對象已經(jīng)游離到Persistence Context之外,進(jìn)入Application Domain
  4. Removed, 實(shí)體對象被刪除

EntityManager提供一系列的方法管理實(shí)體對象的生命周期,包括:

  1. persist, 將新創(chuàng )建的或已刪除的實(shí)體轉變?yōu)镸anaged狀態(tài),數據存入數據庫。
  2. remove,刪除受控實(shí)體
  3. merge,將游離實(shí)體轉變?yōu)镸anaged狀態(tài),數據存入數據庫。

如果使用了事務(wù)管理,則事務(wù)的commit/rollback也會(huì )改變實(shí)體的狀態(tài)。

3 實(shí)體關(guān)系映射(ORM)

3.1 基本映射

 
對象端數據庫端annotion可選annotion
ClassTable@Entity@Table(name="tablename")
propertycolumn@Column(name = "columnname")
propertyprimary key@Id@GeneratedValue 詳見(jiàn)ID生成策略
propertyNONE@Transient 

3.2 ID生成策略

ID對應數據庫表的主鍵,是保證唯一性的重要屬性。JPA提供了以下幾種ID生成策略

  1. GeneratorType.AUTO ,由JPA自動(dòng)生成
  2. GenerationType.IDENTITY,使用數據庫的自增長(cháng)字段,需要數據庫的支持(如SQL Server、MySQL、DB2、Derby等)
  3. GenerationType.SEQUENCE,使用數據庫的序列號,需要數據庫的支持(如Oracle)
  4. GenerationType.TABLE,使用指定的數據庫表記錄ID的增長(cháng) 需要定義一個(gè)TableGenerator,在@GeneratedValue中引用。例如:

    @TableGenerator( name="myGenerator", table="GENERATORTABLE", pkColumnName = "ENTITYNAME", pkColumnValue="MyEntity", valueColumnName = "PKVALUE", allocationSize=1 )

    @GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator")

3.3 關(guān)聯(lián)關(guān)系

JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關(guān)系。

對于數據庫來(lái)說(shuō),通常在一個(gè)表中記錄對另一個(gè)表的外鍵關(guān)聯(lián);對應到實(shí)體對象,持有關(guān)聯(lián)數據的一方稱(chēng)為owning-side,另一方稱(chēng)為inverse-side。

為了編程的方便,我們經(jīng)常會(huì )希望在inverse-side也能引用到owning-side的對象,此時(shí)就構建了雙向關(guān)聯(lián)關(guān)系。 在雙向關(guān)聯(lián)中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個(gè)屬性持有的關(guān)聯(lián)數據。

對關(guān)聯(lián)關(guān)系映射的要點(diǎn)如下:

 
關(guān)系類(lèi)型Owning-SideInverse-Side
one-to-one@OneToOne@OneToOne(mappedBy="othersideName")
one-to-many / many-to-one@ManyToOne@OneToMany(mappedBy="xxx")
many-to-many@ManyToMany@ManyToMany(mappedBy ="xxx")

其中 many-to-many關(guān)系的owning-side可以使用@JoinTable聲明自定義關(guān)聯(lián)表,比如Book和Author之間的關(guān)聯(lián)表:

@JoinTable(name = "BOOKAUTHOR", joinColumns = { @JoinColumn(name = "BOOKID", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "AUTHORID", referencedColumnName = "id") })

關(guān)聯(lián)關(guān)系還可以定制延遲加載和級聯(lián)操作的行為(owning-side和inverse-side可以分別設置):

通過(guò)設置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來(lái)決定關(guān)聯(lián)對象是延遲加載或立即加載。

通過(guò)設置cascade={options}可以設置級聯(lián)操作的行為,其中options可以是以下組合:

  • CascadeType.MERGE 級聯(lián)更新
  • CascadeType.PERSIST 級聯(lián)保存
  • CascadeType.REFRESH 級聯(lián)刷新
  • CascadeType.REMOVE 級聯(lián)刪除
  • CascadeType.ALL 級聯(lián)上述4種操作

3.4 繼承關(guān)系

JPA通過(guò)在父類(lèi)增加@Inheritance(strategy=InheritanceType.xxx)來(lái)聲明繼承關(guān)系。A支持3種繼承策略:

  1. 單表繼承(InheritanceType.SINGLETABLE),所有繼承樹(shù)上的類(lèi)共用一張表,在父類(lèi)指定(@DiscriminatorColumn)聲明并在每個(gè)類(lèi)指定@DiscriminatorValue來(lái)區分類(lèi)型。
  2. 類(lèi)表繼承(InheritanceType.JOINED),父子類(lèi)共同的部分公用一張表,其余部分保存到各自的表,通過(guò)join進(jìn)行關(guān)聯(lián)。
  3. 具體表繼承(InheritanceType.TABLEPERCLASS),每個(gè)具體類(lèi)映射到自己的表。

其中1和2能夠支持多態(tài),但是1需要允許字段為NULL,2需要多個(gè)JOIN關(guān)系;3最適合關(guān)系數據庫,對多態(tài)支持不好。具體應用時(shí)根據需要取舍。

4 事件及監聽(tīng)

通過(guò)在實(shí)體的方法上標注@PrePersist,@PostPersist等聲明即可在事件發(fā)生時(shí)觸發(fā)這些方法。

5 Query Language 查詢(xún)語(yǔ)言

JPA提供兩種查詢(xún)方式,一種是根據主鍵查詢(xún),使用EntityManager的find方法:

T find(Class entityClass, Object primaryKey)

另一種就是使用JPQL查詢(xún)語(yǔ)言。JPQL是完全面向對象的,具備繼承、多態(tài)和關(guān)聯(lián)等特性,和hibernate HQL很相似。

使用EntityManager的createQuery方法:

Query createQuery(String qlString)

5.1 使用參數

可以在JPQL語(yǔ)句中使用參數。JPQL支持命名參數和位置參數兩種參數,但是在一條JPQL語(yǔ)句中所有的參數只能使用同一種類(lèi)型。

舉例如下:

  • 命令參數

Query query = em.createQuery("select p from Person p where p.personid=:Id"); query.setParameter("Id",new Integer(1));

  • 位置參數

Query query = em.createQuery("select p from Person p where p.personid=?1"); query.setParameter(1,new Integer(1));

5.2 命名查詢(xún)

如果某個(gè)JPQL語(yǔ)句需要在多個(gè)地方使用,還可以使用@NamedQuery 或者 @NamedQueries在實(shí)體對象上預定義命名查詢(xún)。

在需要調用的地方只要引用該查詢(xún)的名字即可。

例如:

@NamedQuery(name="getPerson", query= "FROM Person WHERE personid=?1")

@NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Person WHERE personid=?1"), @NamedQuery(name="getPersonList", query= "FROM Person WHERE age>?1") })

Query query = em.createNamedQuery("getPerson");

5.3 排序

JPQL也支持排序,類(lèi)似于SQL中的語(yǔ)法。例如: Query query = em.createQuery("select p from Person p order by p.age, p.birthday desc");

5.4 聚合查詢(xún)

JPQL支持AVG、SUM、COUNT、MAX、MIN五個(gè)聚合函數。例如:

Query query = em.createQuery("select max(p.age) from Person p"); Object result = query.getSingleResult(); String maxAge = result.toString();

5.5 更新和刪除

JPQL不僅用于查詢(xún),還可以用于批量更新和刪除。

如:

Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 的記錄數 int result = query.executeUpdate();

Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount<100)"); query.executeUpdate();

query = em.createQuery("delete from Order as o where o.amount<100"); query.executeUpdate();//delete的記錄數

5.6 更多

與SQL類(lèi)似,JPQL還涉及到更多的語(yǔ)法,可以參考:http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html

6 事務(wù)管理

JPA支持本地事務(wù)管理(RESOURCELOCAL)和容器事務(wù)管理(JTA),容器事務(wù)管理只能用在EJB/Web容器環(huán)境中。

事務(wù)管理的類(lèi)型可以在persistence.xml文件中的“transaction-type”元素配置。

JPA中通過(guò)EntityManager的getTransaction()方法獲取事務(wù)的實(shí)例(EntityTransaction),之后可以調用事務(wù)的begin()、commit()、rollback()方法。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JPA查詢(xún)語(yǔ)言 2
JPA的實(shí)體狀態(tài)和API淺析
JPA EntityManager 詳解
OpenJPA的基礎
JPA實(shí)體bean配置,jpa增刪改api,jpasql增刪改
JPA重整ORM山河
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久