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

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

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

    ourday

    ourday

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      8 Posts :: 2 Stories :: 11 Comments :: 0 Trackbacks

    2010年5月9日 #

    JPA是什么

     

    定義 Java Persistence API

    JPA通過JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫中。

    起源

    Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡化現(xiàn)有Java EE和Java SE應(yīng)用的對(duì)象持久化的開發(fā)工作;其二,Sun希望整合對(duì)ORM技術(shù),實(shí)現(xiàn)天下歸一。

    JPA由EJB 3.0軟件專家組開發(fā),作為JSR-220實(shí)現(xiàn)的一部分。但它不囿于EJB 3.0,你可以在Web應(yīng)用、甚至桌面應(yīng)用中使用。JPA的宗旨是為POJO提供持久化標(biāo)準(zhǔn)規(guī)范,由此可見,經(jīng)過這幾年的實(shí)踐探索,能夠脫離容器獨(dú)立運(yùn) 行,方便開發(fā)和測(cè)試的理念已經(jīng)深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實(shí)現(xiàn)。

    JPA的總體思想和現(xiàn)有Hibernate、TopLink,JDO等ORM框架大體一致??偟膩碚f,JPA包括以下3方面的技術(shù):

    ORM映射元數(shù)據(jù)

    JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對(duì)象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對(duì)象持久化到數(shù)據(jù)庫表中;

    JPA 的API

    用來操作實(shí)體對(duì)象,執(zhí)行CRUD操作,框架在后臺(tái)替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。

    查詢語言

    這是持久化操作中很重要的一個(gè)方面,通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù),避免程序的SQL語句緊密耦合。

    JPA的優(yōu)勢(shì)

    1 標(biāo)準(zhǔn)化

    JPA 是 JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問 API,這保證了基于JPA開發(fā)的企業(yè)應(yīng)用能夠經(jīng)過少量的修改就能夠在不同的JPA框架下運(yùn)行。

    2 對(duì)容器級(jí)特性的支持

    JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級(jí)事務(wù),這使得 JPA 超越了簡單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。

    3 簡單易用,集成方便

    JPA的主要目標(biāo)之一就是提供更加簡單的編程模型:在JPA框架下創(chuàng)建實(shí)體和創(chuàng)建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進(jìn)行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規(guī)則和設(shè)計(jì)模式的要求,開發(fā)者可以很容易的 掌握。JPA基于非侵入式原則設(shè)計(jì),因此可以很容易的和其它框架或者容器集成。

    4 可媲美JDBC的查詢能力

    JPA的查詢語言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的,它以面向?qū)ο蟮淖匀徽Z法構(gòu)造查詢語句,可以看成 是Hibernate HQL的等價(jià)物。JPA定義了獨(dú)特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴(kuò)展,它是針對(duì)實(shí)體的一種查詢語言,操作對(duì)象是實(shí)體,而不是關(guān)系數(shù)據(jù)庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。

    5 支持面向?qū)ο蟮母呒?jí)特性

    JPA 中能夠支持面向?qū)ο蟮母呒?jí)特性,如類之間的繼承、多態(tài)和類之間的復(fù)雜關(guān)系,這樣的支持能夠讓開發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計(jì)企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫的持久化。

    JPA的供應(yīng)商

    JPA 的目標(biāo)之一是制定一個(gè)可以由很多供應(yīng)商實(shí)現(xiàn)的API,并且開發(fā)人員可以編碼來實(shí)現(xiàn)該API,而不是使用私有供應(yīng)商特有的API。因此開發(fā)人員只需使用供應(yīng) 商特有的API來獲得JPA規(guī)范沒有解決但應(yīng)用程序中需要的功能。盡可能地使用JPA API,但是當(dāng)需要供應(yīng)商公開但是規(guī)范中沒有提供的功能時(shí),則使用供應(yīng)商特有的API。

    1 Hibernate

    JPA是需要Provider來實(shí)現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個(gè),目前來說應(yīng)該無人能出其右。從功能上來說,JPA現(xiàn)在就是Hibernate功能的一個(gè)子集。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。

    只要熟悉Hibernate或者其他ORM框架,在使用JPA時(shí)會(huì)發(fā)現(xiàn)其實(shí)非常容易上手。例如 實(shí)體對(duì)象的狀態(tài),在Hibernate有自由、持久、游離三種,JPA里有new,managed,detached,removed,明眼人一看就知 道,這些狀態(tài)都是一一對(duì)應(yīng)的。再如flush方法,都是對(duì)應(yīng)的,而其他的再如說Query query = manager.createQuery(sql),它在Hibernate里寫法上是session,而在JPA中變成了manager,所以從 Hibernate到JPA的代價(jià)應(yīng)該是非常小的

    同樣,JDO,也開始兼容JPA。在ORM的領(lǐng)域中,看來JPA已經(jīng)是王道,規(guī)范就是規(guī)范。在各大廠商的支持下,JPA的使用開始變得廣泛。

    2 Spring

    Spring + Hibernate 常常被稱為 Java Web 應(yīng)用人氣最旺的框架組合。而在 JCP 通過的 Web Beans JSR ,卻欲將JSF + EJB + JPA 、來自 JBoss Seam(Spring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡化 Session Bean 框架)的一個(gè) Web 組合進(jìn)行標(biāo)準(zhǔn)化。如今的 Spring 2.0 為 JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環(huán)境內(nèi)可以在 Spring 管理的服務(wù)層使用(包括 Spring 的所有 AOP 和 DI 增強(qiáng))。同時(shí),關(guān)于下一個(gè)Web應(yīng)用組合會(huì)是 EJB、Spring + Hibernate 還是 Spring + JPA 的論戰(zhàn),早已充斥于耳。

    在Spring 2.0.1中,正式提供對(duì)JPA的支持,這也促成了JPA的發(fā)展,要知道JPA的好處在于可以分離于容器運(yùn)行,變得更加的簡潔。

    3 OpenJPA

    OpenJPA 是 Apache 組織提供的開源項(xiàng)目,它實(shí)現(xiàn)了 EJB 3.0 中的 JPA 標(biāo)準(zhǔn),為開發(fā)者提供功能強(qiáng)大、使用簡單的持久化數(shù)據(jù)管理框架。OpenJPA 封裝了和關(guān)系型數(shù)據(jù)庫交互的操作,讓開發(fā)者把注意力集中在編寫業(yè)務(wù)邏輯上。OpenJPA 可以作為獨(dú)立的持久層框架發(fā)揮作用,也可以輕松的與其它 Java EE 應(yīng)用框架或者符合 EJB 3.0 標(biāo)準(zhǔn)的容器集成。

    4 其它

    目前支持的實(shí)現(xiàn)包括Toplink、Hibernate Entitymanager等。TopLink以前需要收費(fèi),如今開源了。OpenJPA雖然免費(fèi),但功能、性能、普及性等方面更加需要加大力度。

    對(duì)于EJB來說,實(shí)體Bean一直是被批評(píng)的對(duì)象,由于其太復(fù)雜和龐大。JPA的出現(xiàn),很大程度的分離了復(fù)雜性。這讓EJB的推廣也變得容易。

    總而言之,JPA規(guī)范主要關(guān)注的僅是API的行為方面,而由各種實(shí)現(xiàn)完成大多數(shù)性能有關(guān)的調(diào)優(yōu)。盡管如此,所有可靠的實(shí)現(xiàn)都應(yīng)該擁有某種數(shù)據(jù)緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標(biāo)準(zhǔn)。

    小結(jié)

    EJB 3.0和JPA 毫無疑問將是Java EE 5的主要賣點(diǎn)。在某些領(lǐng)域中,它們給Java社區(qū)帶來了競爭優(yōu)勢(shì),并使Java 在其他領(lǐng)域與競爭對(duì)手不分伯仲(因?yàn)?,不可否認(rèn),目前某些領(lǐng)域尚不存在基于標(biāo)準(zhǔn)的方法)。

    過去數(shù)年來,Spring Framework一直是EJB在企業(yè)領(lǐng)域的主要競爭對(duì)手。EJB3.0規(guī)范解決了很多促進(jìn)Spring興起的問題。隨著它的出現(xiàn),EJB3.0毫無疑問比Spring提供了更好的開發(fā)體驗(yàn)——最引人注目的優(yōu)勢(shì)是它不需要配置文件。

    JPA提供一種標(biāo)準(zhǔn)的OR映射解決方案,該解決方案完全集成到EJB3。0兼容的容器中。JPA的前輩將會(huì)繼續(xù)穩(wěn)定發(fā)展,但是業(yè)務(wù)應(yīng)用程序中的 raw 使用將可能會(huì)減少。實(shí)現(xiàn) JPA 兼容的實(shí)體管理器似乎很可能是此類技術(shù)的發(fā)展方向。

    Java EE系列規(guī)范的較大問題與JPA沒有任何關(guān)系。Java EE 系列規(guī)范的問題涉及到 Web和EJB容器之間的集成。Spring在此領(lǐng)域仍然具有主要競爭優(yōu)勢(shì)。JBoss的Seam項(xiàng)目嘗試使用自定義的方法來解決這一問題。Caucho Resin應(yīng)用服務(wù)器試圖擴(kuò)展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問題,為我們提供一個(gè)全面而標(biāo)準(zhǔn)的依賴性注入方法。

    在不久的將來,Sun可能會(huì)將JPA作為一個(gè)單獨(dú)的JSR對(duì)待,同時(shí)JPA還可能作為Java SE的一部分。不過這些都不太重要,重要的是,我們現(xiàn)在已經(jīng)可以在脫離容器的情況下、在Java SE應(yīng)用中使用JPA了。

    JPA已經(jīng)作為一項(xiàng)對(duì)象持久化的標(biāo)準(zhǔn),不但可以獲得Java EE應(yīng)用服務(wù)器的支持,還可以直接在Java SE中使用。開發(fā)者將無需在現(xiàn)有多種ORM框架中艱難地選擇,按照Sun的預(yù)想,現(xiàn)有ORM框架頭頂?shù)墓猸h(huán)將漸漸暗淡,不再具有以往的吸引力。

    值得注意的是Java Persistence API并不是J2EE環(huán)境

    專用,而是在java中的通用API。意味著我們可以在任何需要訪問關(guān)系數(shù)據(jù)庫的地方使用JPA,

    甚至包括面應(yīng)用。JPA也不要求一定在J2EE容器中才能運(yùn)行,而是任何有JVM的環(huán)境都可以運(yùn)用。

    這就使得我們可以很容易的把JPA作為一個(gè)持久化組件自由的和各種容器/框架(EJB3容器, Spring等等)組合。

       JPA最主要的是一個(gè)統(tǒng)一的persistence.xml配置文件,可以放到每一個(gè)jar的META-INF/目錄下面,配置內(nèi)容主要有

    (以hibernate為例)

    1、數(shù)據(jù)庫連接的配置文件

    2、數(shù)據(jù)庫方言、連接URL、用戶名、密碼

    3、ORM映射的列表(Class)

    4、配置其它的Hibernate屬性(其他的Provider屬性)

    5、cache

    主要內(nèi)容,詳細(xì)內(nèi)容請(qǐng)看hibernate的reference

    xml 代碼

    1. xml version="1.0" encoding="UTF-8"?>  
    2. <persistence>  
    3.    <persistence-unit name="TestEntityManager" transaction-type="RESOURCE_LOCAL">  
    4.       <provider>org.hibernate.ejb.HibernatePersistenceprovider>     
    5.       <class>com.jl.sub1.mapping.Productclass>  
    6.       <class>com.jl.sub1.mapping.ProductItemclass>  
    7.         
    8.       <properties>  
    9.           <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />  
    10.           <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />  
    11.           <property name="hibernate.connection.password" value="db2admin" />  
    12.           <property name="hibernate.connection.url" value="jdbc:db2://10.1.1.10:50000/dbjl" />  
    13.           <property name="hibernate.connection.username" value="db2admin" />  
    14.           <property name="hibernate.ejb.autodetection" value="class" />  
    15.     properties>               
    16.    persistence-unit>  
    17. persistence>  
    18.   
    19.   
    20.   
    21.   
    22. <property name="kodo.ConnectionDriverName" value="..."/>  
    23. <property name="kodo.ConnectionURL" value="..."/>  
    24. <property name="kodo.ConnectionUserName" value="..."/>  
    25. <property name="kodo.ConnectionPassword" value="..."/>  
    26. <property name="kodo.Log" value="DefaultLevel=INFO, Runtime=DEBUG, Tool=INFO"/>  
    27.              

     

    spring配置

    xml 代碼

    1. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">  
    2.     <property name="entityManagerName"         value="TestEntityManager" />     
    3.     <property name="jpaProperties">  
    4.         <props></props>  
    5.     </property>  
    6.       
    7. </bean>  
    8. <!-- 此處的名字要和persistence.xml中定義的name一致-->  
    9. <!-- jpaProperties此屬性必須要加,hibernate3.1.2的一個(gè)bug,否則會(huì)拋NullPointerException,springframework論壇告訴我的:)-->  
    10.   
    11. <bean class=  
    12.     "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
    13.     <!--貌似這個(gè)部分所有spring配置文件還是僅允許一個(gè),可以配置到公共的xml中-->  
    14.       
    15. <!--引用上面建立的entityManagerFactory-->  
    16. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
    17.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    18.           
    19. </bean>  
    20.   
    21. <bean id="transactionInterceptor"  
    22.     class="org.springframework.transaction.interceptor.TransactionInterceptor">  
    23.     <property name="transactionManager" ref="transactionManager" />  
    24.     <property name="transactionAttributeSource">  
    25.     <bean class=  
    26.     "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />  
    27.     </property>  
    28. </bean>  
    29.   
    30. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
    31.     <property name="transactionInterceptor" ref="transactionInterceptor" />  
    32. </bean>  
    33.   
    34. <!--自定義DAO-->  
    35. <bean id="numberDao" class="dao.JpaNumberDAO">  
    36.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    37. </bean>  
    38. <!--DAO需繼承自org.springframework.orm.jpa.support.JpaDaoSupport-->  
    39. <!--DAO中可以通過getJpaTemplate()的各種方法進(jìn)行持久化操作-->  

     

    這樣就好了,可以使用entitymanager,每個(gè)jar里面可以相互不用影響,而且這個(gè)也符合我們新過程改進(jìn)推進(jìn)的每個(gè)子系統(tǒng)用jar發(fā)布的原則,當(dāng)然這里的還有作service層,對(duì)于子系統(tǒng)之間的交互,我覺得,原則上應(yīng)該僅允許他們?cè)趕ervice的層面上進(jìn)行,在DAO之間不應(yīng)該有相互的交叉,不過隱約覺

    得還有很多東西要做,嗯,很晚了,肚子餓,明天再想,呵呵

    哦,對(duì)了,Spring真是好東西,封裝了這么多東西給我們用,真是期待更好的版本出來啊,

    還有,在j2se環(huán)境里,也可以通過代碼的方式取得JPA的api

    java 代碼

    1. EntityManagerFactory emf =  
    2. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    3. //此處的名字要和persistence.xml中  
    4.   
    5. //定義的name一致  
    6.   
    7.   
    8. EntityManager em = emf.createEntityManager();  
    9. ...//使用  
    10. em.close();  
    11. ...  
    12. emf.close();  
    13. EntityManagerFactory emf =  
    14. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    15. EntityManager em = emf.createEntityManager();  
    16. ...//使用  
    17. em.close();  
    18. ...  
    19. emf.close();  

    posted @ 2010-05-09 15:02 ourday 閱讀(1793) | 評(píng)論 (1)編輯 收藏

    使用注解元數(shù)據(jù)
    基本注解:
    例子:
    @Entity(name = "T_TOPIC") ①
    public class Topic implements Serializable ...{

    @Id ② -1

    @GeneratedValue(strategy = GenerationType.TABLE) ② -2

    @Column(name = "TOPIC_ID") ② -3

    private int topicId;

    @Column(name = "TOPIC_TITLE", length = 100) ③
    private String topicTitle;

    @Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④
    private Date topicTime;

    @Column(name = "TOPIC_VIEWS")

    private int topicViews;

    ...

    }



    解釋:
    ① Entity 標(biāo)明該類 (Topic) 為一個(gè)實(shí)體類,它對(duì)應(yīng)數(shù)據(jù)庫中的表表名是 T_TOPIC ,這里也可以寫成: @Entity

    @Table(name = "T_TOPIC") 其作用都是一樣的
    ② -1 Id 標(biāo)明該屬性對(duì)應(yīng)數(shù)據(jù)表中的主鍵
    ② -2 GeneratedValue 通過 strategy 屬性指明主鍵生成策略,默認(rèn)情況下, JPA 自動(dòng)選擇一個(gè)最適合底層數(shù)據(jù)庫的主鍵生成策略。在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
    1) IDENTITY :表自增鍵字段, Oracle 不支持這種方式;
    2) AUTO : JPA 自動(dòng)選擇合適的策略,是默認(rèn)選項(xiàng);
    3) SEQUENCE :通過序列產(chǎn)生主鍵,通過 @SequenceGenerator 注解指定序列名, MySql 不支持這種方式;
    4) TABLE :通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植。
    ② -3 Column 標(biāo)明這個(gè)屬性是數(shù)據(jù)表中的一列,該列的名字是 TOPIC_ID

    ③ Column 的一個(gè)屬性 length 指明的是該屬性的允許的長度。 ( 個(gè)人認(rèn)為設(shè)定該屬性只是對(duì)于程序中操作該屬性時(shí)增加了一驗(yàn)證過程,對(duì)數(shù)據(jù)庫中該列原來的設(shè)置并沒有影響,但是 length 屬性指定的值必須不能大于數(shù)據(jù)庫創(chuàng)建表時(shí)給該列限制的最大長度否則會(huì)出錯(cuò) )

    ④ Temporal(TemporalType.DATE) :如果屬性是時(shí)間類型,因?yàn)閿?shù)據(jù)表對(duì)時(shí)間類型有更嚴(yán)格的劃分,所以必須指定具體時(shí)間類型。在 javax.persistence.TemporalType 枚舉中定義了 3 種時(shí)間類型:
    1) DATE :等于 java.sql.Date

    2) TIME :等于 java.sql.Time

    3) TIMESTAMP :等于 java.sql.Timestamp



    繼承關(guān)系注解:
    對(duì)繼承關(guān)系進(jìn)行注解,必須在 父類 中聲明繼承實(shí)體的映射策略。
    例子:
    @Entity(name = "T_TOPIC")

    @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =

    DiscriminatorType.INTEGER, length = 1) ②
    @DiscriminatorValue(value="1") ③
    public class Topic implements Serializable ...{ … }



    解釋:
    ① Inheritance 通過 strategy 屬性指明實(shí)體的繼承策略。
    在 javax.persistence.InheritanceType 定義了 3 種映射策略:
    1) SINGLE_TABLE :父子類都保存到同一個(gè)表中,通過字段值進(jìn)行區(qū)分。
    2) JOINED :父子類相同的部分保存在同一個(gè)表中,不同的部分分開存放,通過表連接獲取完整數(shù)據(jù);
    3) TABLE_PER_CLASS :每一個(gè)類對(duì)應(yīng)自己的表,一般不推薦采用這種方式。
    ② DiscriminatorColumn 如果繼承策略采用第一種繼承策略,則需要指明區(qū)分父子類的字段, DiscriminatorColumn 就是用來指明區(qū)分字段的注解。
    ③ DiscriminatorValue 同樣的采用第一種繼承策略通過字段區(qū)分父子類,則用這個(gè)注解給該實(shí)體的區(qū)分字段賦值在這里賦的值為 ”1”.



    關(guān)聯(lián)關(guān)系注解:
    例子:
    @Entity @DiscriminatorValue(value="2") ①
    public class PollTopic extends Topic ...{ ②繼承于 Topic 實(shí)體
    private boolean multiple; ③
    @Column(name = "MAX_CHOICES")

    private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
    private Set options = new HashSet();

    // 省略 get/setter 方法
    }

    解釋 :

    ① 通過 @DiscriminatorValue 將區(qū)分字段 TOPIC_TYPE 的值為 2 。由于 PollTopic 實(shí)體繼承于 Topic 實(shí)體,其它的元數(shù)據(jù)信息直接從 Topic 獲得。
    ④ OneToMany 指定了一個(gè)一對(duì)多的關(guān)聯(lián)關(guān)系, mappedBy 屬性指定 “Many” 方類引用 “One” 方類 的屬性名; cascade 屬性指明了級(jí)聯(lián)方式(如果這里不指定為 CascadeType.ALL 的話,那么有關(guān)聯(lián)關(guān)系的兩個(gè)對(duì)象在做保存和刪除操作時(shí)要分別來進(jìn)行) 建議 :盡可能使用 cascade=CascadeType.ALL 來減少持久化操作的復(fù)雜性和代碼量
    注意 : JPA 規(guī)范規(guī)定任何屬性都默認(rèn)映射到表中,所以雖然我們沒有給③處的 multiple 屬性提供注解信息,但 JPA 將按照 默認(rèn)的規(guī)則對(duì)該字段進(jìn)行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個(gè)屬性持久化到數(shù)據(jù)表中,則可以通過 @Transient 注解顯式指定:
    @Transient

    private boolean tempProp1;





    @Entity(name="T_POLL_OPTION")

    Public class PollOption implements Serializable ...{

    @Id

    @GeneratedValue(strategy = GenerationType.TABLE)

    @Column(name = "OPTION_ID")

    private int optionId;

    @Column(name = "OPTION_ITEM")

    private String optionItem;

    @ManyToOne ①
    @JoinColumn(name="TOPIC_ID", nullable=false) ②
    private PollTopic pollTopic;

    }



    解釋:
    ① ManyToOne 描述了多對(duì)一的關(guān)聯(lián)關(guān)系,他是對(duì)該類引用的 ”One” 類 (PollTopic) 的屬性( pollTopic )進(jìn)行注解的。
    ② JoinColumn 指定關(guān)聯(lián) ”One”(PollTopic) 實(shí)體所對(duì)應(yīng)表的 “ 外鍵 ” 。


    Lob 字段的注解:
    在 JPA 中 Lob 類型類型的持久化很簡單,僅需要通過特殊的 Lob 注解就可以達(dá)到目的。
    例子:


    @Lob ① -1

    @Basic(fetch = FetchType.EAGER) ① -2

    @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ① -3

    private String postText;



    @Lob

    @Basic(fetch = FetchType. LAZY) ② -2

    @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ② -3

    private byte[] postAttach;



    解釋:
    ① -1 JPA 通過 @Lob 將屬性標(biāo)注為 Lob 類型 ;
    ① -2 通過 @Basic 指定 Lob 類型數(shù)據(jù)的獲取策略, FetchType.EAGER 表示非延遲 加載,而 FetchType. LAZY 表示延遲加載 ;
    ① -3 通過 @Column 的 columnDefinition 屬性指定數(shù)據(jù)表對(duì)應(yīng)的 Lob 字段類型。






    使用 XML 元數(shù)據(jù)


    除了使用注解提供元數(shù)據(jù)信息外, JPA 也允許我們通過 XML 提供元數(shù)據(jù)信息。按照 JPA 的規(guī)范, 如果你提供了 XML 元數(shù)據(jù)描述信息,它將覆蓋實(shí)體類中的注解元數(shù)據(jù)信息 。 XML 元數(shù)據(jù)信息以 orm.xml 命名,放置在類路徑的 META-INF 目錄下。


    <?xml version="1.0" encoding="UTF-8"?>

    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

    version="1.0">

    ①實(shí)體對(duì)象所在的包
    <package>com.baobaotao.domain</package>

    <entity class="Topic">

    ② Topic 實(shí)體配置

    <table name="T_TOPIC" />

    <attributes>

    <id name="topicId">

    <column name="TOPIC_ID"/>

    <generated-value strategy="TABLE" />

    </id>

    <basic name="topicTitle">

    <column name="TOPIC_TITLE" length="30" />

    </basic>

    <basic name="topicTime">

    <column name="TOPIC_TIME" />

    <temporal>DATE</temporal>

    </basic>

    <basic name="topicViews">

    <column name="TOPIC_VIEWS" />

    </basic>

    </attributes>

    </entity>

    <entity class="PollTopic">

    ② PollTopic 實(shí)體配置

    <discriminator-value>2</discriminator-value>

    <attributes>

    <basic name="maxChoices">

    <column name="MAX_CHOICES" />

    </basic>

    <one-to-many name="options" mapped-by="pollTopic">

    <cascade>

    <cascade-all/>

    </cascade>

    </one-to-many>

    </attributes>

    </entity>

    <entity class="PollOption">

    ② PollOption 實(shí)體配置

    <table name="T_POLL_OPTION" />

    <attributes>

    <id name="optionId">

    <column name="OPTION_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="optionItem">

    <column name="OPTION_ITEM"/>

    </basic>

    <many-to-one name="pollTopic" >

    <join-column name="TOPIC_ID" nullable="false"/>

    </many-to-one>

    </attributes>

    </entity>

    <entity class="Post">

    ② Post 實(shí)體配置

    <table name="T_POST" />

    <attributes>

    <id name="postId">

    <column name="POST_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="postText" fetch="EAGER">

    <column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/>

    <lob/>

    </basic>

    <basic name="postAttach" fetch="LAZY">

    <column name="POST_ATTACH" column-definition="BLOB"/>

    <lob/>

    </basic>

    </attributes>

    </entity>

    </entity-mappings>



    使用這個(gè) orm.xml 來描述實(shí)體信息的話,這里并沒有標(biāo)明兩個(gè)繼承類之間的關(guān)系,其繼承信息將從實(shí)體類反射信息獲取。


    到這里我們的實(shí)體描述結(jié)束了,當(dāng)然我們只是做了比較簡單的描述,對(duì)于那些復(fù)雜的信息描述并沒有進(jìn)行講述。實(shí)體描述結(jié)束了,有人會(huì)問如果我要來操作這些實(shí)體該怎么操作?這就是我們接下來要講述的問題。


    EntityManager 介紹

    實(shí)體對(duì)象由實(shí)體管理器進(jìn)行管理, JPA 使用 javax.persistence.EntityManager 代表實(shí)體管理器。實(shí)體管理器和持久化上下文關(guān)聯(lián),持久化上下文是一系列實(shí)體的管理環(huán)境,我們通過 EntityManager 和持久化上下文進(jìn)
    posted @ 2010-05-09 14:57 ourday 閱讀(1341) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 色欲A∨无码蜜臀AV免费播| 一级午夜a毛片免费视频| 91福利视频免费观看| 亚洲高清在线视频| 人人揉揉香蕉大免费不卡| 亚洲国产精品特色大片观看完整版 | 亚洲精品无码久久毛片| 色多多免费视频观看区一区| 国产免费观看青青草原网站| 在线播放亚洲精品| 亚洲视频一区二区| 国产一级一毛免费黄片| 亚洲a一级免费视频| 精品无码AV无码免费专区| 亚洲色图视频在线观看| 精品久久久久成人码免费动漫| 亚洲二区在线视频| 日本一区免费电影| 久香草视频在线观看免费| 亚洲国产精彩中文乱码AV| 99re6热视频精品免费观看| 亚洲国产理论片在线播放| 好爽又高潮了毛片免费下载| 国产成人精品亚洲一区| 区久久AAA片69亚洲| 5555在线播放免费播放| 亚洲砖码砖专无区2023| 亚洲国产精品一区二区三区久久 | 亚洲精品偷拍无码不卡av| 久久久久国色AV免费观看性色| 亚洲AV无码AV日韩AV网站| 亚洲中文字幕成人在线| 1000部无遮挡拍拍拍免费视频观看| 亚洲中文字幕无码中文字| 亚洲午夜精品久久久久久浪潮| 免费看男人j放进女人j免费看| 456亚洲人成影院在线观| 国产综合精品久久亚洲| 国产91色综合久久免费| 美女被免费视频网站a| 久久久亚洲欧洲日产国码aⅴ|