文档章节

JPA

快乐搬砖
 快乐搬砖
发布于 2019/09/20 16:41
字数 2279
阅读 30
收藏 0

3 月,跳不动了?>>>

简介


JPA介绍

JPA是Java Persistence API的简称,java持久层的API
JPA作为 Java EE 5.0 平台标准的 对象关系映射(ORM) 规范
ORM:对象 关系 映射

关系图

JPA的hibernate区别


JPA它是ORM的规范,hibernate是其中一个实现框架

JPA与JDBC的区别


JDBC


优点:
	直接底层操作,访问数据库的简单,跨平台性比较强。
	灵活性比较强,可以写很复杂的SQL语句。

缺点:
	代码重复性比较高
	封装数据 比较麻烦
	移植数据库比较麻烦
	没有缓存---提高的访问速度
	面向sql。不是面向对象操作

JPA


优点:
	重复性代码不多完成crud只需要调用方法就可以搞定
	移植数据很方便,到时候只需要配置一些方言就可以搞定
	提供的世界级缓存支持(一级缓存 二级缓存)
	不用写sql ,会自动生成
	面向对象操作,操作对象就相当于操作数据库,但是jpa也是支持sql

缺点:
	有时候,我们不能干预sql的生成,如果对sql要求比较高,不适合使用jpa。
	而且数据量太大,比如表里面有上亿条数据,有些性能无法控制。

JPA的自动创建表策略


<property name="hibernate.hbm2ddl.auto" value="update" />

create		创建策略 表示每次操作的时候,都要先删除表,在创建表
create-drop	创建删除策略 每次在操作的时候,先删除表 在创建表 在删除表
update		更新策略没有会在数据库创建出来
validate	验证策略验证数据库配置和实体对象配置是否一致,如果不一致就会报错
			比如数据库没有表,有对应的实体对象 报错
			数据库少字段 username,实体对象有username ,会报错

JPA的使用


写一个工具类 获得实体管理工厂,获得实体管理器

public class JpaUtil {

    private static EntityManagerFactory entityManagerFactory;

    static {
        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("持久化单元名");
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public static EntityManager getEntityManager(){
        return entityManagerFactory.createEntityManager();
    }

}

常用方法


Persistence
public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName)
创建并返回指定持久性单元的 EntityManagerFactory
EntityManagerFactory
public EntityManager createEntityManager()
创建新的 EntityManager。

public void close()
关闭工厂,释放它占用的所有资源。
EntityManager
public void persist(Object entity)
使实体实例被管理并持久化。

public void remove(Object entity)
移除实体实例。

<T> T merge(T entity)
将给定实体的状态合并到当前持久性上下文中。

<T> T find(Class<T> entityClass,Object primaryKey)
按主键查找

public Query createQuery(String qlString)
创建 Query 实例以执行 Java Persistence 查询语言语句。 

public EntityTransaction getTransaction()
返回资源级的事务对象。EntityTransaction 实例可以连续使用,以开始和提交多个事务。

public void refresh(Object entity)
从数据库刷新实例的状态,重写对实体所作的更改

public void clear()
清除持久性上下文,使所有被管理的实体变为脱离实体。尚未刷新到数据库的实体更改不具有持久性。

public void detach(Object entity);
拆分
EntityTransaction
public void begin()
开始资源事务。

public void commit()
提交当前事务,将未刷新的更改写入数据库。

注解


@Entity   标注位置:实体类声明语句之前;
  主要作用:标注该Java类为实体类,且将其映射到指定的数据库表。

@Table   标注位置:实体类声明语句之前,与@Entity注释并列使用;
  主要作用:标注当前实体类映射到数据库中的数据表名,当实体类与数据表名不同时使用。

@Id   标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
  主要作用:指定该实体类的当前属性映射到数据表的主键列。

@Column   标注位置:实体类的属性声明语句之前,或属性的getter()方法之前。
  主要作用:标注实体类的当前属性映射到数据库表的字段名,自定义属性

@Temporal
  标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
  主要作用:标注实体类中Date类型(Java核心API中未定义Date类型的精度)的属性映射到数据表字段的具体精度(数据库中Date类型的数据有DATE、TIME和TIMESTAMP三种精度)。

@Lob
  Lob指定一个属性作为数据库支持的大对象类型在数据库中存储。
  使用LobType这个枚举来定义Lob是二进制类型还是字符类型。

@Transient
  标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
  主要作用:标注实体类的当前属性不进行数据表字段的映射,ORM框架将忽略此映射,如实体类的getInfo()方法通常不需要映射到数据表的字段上。

@GeneratedValue
  默认使用(strategy = GenerationType.AUTO)
  自己会根据配置的方言 来选择使用的生成策略 -- 主键自增mysql --序列(oracle)

@JoinColumn
  如果实体类上定义了多对一等等,就要用JoinColumn来定义关系的属性。

@Cacheable(true)
  表示开启二级缓存

细节的配置


JPA的主键生成策略


主键:
	唯一标识 每一行的数据 比如 id =1
	特点:非空且唯一

主键分类:
	代理主键 :没有实际意义的一些列作为主键 比如id 现在就用的代理主键
	自然主键 :具体实际意义的列作为的主键 比如 身份证号
