(一)JPA的快速入门

2、JPA连接工厂

通过之前的 代码 实现已经清楚的发现了整个的JPA实现步骤,但是这个步骤似乎有一些繁琐了,毕竟最终所关心的一定是EntityManager对象实例,而要想获取到此对象的实例,那么要经过许多的步骤,这样如果每一次都重复的进行处理,会非常的繁琐了,那么就需要进行代码的抽象规定。

        // 创建JPA Entity工厂
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("YootkJPA");
// JPA操作对象
EntityManager entityManager = factory.createEntityManager();

对等概念: DataSource -> EntityMannagerFactory

​ Connection -> EntityMannager,每一个对象的实例都表示一个Session的操作

所以此时可以考虑将部分的代码移交给JPA的专属连接管理类,用这个类可以基于ThreadLocal实现EntityManager存储,这样每一次通过该类的方法获取EntityManager的时候如果不关闭,则获取到的是同一个实例

对于上叙测试类的优化。

  • 一个工具类,简化EntityManagerFactory的创建与关闭
public class JPAEntityFactory {
/**
* JPA持久单元
*/
private static final String PERSISTENCE_UNIT = "YootkJPA";
/**
* 等同于 数据源
*/
private static EntityManagerFactory entityManagerFactory;
/**
* EntityManager 等同于 连接
*/
private static ThreadLocal<EntityManager> entityManagerThreadLocal =
new ThreadLocal<>(); static {
// 初始化创建数据源 静态代码块只会创建一次
rebuildEntityManagerFactory();
} /**
* 获取连接
*/
public static EntityManager getEntityManager() {
// 本机线程获取连接
EntityManager entityManager = entityManagerThreadLocal.get();
if (entityManager == null) {
// 从数据源获取新的连接
entityManager = getEntityManagerFactory().createEntityManager();
// 存入本地线程
entityManagerThreadLocal.set(entityManager);
}
return entityManager;
} private static EntityManagerFactory getEntityManagerFactory() {
if (entityManagerFactory == null) {
// 创建数据源
rebuildEntityManagerFactory();
}
return entityManagerFactory;
} private static void rebuildEntityManagerFactory() {
// 持久单元 创建 数据源
entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
} /**
* 关闭EntityManager
*/
public static void close() {
// 获取实例
EntityManager entityManager = entityManagerThreadLocal.get();
if (entityManager != null) {
// 关闭连接 entityManager类似于Connection
entityManager.close();
// 删除本地线程中的连接
entityManagerThreadLocal.remove();
}
}
}

修改测试类:

    @Test
public void testAdd2() {
// 获取连接
EntityManager entityManager = JPAEntityFactory.getEntityManager();
// 开启事务
entityManager.getTransaction().begin();
Course course = new Course();
course.setCname("Spring编程实战");
// 字符串 日期对象
course.setStart(DateUtil.stringToDate("2022-09-19"));
course.setEnd(DateUtil.stringToDate("2022-12-30"));
course.setCredit(2);
course.setNum(88);
// 执行插入
entityManager.persist(course);
// 提交事务
entityManager.getTransaction().commit();
// 关闭连接
JPAEntityFactory.close();
}

3、主键生成

在JPA开发之中,主键数据的生成主要是基于@Id注解定义的,而在实际的项目开发之中,数据表的设计结构是有所不同的,所以JPA为了适应这些不同的数据表的定义,也提供有不同的主键生成策略。

3、DDL自动更新

在实际的开发之中你是否会出现这样的一种比较 尴尬 的问题,在进行开发的时候有人修改数据表,而后当前的实体类结构和数据表的结构不统一,但是在JPA设计的时候,充分的考虑到了这种数据表修改的问题(表可能存在,也可能不存在,或者表的结构可能修改了),所以在这样的环境下就需要让代码可以自动的进行数据表的纠正。

在传统的项目开发之中,常规的做法是先进行数据表的创建,而后在围绕数据表进行业务功能的实现。在每次业务发生改变时,也是先进行表结构的修改,而后再进行程序的变更,这样的数据库维护是非常繁琐的,考虑到数据库更新以及 数据库移植 方面的设计,在 Hibernate 之中提供了 DDL 自动创建以及表更新策略

JPA现在主要是基于 Hibernate 实现,那么 Hibernate 开发框架最早的一个特点就在于 可移植性,也就是说一个项目是在MySQL数据库下开发的,那么通过简单的配置修改,可以让代码直接在Oracle数据库中运行。

