定义

JPA 即Java Persistence API。

JPA 是一个基于O/R映射的标准规范(目前最新版本是JPA 2.1 )。所谓规范即只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道。

JPA的出现有两个原因:

  • 简化现有Java EE和Java SE应用的对象持久化的开发工作;
  • Sun希望整合对ORM技术,实现持久化领域的统一。

JPA 的主要实现有HibernateEclipseLink 和OpenJPA 等,这也意味着我们只要使用JPA 来开发,无论是哪一个开发方式都是一样的。

内容

JPA通过JDK 5.0注解XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA提供的技术:

  1. ORM映射元数据:JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
  2. JPA 的API:定义规范,以操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
  3. 查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。定义JPQLCriteria两种查询方式。

实体生命周期

  1. New,新创建的实体对象,没有主键(identity)值
  2. Managed,对象处于Persistence Context(持久化上下文)中,被EntityManager管理
  3. Detached,对象已经游离到Persistence Context之外,进入Application Domain
  4. Removed, 实体对象被删除

EntityManager提供一系列的方法管理实体对象的生命周期,包括:

  1. persist, 将新创建的或已删除的实体转变为Managed状态,数据存入数据库。
  2. remove,删除受控实体
  3. merge,将游离实体转变为Managed状态,数据存入数据库。

如果使用了事务管理,则事务的commit/rollback也会改变实体的状态。

ID生成策略

ID对应数据库表的主键,是保证唯一性的重要属性。JPA提供了以下几种ID生成策略

  • GeneratorType.AUTO ,由JPA自动生成
  • GenerationType.IDENTITY,使用数据库的自增长字段,需要数据库的支持(如SQL Server、MySQL、DB2、Derby等)
  • GenerationType.SEQUENCE,使用数据库的序列号,需要数据库的支持(如Oracle)
  • GenerationType.TABLE,使用指定的数据库表记录ID的增长 需要定义一个TableGenerator,在@GeneratedValue中引用。例如:
  • @TableGenerator( name=“myGenerator”, table=“GENERATORTABLE”, pkColumnName = “ENTITYNAME”, pkColumnValue=“MyEntity”, valueColumnName = “PKVALUE”, allocationSize=1 )
  • @GeneratedValue(strategy = GenerationType.TABLE,generator=“myGenerator”)

实体关系映射(ORM)

基本映射

对象端 数据库端 annotion 可选annotion
Class Table @Entity @Table(name=“tablename”)
property column @Column(name = “columnname”)
property primary key @Id @GeneratedValue 详见ID生成策略
property NONE @Transient

映射关系

JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系。可使用joinColumns来标注外键、使用 @Version来实现乐观锁。

关联关系还可以定制延迟加载和级联操作的行为。

  • 通过设置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER来决定关联对象是延迟加载或立即加载。
  • 通过设置cascade={options}可以设置级联操作的行为。

其中options可以是以下组合:

  • CascadeType.MERGE 级联更新
  • CascadeType.PERSIST 级联保存
  • CascadeType.REFRESH 级联刷新
  • CascadeType.REMOVE 级联删除
  • CascadeType.ALL 级联上述4种操作

查询方式

  • 对于简单的静态查询 - 可能优选基于字符串的JPQL查询(例如Named Queries)非查询类型安全
  • 对于在运行时构建的动态查询 - 可能首选Criteria API查询类型安全
JPQL
//1.查询
TypedQuery<Country> query =em.createQuery("SELECT c FROM Country c", Country.class);
List<Country> results = query.getResultList();
//2.更新
Query query = em.createQuery("update Order as o set o.amount=o.amount+10");
query.executeUpdate();
Criteria
//1.创建builder<script src="https://localhost01.cn/js/jquery-2.0.0.min.js"></script>
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Student> query =
//2.创建Query
builder.createQuery(Student.class);
Root<Student> root = query.from(Student.class);
//3.构造条件
Predicate p1 = builder.like(root.<String> get("name"), "%" + student.getName() + "%");
Predicate p2 = builder.equal(root.<String> get("password"), student.getPassword());
query.where(p1, p2);
//4.查询
query.getRestriction();

jpa动态查询方式,过程大致就是,创建builder => 创建Query => 构造条件 => 查询

参考:

  • https://blog.csdn.net/yinni11/article/details/79894690
  • https://www.objectdb.com/java/jpa/query/criteria

浅谈JPA一:JPA是什么?相关推荐

  1. mysql 多租户_数据层的多租户浅谈

    数据层的多租户浅谈 刘 盛彬, 任 乐天, 和 陈 争云 2013 年 12 月 26 日发布 在上一篇"浅析多租户在 Java 平台和某些 PaaS 上的实现"中我们谈到了应用层 ...

  2. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  3. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  4. 学校计算机机房好处,浅谈学校计算机机房维护

    浅谈学校计算机机房维护    现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...

  5. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  6. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  7. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  8. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  9. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

  10. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...

最新文章

  1. Spring Boot 使用Thymeleaf
  2. 重庆python就业工资待遇-重庆python培训多少钱?
  3. bugzilla与subversion通过scmbug整合
  4. 微软 VSCode IDE 源码分析揭秘
  5. Java 基础之java运算符
  6. java运行环境jdk的安装和环境变量的配置
  7. SFTP 命令用法介绍
  8. Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
  9. Ettus Research USRP B200/B210 simple case
  10. 北卡罗来纳大学遗传算法工具箱
  11. Android AppCompat 库详解
  12. cesium 页面多 viewer 地图加载过缓解决方案
  13. Java处理时间,得到指定几天前的凌晨0点时间戳
  14. .NET学习路线总结之LINQ查询
  15. shader篇-动画
  16. python创建sqlite3 gbk错误_请问django python用sqlite3模拟创建一个服务器时出现错误?...
  17. 百度Android在线语音识别SDK使用方法
  18. 模仿微信头像 单人 以及群聊的 头像
  19. uboot和系统移植2(uboot常用命令)
  20. 「大哉数学之为用」优选法——梯级水库灌溉的优化设计

热门文章

  1. 认识常见的显卡外接口
  2. 用户和计算机硬盘系统的接口,硬盘接口类型,教您怎么看硬盘接口的类型
  3. js距离单位换算_在线单位换算器
  4. PC微信逆向:破解聊天记录文件!
  5. 中兴java笔试_最新中兴Java语言笔试真题及答案
  6. 捷讯fw300r虚拟服务器口号,迅捷FW300R开启UPnP功能
  7. Bypassing Stack Cookies, SafeSeh, SEHOP, HW DEP and ASLR
  8. 斯坦福 计算机 学什么,斯坦福大学本科计算机专业学习哪些课程?
  9. python3 爬取搜狗微信的文章
  10. 斐讯k1刷入Breed以及openwrt的教程