首页 > 学院 > 开发设计 > 正文

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.映射双向多对多的关联关系
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表