JPA &Spring Date

来源:互联网 发布:笔记本mac地址怎么修改 编辑:程序博客网 时间:2024/06/05 19:57
JPA是什么?
java Persistence API:用于对象持久化的API


JPA和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)
@Id
public 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.创建EntityManagerFactory
String persistenceUnitName="jpa-1";
EntityManagerFactory entityManagerFactory=
Persistence.createEntityManagerFactory(persistenceUnitName);

//2.创建EntityManager
EntityManager 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.关闭EntityManager
entityManager.close();

//7.关闭EntityManagerFactory
entityManagerFactory.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()方法,默认即为@Basic
fetch:表示该属性的读取策略,有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相关接口/类:Persistence
persistence类是用于获取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语句查询实体。
实体状态:
--新建状态:新创建的对象,尚未拥有持久性主键
--持久化状态:已经拥有持久性主键并和持久化建立了上下文关系
--游离状态:拥有持久性主键,但是没有与持久化建立上下文环境
--删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除


find
getReference
persist
remove


merge: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.映射双向多对多的关联关系












0 0
原创粉丝点击