總結(jié)精煉于http://www.yiibai.com/jpa/jpa_architecture.html
其他不錯(cuò)的文章:介紹Jpa注解(注意Mybatis可沒(méi)有實(shí)現(xiàn)Jpa)http://blog.csdn.net/u014421556/article/details/52040263
JPA(Java持久性API)是存儲(chǔ)業(yè)務(wù)實(shí)體關(guān)聯(lián)的實(shí)體的來(lái)源鲜结。它顯示了如何定義一個(gè)面向普通Java對(duì)象(POJO)作為一個(gè)實(shí)體黍衙,以及如何與管理關(guān)系實(shí)體墓贿。
類疾病的結(jié)構(gòu)圖如下
單元 描述
EntityManagerFactory 這是一個(gè)EntityManager的工廠類。它創(chuàng)建并管理多個(gè)EntityManager實(shí)例册着。
EntityManager 這是一個(gè)接口,它管理的持久化操作的對(duì)象。它的工作原理類似工廠的查詢實(shí)例。
Entity 實(shí)體是持久性對(duì)象是存儲(chǔ)在數(shù)據(jù)庫(kù)中的記錄慨仿。
EntityTransaction 它與EntityManager是一對(duì)一的關(guān)系。對(duì)于每一個(gè)EntityManager纳胧,操作是由EntityTransaction類維護(hù)镰吆。
Persistence 這個(gè)類包含靜態(tài)方法來(lái)獲取EntityManagerFactory實(shí)例。
Query 該接口由每個(gè)JPA供應(yīng)商躲雅,能夠獲得符合標(biāo)準(zhǔn)的關(guān)系對(duì)象鼎姊。
——————
類和接口之間的關(guān)系屬于javax.persistence包骡和。下圖顯示了它們之間的關(guān)系相赁。
EntityManagerFactory和EntityManager的關(guān)系是1對(duì)多相寇。這是一個(gè)工廠類EntityManager實(shí)例。
EntityManager和EntityTransaction之間的關(guān)系是1對(duì)1钮科。對(duì)于每個(gè)EntityManager操作唤衫,只有一個(gè)EntityTransaction實(shí)例。
EntityManager和Query之間的關(guān)系是1對(duì)多绵脯。查詢數(shù)眾多可以使用一個(gè)EntityManager實(shí)例執(zhí)行佳励。
EntityManager實(shí)體之間的關(guān)系是1對(duì)多。一個(gè)EntityManager實(shí)例可以管理多個(gè)實(shí)體蛆挫。
————————
對(duì)象關(guān)系映射
對(duì)象關(guān)系映射(ORM)簡(jiǎn)要地告訴什么是ORM以及它是如何工作赃承。 ORM是從對(duì)象類型的數(shù)據(jù)隱蔽到關(guān)系型沪猴,反之亦然編程能力魏蔗。
ORM主要特征是映射或綁定一個(gè)目的是它的數(shù)據(jù)庫(kù)中的數(shù)據(jù)。而映射民假,我們要考慮的任何其他表中的數(shù)據(jù)可免,數(shù)據(jù)的類型抓于,并具有自一個(gè)或多個(gè)實(shí)體的關(guān)系。
高級(jí)功能
慣用的持久性:它使您能夠編寫(xiě)使用面向?qū)ο蟮念惓志眯灶悺?br> 高性能:它有許多抓取技術(shù)和充滿希望的鎖定技術(shù)浇借。
可靠的:它是高度穩(wěn)定的捉撮,被很多專業(yè)程序員。
ORM架構(gòu)
在ORM架構(gòu)如下所示妇垢。
在上述體系結(jié)構(gòu)解釋了如何對(duì)象數(shù)據(jù)存儲(chǔ)到關(guān)系數(shù)據(jù)庫(kù)中的三個(gè)階段巾遭。
第1階段
第一階段,命名為對(duì)象數(shù)據(jù)階段修己,包括POJO類恢总,服務(wù)接口和類。它是主要的業(yè)務(wù)組件層睬愤,其具有業(yè)務(wù)邏輯操作和屬性片仿。
例如,讓我們舉個(gè)員工數(shù)據(jù)庫(kù)的架構(gòu)尤辱。
Employee POJO類包含屬性砂豌,如ID,姓名光督,工資和標(biāo)識(shí)阳距。它也包含類似屬性setter和getter方法。
Employee DAO/服務(wù)類包含服務(wù)方法结借,如建立員工筐摘,發(fā)現(xiàn)員工和刪除員工。
第2階段
第二階段,稱為映射或持久性的階段咖熟,包括JPA提供者圃酵,映射文件(orm.xml),JPA裝載器和對(duì)象網(wǎng)格馍管。
JPA提供者:這是一個(gè)包含了JPA(javax.persistence)供應(yīng)的產(chǎn)品郭赐。例如EclipseLink,Toplink确沸,Hibernate等捌锭。
映射文件:映射文件(orm.xml中)包含在關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)POJO類的數(shù)據(jù)和數(shù)據(jù)之間的映射配置。
JPA裝載器:在JPA加載器的工作原理就像一個(gè)高速緩沖存儲(chǔ)器罗捎。它可以加載關(guān)系網(wǎng)格數(shù)據(jù)观谦。它的工作原理類似數(shù)據(jù)庫(kù)的副本與服務(wù)類POJO數(shù)據(jù)(POJO類的屬性)進(jìn)行交互。
對(duì)象網(wǎng)格:它是可存儲(chǔ)的關(guān)系數(shù)據(jù)的副本桨菜,如高速緩沖存儲(chǔ)器的臨時(shí)位置坎匿。對(duì)數(shù)據(jù)庫(kù)的所有查詢首先被實(shí)現(xiàn)在對(duì)象網(wǎng)格的數(shù)據(jù)。只有提交它才會(huì)影響到主數(shù)據(jù)庫(kù)雷激。
第3階段
第三階段是關(guān)系數(shù)據(jù)相關(guān)替蔬。它包含在邏輯上連接到所述業(yè)務(wù)組件的關(guān)系數(shù)據(jù)。如上所討論的屎暇,僅當(dāng)業(yè)務(wù)組件提交該數(shù)據(jù)承桥,它被存儲(chǔ)到數(shù)據(jù)庫(kù)中的物理。在此之前根悼,已修改的數(shù)據(jù)被存儲(chǔ)在高速緩沖存儲(chǔ)器作為一個(gè)網(wǎng)格格式凶异。在獲取數(shù)據(jù)的過(guò)程和存儲(chǔ)數(shù)據(jù)是相同的。
上述三個(gè)階段的編程交互的機(jī)制被稱為對(duì)象關(guān)系映射挤巡。
————————
http://www.yiibai.com/jpa/jpa_orm_components.html#article-start
mapping.xml文件指示JPA的供應(yīng)者來(lái)映射實(shí)體類與數(shù)據(jù)庫(kù)表剩彬。
也可以用注解。
注解 描述
@Entity 聲明類為實(shí)體或表矿卑。
@Table 聲明表名喉恋。
@Basic 指定非約束明確的各個(gè)字段。
@Embedded 指定類或它的值是一個(gè)可嵌入的類的實(shí)例的實(shí)體的屬性母廷。
@Id 指定的類的屬性轻黑,用于識(shí)別(一個(gè)表中的主鍵)。
@GeneratedValue 指定如何標(biāo)識(shí)屬性可以被初始化琴昆,例如自動(dòng)氓鄙,手動(dòng),或從序列表中獲得的值业舍。
@Transient 指定的屬性抖拦,它是不持久的升酣,即,該值永遠(yuǎn)不會(huì)存儲(chǔ)在數(shù)據(jù)庫(kù)中态罪。
@Column 指定持久屬性欄屬性拗踢。
@SequenceGenerator 指定在@GeneratedValue注解中指定的屬性的值。它創(chuàng)建了一個(gè)序列向臀。
@TableGenerator 指定在@GeneratedValue批注指定屬性的值發(fā)生器。它創(chuàng)造了的值生成的表诸狭。
@AccessType 這種類型的注釋用于設(shè)置訪問(wèn)類型券膀。如果設(shè)置@AccessType(FIELD),然后進(jìn)入FIELD明智的驯遇。如果設(shè)置@AccessType(PROPERTY)芹彬,然后進(jìn)入屬性發(fā)生明智的。
@JoinColumn 指定一個(gè)實(shí)體組織或?qū)嶓w的集合叉庐。這是用在多對(duì)一和一對(duì)多關(guān)聯(lián)舒帮。
@UniqueConstraint 指定的字段和用于主要或輔助表的唯一約束。
@ColumnResult 參考使用select子句的SQL查詢中的列名陡叠。
@ManyToMany 定義了連接表之間的多對(duì)多一對(duì)多的關(guān)系玩郊。
@ManyToOne 定義了連接表之間的多對(duì)一的關(guān)系。
@OneToMany 定義了連接表之間存在一個(gè)一對(duì)多的關(guān)系枉阵。
@OneToOne 定義了連接表之間有一個(gè)一對(duì)一的關(guān)系译红。
@NamedQueries 指定命名查詢的列表。
@NamedQuery 指定使用靜態(tài)名稱的查詢兴溜。
Java Bean標(biāo)準(zhǔn)
Java類封裝了實(shí)例的值及其行為為對(duì)象稱為一個(gè)單元侦厚。 Java Bean是一個(gè)臨時(shí)的存儲(chǔ)和可重用的組件或?qū)ο蟆K怯幸粋€(gè)默認(rèn)的構(gòu)造函數(shù)和getter和setter方法來(lái)初始化實(shí)例序列化的類單獨(dú)的屬性拙徽。
Bean約定
bean包含其默認(rèn)構(gòu)造函數(shù)或包含序列化實(shí)例的文件刨沦。因此,一個(gè)bean可以實(shí)例化另一個(gè)bean膘怕。
bean屬性可以被隔離成布爾屬性或者非布爾屬性想诅。
非布爾屬性包含getter和setter方法。
布爾屬性包含setter和方法岛心。
任何字段的getter方法應(yīng)從小字母get(Java方法的公約)開(kāi)始侧蘸,之后使用大寫(xiě)字母開(kāi)頭的字段名。例如鹉梨,字段名為salary讳癌,因此這一字段的getter方法為getSalary()。
任何屬性的setter方法應(yīng)該先從小字母的集合(Java方法公約)開(kāi)始存皂,繼續(xù)以大寫(xiě)字母晌坤,參數(shù)值設(shè)置為字段開(kāi)頭的字段名逢艘。例如,字段名為salary骤菠,因此這一字段的setter方法是setSalary(double sal )它改。
對(duì)于布爾型屬性,方法是檢查它是否是 true 或 false商乎。例如央拖,Boolean屬性為空,則該字段的就是方法isEmpty()鹉戚。
————————————————————
JPA實(shí)體管理器
就是幾個(gè)例子鲜戒。
創(chuàng)建:
public class CreateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee = new Employee( );
employee.setEid( 1201 );
employee.setEname( "Gopal" );
employee.setSalary( 40000 );
employee.setDeg( "Technical Manager" );
entitymanager.persist( employee );
entitymanager.getTransaction( ).commit( );
entitymanager.close( );
emfactory.close( );
}
}
更新Employee:
public class UpdateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee=entitymanager.
find( Employee.class, 1201 );
//before update
System.out.println( employee );
employee.setSalary( 46000 );
entitymanager.getTransaction( ).commit( );
//after update
System.out.println( employee );
entitymanager.close();
emfactory.close();
}
}
————————————
還有持久化語(yǔ)言:JPQL
public class ScalarandAggregateFunctions
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager();
//Scalar function
Query query = entitymanager.
createQuery("Select UPPER(e.ename) from Employee e");
List<String> list=query.getResultList();
for(String e:list)
{
System.out.println("Employee NAME :"+e);
}
//Aggregate function
Query query1 = entitymanager.
createQuery("Select MAX(e.salary) from Employee e");
Double result=(Double) query1.getSingleResult();
System.out.println("Max Employee Salary :"+result);
}
}
————
再高級(jí)映射,就是支持繼承抹凳,支持一對(duì)一遏餐、多對(duì)多之類的。
————
還有表中API赢底。就是用方法進(jìn)行CURD操作失都。
————