国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JPA &Spring Date

2019-11-06 06:22:11
字體:
來源:轉載
供稿:網友
JPA是什么?java Persistence API:用于對象持久化的APIJPA和Hibernate 的關系:JPA是hibernate的一個抽象(就像JDBC和JDBC驅動的關系)--JPA是規范:JPA本質上就是一種ORM規范,不是ORM框架。因為JPA并未提供ORM實現,他只是制定了一些規范,提供了一些編程的API接口,但具體實現則由ORM廠商提供實現--Hibernate是實現:Hibernate除了作為ORM框架之外,他也是一種JPA實現從功能上說,JPA是Hibernate功能的一個子集。JPA優勢:標準化:提供相同的API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行簡單易用,集成方便:提供更加簡單的編程模型,在JPA框架下創建實體和創建java類一樣簡單,只需使用javax.persistence.Entity進行注釋可媲美JDBC的查詢能力:JAP定義了獨特的JPQL,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING等通常只有SQL才能提供的高級查詢特性,甚至還能支持子查詢。支持面向對象的高級特性:類之間的繼承,多態和類之間的復雜關系,最大限度地使用面向對象的模型JPA包括3方面技術:ORM映射元數據:JPA支持xml和jdk5.0注解兩種元數據形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中。JPA的API:用來操作實體對象,執行CRUD操作,框架在后臺完成所有事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。查詢語言(JPQL):這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序和具體的SQL緊密耦合。使用JPA持久化對象的步驟:1.創建persistence.xml,在這個文件中配置持久化單元--需要指定跟哪個數據庫進行交互--需指定JPA使用哪個持久化的框架以及配置該框架的基本屬性2.創建實體類,使用annotation(注解)來描述實體類跟數據庫表之間的映射關系。3.使用JPA API完成數據增加、刪除、修改和查詢操作--創建EntityManagerFactory(對應Hibernate中的sessionFaction)--創建EntityManager(對應Hibernate中的Session)注:JPA規范要求在類路徑的META-INF目錄下放置persistence.xml,文件名稱是固定的。例:配置文件persistence.xml:<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL"><!-- 配置使用什么ORM產品來作為JPA的實現1.實際上是配置javax.persistence.spi.persistencePRovider接口實現類2.若JPA項目中只有一個JPA實現產品,則也可以不配置該節點--><provider>org.hibernate.ejb.HibernatePersistence</provider><!-- 添加持久化類 --><class>com.edu.zhku.Customer</class><properties><!-- 連接數據庫基本信息 --><property name="javax.persistence.jdbc.driver" value="com.MySQL.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql://jpa"/><property name="javax.persistence.jdbc.user" value="root"/><!-- 配置JPA實現產品的基本屬性,配置 hibernate的基本屬性 --><property name="hibernate.format_sql" value="true"/><property name="hibernate.show_sql" value="true"/><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit></persistence>實體類:Customer.java:package com.edu.zhku;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Table(name="JPA_CUSTOMERS")@Entity()public class Customer {private Integer id;private String lastName;private String emial;private int age;@Column(name="ID")@GeneratedValue(strategy=GenerationType.AUTO)@Idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(name="LAST_NAME")public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmial() {return emial;}public void setEmial(String emial) {this.emial = emial;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}主類:Main.java:package com.edu.zhku;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;public class Main {public static void main(String[] args) {//1.創建EntityManagerFactoryString persistenceUnitName="jpa-1";EntityManagerFactory entityManagerFactory=Persistence.createEntityManagerFactory(persistenceUnitName);//2.創建EntityManagerEntityManager entityManager=entityManagerFactory.createEntityManager();//3.開啟事務EntityTransaction transaction=entityManager.getTransaction();transaction.begin();//4.進行持久化操作Customer customer=new Customer();customer.setAge(15);customer.setEmial("zhang@QQ.com");customer.setLastName("zhang");entityManager.persist(customer);//5.提交事務transaction.commit();//6.關閉EntityManagerentityManager.close();//7.關閉EntityManagerFactoryentityManagerFactory.close();}}JPA基本注解:@Entity 標注用于實體類聲明語句之間,指出該java類為實體類,將映射到指定的數據庫表。如聲明一個Customer實體類,它將映射到數據庫中的customer表上。@Table 當實體類與其映射的數據庫表名不同時需要使用@Table標注說明,該標注與@Table標注并列使用,置于實體類聲明語句之前。@Table常用的選項是name,用于指明數據庫表名@Table還有兩個選項catalog和schema用于設置表所屬的數據庫目錄或模式,通常為數據庫名。uniqueConstraints選項用于設置約束條件,通常不需要設置@Id 標注用于聲明一個實體類的屬性映射為數據庫的主鍵列,該屬性通常設置于聲明再語句之前,也可設置于getter方法之前。@GeneratedValue 用于標注主鍵的生成策略,通過strategy屬性指定。默認情況下JPA自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer對應identity,MySql對應auto increment。在javax.persistence.GenerationType中定義了一下集中可供選擇的策略:--IDENTITY:采用數據庫ID自增長的方式來自增主鍵字段,Oracle不支持這種方式--AUTO: JPA自動選擇合適的策略,是默認選項--SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator注解指定序列名,Mysql不支持這種方式。--TABLE:通過表產生主鍵,框架值由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。@Basic 表示一個簡單的屬性到數據庫表的字段的映射,對于沒有任何標注的getXxxx()方法,默認即為@Basicfetch:表示該屬性的讀取策略,有EAGER和LAZY兩種,分別表示主支抓取和延遲加載,默認為true。option:表示該屬性是否允許為null,默認為true。@Column 當實體屬性與其映射的數據表的列不同名時需要使用,該標注通常設置于屬性的聲明預計之前,也可置于getter方法之前。常用屬性是name,用于設置映射數據庫表的列名,此外還有其它屬性,如unique、nullable、length等。columnDefinition屬性表示字段在數據庫中的實際類型。通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對于Date類型仍無法確定數據庫中字段類型究竟是DATE、TIME還是TIMESTAMP。此外,String默認映射類型為VARCHAR,可以將String類型映射為BLOB或TEXT字段類型@Transient 表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略該屬性如果一個屬性并非數據庫表的字段映射,就務必將其表示為@Transient,否則ORM框架默認其注解為@Basic。@Temporal 在核心java API中并沒有定義Date類型的精度(temporal precision),而在數據庫中,表示Date類型的數據有DATE、TIME、TIMESTMP三種精度,在進行屬性映射時可以使用@Temporal注解來調整精度。用table來生成主鍵詳解:將當前主鍵的值單獨保存到一個數據庫的表中,主鍵的值每次都是從指定的表中查詢來獲得。這種方法生成的主鍵的策略可以使用于任何數據庫,不必擔心不同數據庫不兼容的問題。JPA API:JPA相關接口/類:Persistencepersistence類是用于獲取EntityManagerFactory實例。該類包含一個名為createEntityManagerFactory的靜態方法。createEntityManagerFactory方法有如下兩個重載版本,--帶有一個參數的方法以JPA配置文件persistence.xml中的持久化單元名為參數--帶有兩個參數的方法,前一個參數含義相同,后一個參數Map類型,用于設置JPA的相關屬性,這時將忽略其它地方設置的屬性,Map對象的屬性名必須是JPA實現庫提供商的名字空間約定的屬性名。EntityManagerFactory接口主要用來創建EntityManager實例,該接口約定了如下4個方法,--createEntityManager():用于創建實體管理對象實例--createManager(Map map):用于創建實體管理對象實例的重載方法,Map參數用于提供EntityManager的屬性。--isOpen():檢查EntityManagerFactory是否處于打開狀態。實體管理工廠創建后一直處于打開狀態,除非調用close方法。--close():關閉EntityManagerFactory。EntityManagerFactory關閉后將釋放所有資源,isOpen方法測試將返回false。EntityManager:在JPA規范中,EntityManager是完成持久化操作的核心對象。實體作為普通java對象,只有在調用EntityManager將其持久化后才會變成持久化對象。EntityManager對象在一組實體類與底層數據庫之間進行O/R映射管理。它可以用來管理和更新Entity Bean,根據主鍵查找Entity Bean,還可以通過JPQL語句查詢實體。實體狀態:--新建狀態:新創建的對象,尚未擁有持久性主鍵--持久化狀態:已經擁有持久性主鍵并和持久化建立了上下文關系--游離狀態:擁有持久性主鍵,但是沒有與持久化建立上下文環境--刪除狀態:擁有持久化主鍵,已經和持久化建立上下文環境,但是從數據庫中刪除findgetReferencepersistremovemerge:merge()用于處理Entity同步。即數據庫的插入和更新操作flush():同步持久上下文環境,即將持久上下文環境的所有未保存實體的信息保存到數據庫中。setFlushMode(FlushModeType flushModel):設置持久上下文環境的Flush模式。參數可以取兩個枚舉,--FlushModeType.AUTO為自動更新數據庫實體--FlushModeType.COMMIT為直到提交事務時才更新數據庫記錄getFlushMode():獲取上下文環境的Flush模式。返回FlushModel類的枚舉值。refresh(Object entity):用數據庫實體記錄的值更新實體對象的狀態,即更新實體的屬性值clear():清除持久上下文環境,斷開所有關聯的實體。如果這時還有未提交的更新則會被撤銷contains(Object entity):判斷一個實例是否屬于當前持久上下文環境管理的實體isOpen():判斷當前的實體管理是否為打開狀態getTransaction():返回資源層的事務對象。EntityTransation實例可以用于開始和提交事務。close():關閉實體管理器。映射關聯關系:1.映射單向多對一的關聯關系2.映射單向一對多的關聯關系3.映射雙向多對一的關聯關系4.映射雙向一對一的關聯關系5.映射雙向多對多的關聯關系
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥芬河市| 白朗县| 锡林郭勒盟| 乌拉特后旗| 阳原县| 商都县| 科技| 台北县| 玉树县| 天全县| 郓城县| 莫力| 枣阳市| 措美县| 靖安县| 海原县| 安徽省| 彩票| 黔东| 康平县| 峡江县| 慈利县| 西充县| 乌鲁木齐市| 黑山县| 墨玉县| 梁平县| 绩溪县| 湾仔区| 黎平县| 胶州市| 达孜县| 鄂州市| 平果县| 邢台县| 双城市| 乌兰浩特市| 泗水县| 广昌县| 台安县| 微博|