对于当前市面上可以见到的ORM开发框架来讲,只有JPA标准规定了数据库移植性的话题,而Hibernate 实现了JPA标准,所以只有Hibernate 开发框架具有移植性的功能,而像大家所熟悉的MyBatis是没有这样的功能

DDL更新策略

3.1、使用

去到JPA配置文件中,修改DDL更新策略、

3.1.1、create

每次加载时,根据实体类生成表,如果表存在于数据库,会先删除

            <!-- JPA更新策略 -->
<property name="hibernate.hbm2ddl.auto" value="create"/>

查看执行日志信:可以看到 drop table if exists course (删除表,然后会依据实体类,重新创建表)

3.1.2、update

如果表不存在,重建表。

存在:如:实体类某个字段,在数据表中不存在,这个时候会添加。但是,删除实体类的某个字段,数据库对应的字段并不会删除。

修改实体类: 添加教师

修改配置文件-更新策略为update

查看执行日志:

表不存在,创建表

create table course (

cid bigint not null auto_increment,

cname varchar(255),

credit integer,

end date,

num integer,

start date,

teacher varchar(255),

primary key (cid)

) engine=InnoDB

排除属性

假如,我们相使实体类中的某个字段,在执行时,不创建数据库中的对应字段。使用@Transient即可

(二)JPA 连接工厂、主键生成策略、DDL自动更新的更多相关文章

  1. (二)JPA实体类主键生成策略

    在JPA中,配置实体类的主键的生成策略使用 @GeneratedValue @Id @Column(name = "id") @GeneratedValue(strategy = ...

  2. JPA中的主键生成策略

    通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@Gen ...

  3. 160727、自定义hibernate主键生成策略生成字符串+数字自增长

    需求:需要自增长注解如MyId0001.MyId0002.MyId0003 实现:实现这个接口org.hibernate.id.IdentifierGenerator 一.MyIdGenerator. ...

  4. hibernate的持久化类、主键生成策略

    一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...

  5. 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

    目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...

  6. 4、JPA table主键生成策略(在JPA中table策略是首推!!!)

    用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起 ...

  7. jpa table主键生成策略

    用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起 ...

  8. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hib ...

  9. 转数据库分库分表(sharding)系列(二) 全局主键生成策略

    本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...

随机推荐

  1. Java方法的重写

    package Demo.oop.APP.Demo04; //启动器 public class application { public static void main(String[] args) ...

  2. ORM框架介绍——什么是ORM框架?

    1.什么是ORM?对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM框架是连接数据库的桥梁,只要提供 ...

  3. 参数化设计(多次调用同一子模块,critical warning,引脚constraint sources)

    1.设计定义:4个led灯以不同的频率各自闪烁. 2.设计输入:时钟信号,复位信号,led多位输出. 思路:没有要求流水的效果,所以不需要叠加counter达到某一特定值来位移.只需要让每个灯的闪烁周 ...

  4. 「一本通 1.4 例 2」[USACO3.2]魔板 Magic Squares

    [USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...

  5. Go语言基础三:基本数据类型和运算符

    Go语言数据类型 与其他编程语言一样,Go语言提供了各种数据类型,可分为基本的数据类型和复杂的数据类型.基本的数据类型就是基本的构造块,例如字符串.数字和布尔值.复杂的数据类型是用户自己定义的结构,由 ...

  6. 题解 洛谷 P2388 阶乘之乘

    目录 简要题意 题解 主要思路 一个 \(\omega(n)\) 的算法 一个 \(O(\log n)\) 的算法 一个算法 代码 算法 \(1\)(\(\omega(n)\)) 算法 \(2\) 算 ...

  7. 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...

  8. web前端要学些什么,学习思路

    有没有Web前端大神给个意见 我已学了 html  css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么

  9. 一文搞懂│XSS攻击、SQL注入、CSRF攻击、DDOS攻击、DNS劫持

    目录 XSS 攻击 SQL 注入 CSRF 攻击 DDOS 攻击 DNS 劫持 XSS 攻击 全称跨站脚本攻击 Cross Site Scripting 为了与重叠样式表 CSS 进行区分,所以换了另 ...

  10. Luogu4111 [HEOI2015]小Z的房间 (矩阵树,辗转相除高斯消元)

    除法不能用于同余系,要辗转相除.注意不能加入柱子到矩阵. #include <iostream> #include <cstdio> #include <cstring& ...