<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    JPA概要

    1 JPA概述

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

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

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

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

     

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

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

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

     
    org.hibernatejavax.persistence說明
    cfg.ConfigurationPersistence讀取配置信息
    SessionFactoryEntityManagerFactory用于創建會話/實體管理器的工廠類
    SessionEntityManager提供實體操作API,管理事務,創建查詢
    TransactionEntityTransaction管理事務
    QueryQuery執行查詢

    2 實體生命周期

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

    JPA中實體的生命周期如下圖:

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

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

    1. persist, 將新創建的或已刪除的實體轉變為Managed狀態,數據存入數據庫。
    2. remove,刪除受控實體
    3. merge,將游離實體轉變為Managed狀態,數據存入數據庫。

    如果使用了事務管理,則事務的commit/rollback也會改變實體的狀態。

    3 實體關系映射(ORM)

    3.1 基本映射

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

    3.2 ID生成策略

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

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

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

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

    3.3 關聯關系

    JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關系。

    對于數據庫來說,通常在一個表中記錄對另一個表的外鍵關聯;對應到實體對象,持有關聯數據的一方稱為owning-side,另一方稱為inverse-side。

    為了編程的方便,我們經常會希望在inverse-side也能引用到owning-side的對象,此時就構建了雙向關聯關系。 在雙向關聯中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個屬性持有的關聯數據。

    對關聯關系映射的要點如下:

     
    關系類型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關系的owning-side可以使用@JoinTable聲明自定義關聯表,比如Book和Author之間的關聯表:

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

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

    通過設置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來決定關聯對象是延遲加載或立即加載。

    通過設置cascade={options}可以設置級聯操作的行為,其中options可以是以下組合:

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

    3.4 繼承關系

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

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

    其中1和2能夠支持多態,但是1需要允許字段為NULL,2需要多個JOIN關系;3最適合關系數據庫,對多態支持不好。具體應用時根據需要取舍。

    4 事件及監聽

    通過在實體的方法上標注@PrePersist,@PostPersist等聲明即可在事件發生時觸發這些方法。

    5 Query Language 查詢語言

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

    T find(Class entityClass, Object primaryKey)

    另一種就是使用JPQL查詢語言。JPQL是完全面向對象的,具備繼承、多態和關聯等特性,和hibernate HQL很相似。

    使用EntityManager的createQuery方法:

    Query createQuery(String qlString)

    5.1 使用參數

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

    舉例如下:

    • 命令參數

    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 命名查詢

    如果某個JPQL語句需要在多個地方使用,還可以使用@NamedQuery 或者 @NamedQueries在實體對象上預定義命名查詢。

    在需要調用的地方只要引用該查詢的名字即可。

    例如:

    @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也支持排序,類似于SQL中的語法。例如: Query query = em.createQuery("select p from Person p order by p.age, p.birthday desc");

    5.4 聚合查詢

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

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

    5.5 更新和刪除

    JPQL不僅用于查詢,還可以用于批量更新和刪除。

    如:

    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類似,JPQL還涉及到更多的語法,可以參考:http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html

    6 事務管理

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

    事務管理的類型可以在persistence.xml文件中的“transaction-type”元素配置。

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

    Date: 2012-12-30 16:46:29 CST

    Author: Holbrook

    Org version 7.8.11 with Emacs version 24

    posted on 2016-06-04 16:08 paulwong 閱讀(564) 評論(0)  編輯  收藏 所屬分類: HIBERNATE

    主站蜘蛛池模板: 国产精品公开免费视频| 国产∨亚洲V天堂无码久久久| 又硬又粗又长又爽免费看 | 67194熟妇在线永久免费观看| 2020久久精品亚洲热综合一本 | 久久青青草原亚洲av无码| 国产免费AV片在线观看| 亚洲av乱码一区二区三区香蕉 | 久久精品a亚洲国产v高清不卡| 好爽…又高潮了免费毛片| h视频免费高清在线观看| 亚洲欧洲国产综合| 亚洲国产V高清在线观看| 最近免费字幕中文大全视频| 色妞www精品视频免费看| 亚洲精品亚洲人成在线观看麻豆| 国产成人精品免费视频大全五级| 日本在线免费观看| 免费看一级毛片在线观看精品视频 | 久别的草原电视剧免费观看| 337p日本欧洲亚洲大胆人人 | 久久精品国产亚洲av天美18| 亚洲av无码乱码国产精品fc2| 最新仑乱免费视频| 国产成人精品无码免费看| 视频一区在线免费观看| 亚洲日本国产精华液| 国产国拍亚洲精品mv在线观看 | 亚洲午夜精品一区二区公牛电影院| ZZIJZZIJ亚洲日本少妇JIZJIZ| 91情侣在线精品国产免费| 免费国产叼嘿视频大全网站 | 一本无码人妻在中文字幕免费| 91精品全国免费观看青青| 美女被爆羞羞网站免费| 91嫩草亚洲精品| 亚洲a一级免费视频| 国产亚洲?V无码?V男人的天堂 | 亚洲成AV人片在线观看WWW| 亚洲成av人在片观看| 免费看a级黄色片|