@Id
@GeneratedValue
private Long id;

使用@GeneratedValue注解
默认使用 等效于(strategy = GenerationType.AUTO)
自己会根据配置的方言,来选择使用的生成策略
主键自增mysql 序列(oracle)

Hibernate底层还很多生成策略
JPA提供四种生成策略,我们常用是auto

JPA的实体状态


瞬时状态刚刚new		创建出来,没有和entityManager发生关系  
托管状态(持久状态)	已经和entityManager发生关系  
脱管状态(游离状态)	已经和entityManager脱离关系  
删除状态		如果我们要删除一个内容 remove 这个对象的状态就是删除状态

脏数据更新


  脏数据更新是允许存在的,当你修改一个持久化数据的非主键值在commi时,它会判断你内存里面的值是否与缓存里面的值相等,如果不等那么它就会自动发送update语句更新,如果相等就不发送。

主键的值不能修改

实体定义规则


实体类不能定义成final类型 lazyload 在使用懒加载的时候,会在内存里面创建一个子类

实体里面的字段 全部包装类型 底层很多代码都是判断 是否为null

如果实体里面有有参数的构造方法,一定要提供一个无参数构造方法 比如使用find,要使用无参数的构造方法创建对象

实体之间的关系


依赖关系:
  依赖注入DI:把对象注入到类里面这个过程 就叫依赖注入 (IOC控制反转)

关联关系:
  一对多 多对多 一对一

组合关系:
  多对一或者一对多 整体和部分之间,整体和部分不能分割
  例如:
    在项目中涉及单据的地方
    人和人的部位

聚合关系:
  多对一或者一对多 整体和部分之间,整体和部分可以分开存在   例如:
    电脑台式机 鼠标 硬盘 风扇

泛化关系: 体现继承

单向一对多

测试代码

查询-抓取策略


抓取策略fetch:就是告诉JPA使用什么方式去获取的数据

缓存


  先从数据库把数据查询出来,放入缓存里面(内存Map),下来查询数据的时候,先从缓存里找,如果有,直接取出,如果没有,在发送sql查询数据,放入缓存。

这样做可以减少提高查询效率。

一级缓存


是框架自带的缓存,不用做任何配置,就可以使用,它是属于entitymanager级别上面的缓存

命中条件:同一个EntityManagerFactory 同一个EntityManager 同一个OID

二级缓存


不是框架自带的,需要做配置,才能使用,它是属于EntityManagerFactory级别

命中条件:同一个EntityManagerFactory 不同的EntityManager 同一个OID

pom.xml配置导包
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>4.3.8.Final</version>
</dependency>
perisistenc.xml配置
<!-- 开启二级缓存-->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<!--二级缓存实现类-->
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />

查询缓存命中条件

  同一个EntityManagerFactory,不同的EntityManager 发出jpql语句相同,条件值相同用的很少,条件值相同情况下 很少,命中很低

<property name="hibernate.cache.use_query_cache" value="true" />

© 著作权归作者所有

下一篇: Redis-cluster
快乐搬砖
粉丝 0
博文 17
码字总数 25526
作品 0
武汉
私信 提问
加载中

评论(0)

tomcat 5.5 部署项目报错 关于Filter的错误。。

我在tomcat7.0部署没不报错,但是再tomcat5.5就会报错。。 listener.ContextListener UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter logLevel WARN UrlRewriteFilte......

庄泽锐
2014/03/06
1.5K
5
oscache缓存的页面为乱码

项目用的oscache,用的web.xml配置 CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8   forceEncoding   true    CharacterEncodingF......

kkli
2014/03/13
410
1
Tomcat 容器与servlet的交互原理

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器...

watermelon11
2019/02/25
344
0
Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。 init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet 对象。可以配...

ArlenXu
2015/01/24
210
0
Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

№贪↗恋♂
2012/08/08
189
0

没有更多内容

加载失败,请刷新页面

加载更多

Proxy代理

Proxy对象 在一个系统中,总要存储一些数据,对于这些数据,可能有一些是希望我们访问的,但是总有一些是中重要的,不希望我们访问的,希望保护起来,因此ES6新增了代理,在目标对象前架设个...

aHai366
42分钟前
21
0
NPM,Bower,Browserify,Gulp,Grunt,Webpack

问题: I'm trying to summarize my knowledge about the most popular JavaScript package managers, bundlers, and task runners. 我试图总结我对最流行的JavaScript包管理器,捆绑器和任务......

javail
45分钟前
27
0
F版本SpringCloud 4—Eureka注册中心开发和客户端开发

源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 通过前三篇文章,用大白话介绍了微服务和SpringCloud以及服务治理相关的概念,从这篇开始SpringCloud代码的开发。 Sp...

鹿老师的Java笔记
58分钟前
36
0
微信小程序学习笔记(九)音乐播放器(下一曲、上一曲、自动下一曲)

微信小程序学习笔记(九)音乐播放器(下一曲、上一曲、自动下一曲) 要实现自动下一曲、下一曲、上一曲功能,实现列表的循环播放,必须清楚当前播放的是列表中的第几首歌。因此,在程序中设...

AzureMonkey
59分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部