Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题
1. 使用过程
在项目中我使用Spring Boot 2.0.0.RELEASE开发并且集成了Spring JPA;我这里将Hibernate版本设置为5.1.2.Final,这里做修改主要是因为LocalDate跟数据库映射时有些问题才做更换,其他基本没什么大的问题;数据库使用了MySQL
2. 背景
使用MySQL,所以先对MySQL做一些了解,这里MySQL数据库中有四种存储引擎,主要介绍两种,分别为MyISAM和InnoDB,它们两个的区别如下:
| InnoDB | MyISAM | |
|---|---|---|
| 访问速度 | 相对慢 | 快 |
| 事务 | 支持 | 不支持 |
| 外键 | 支持 | 不支持 |
| 应用场景 | 需要事务提交、回滚功能应用 | 以查询为主的应用 |
各种引擎简要介绍
https://blog.csdn.net/qq_27028821/article/details/52267991
3. 遇到问题
3.1 不指定Hibernate数据库方言,默认SQL生成方式
在不指定方言的情况下默认使用了MySQL5Dialect,这样在打印create table命令时会在后面指定它的数据库引擎为MyISAM,这样生成的数据库是不支持外键的,也是不支持事务性操作的。请注意是数据库。
3.2 抛出异常Hibernate加入了@Transactional事务不会回滚
现在这里有个实体类:
@Entity
@Data
public class Test{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
}
我们保存需要保存一个Test实例时发现抛出了一个异常数据库居然保存成功,代码如下:
Service:
@Resource
private TestDao testDao;
@Transactional
public void test(){
Test test = new Test();
test.setName("test");
testDao.save(test);
int a = 1 / 0;
}
这里我们要看回去MySQL生成的方式,默认是使用了MyISAM这是不支持事务的,如果向数据库保存了数据,那么事务回滚也是不管用的,所以,现在我们需要指定配置数据库的方言,在Spring Boot中可在application.properties配置如下:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
如果是xml配置的可以这么配置
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
这样我们重新运行生成的表可以有外键生成也可以支持数据库事务,当然数据就可以回滚了
当然了,除了以上的解决方法之外,其实还有一个不怎么好的解决方法,那就是将Test中的id生成策略注解改为如下内容:
@Entity
@Data
public class Test{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
}
对于这个为什么可以,请接着往下面看
主键生成策略参考
https://blog.csdn.net/lwt976647637/article/details/53352369
3.3 Hibernate使用Spring Test测试加入了@Transactional事务无论如何数据库插入不成功
这里使用上面修改成AUTO的实体类
在测试类里面我们可以保存我们一个Test对象,测试代码如下:
junit.Test
@Test
@Transactional
public void test(){
Test test = new Test();
test.setName("test");
testDao.save(test);
}
上面没有任何异常抛出,进度条也绿了,但是数据插入数据库不成功,这时,可以看下控制台打印输出的语句:
//....前面有很多,不写出来了
transaction manager [org.springframework.orm.jpa.JpaTransactionManager@5e5ddfbc]; rollback [true]
这里我大胆的猜测就是Spring Test自动帮我们把事务回滚了,我们如果要看到把数据插入数据库的话只是需要在test方法加入注解,如
@Test
@Transactional
@Rollback(false) //设置事务不自动回滚
public void test(){
Test test = new Test();
test.setName("test");
testDao.save(test);
}
3.4 Hibernate在使用MyISAM引擎也可以回滚?
我在之前写的会员管理系统中是没有指定生成方言的,默认是使用了MyISAM,但是在Service中出现了异常还是可以回滚,怎么回事?
这是因为我们在save之后Hibernate不会立马执行SQL的,除非是事务提交了,我在事务提交之前抛出了异常,所以在Hibernate的缓存中的SQL是不会执行成功的,因此就用假的回滚现象,这不是数据库提供的回滚功能。
3.5 Hibernate在使用生成策略是IDENTITY不能回滚事务,AUTO可以
这是因为如果使用了IDENTITY是数据库维护我们的主键,Hibernate为了获取id是需要向数据库插入数据才能获得id的值的,所以会执行SQL,在使用MyISAM引擎的情况下是不能回滚事务的
如果用了AUTO那么不需要数据库维护,Hibernate自己维护是不需要向数据库要主键的,那么不会立马执行SQL就跟上一个问题一样的结果。所以这里的生成策略使用uuid也是可以的,只要不是数据库维护。
3.6 使用MyISAM引擎下有缓存的情况@Controller下使用事务回滚不成功,@Service下成功
在Controller层使用@Transactional事务是不会回滚的,但是Service层就可以,如果把@Controller替换成@Component也是成功的。
4. 总结
这里遇到大部分问题终其原因都是MySQL引擎使用或是没有指定方言的原因吧,所以,没有性能方面的要求或者是小白请使用InnoDB引擎。
而对于我来说,这些异常手动catch算是学到了些东西,但是会遇到问题说明自己还是没有了解它,不说了,好好学习。
Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题的更多相关文章
- 【hibernate】spring+ jpa + hibername 配置过程遇到的问题
org.springframework.data.jpa.domain.support.AuditingEntityListener Auditing: 审计:查账Hades:Hades是一个开源库, ...
- 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作
spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...
- FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL
原帖 https://grokonez.com/hibernate/use-hibernate-lazy-fetch-eager-fetch-type-spring-boot-mysql In the ...
- Spring+Hibernate+struts2+JPA 注解+跨域//完成手机端点击加载更多 下拉加载更多
一.使用IDEA新建一个maven项目(student) 1.1.0编写pom文件,添加项目所需要的包 <?xml version="1.0" encoding=" ...
- spring boot++jpa+ mysql +maven
项目结构图: 一. 添加mysql 配置 1 在pom.xml中添加 maven依赖 <!--mysql--> <dependency> <groupId>mysq ...
- spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式
spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...
- 63.JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 事情的起源,无意当中在一个群里看到这么一句描述:"有人么?默默的问一句,现在开发用mybatis还是hibernate还是jpa&quo ...
- springmvc+spring+jpa(hibernate)+redis+maven配置
废话不多少 项目结构 pom.xml配置例如以下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...
- Spring Boot+MySQL+Spring Data JPA一个Web的Demo
2020.06.23 更新 1 概述 一个简单的web项目配合MySQL+Hibernate+Tomcat的简单示例demo,很容易在此基础上扩展成自己的项目. 2 创建工程 笔者IDE为Intell ...
随机推荐
- 工作流Activiti5.13学习笔记(一)
了解工作流 1.工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某 ...
- JavaScript(第九天)【正则表达式】
假设用户需要在HTML表单中填写姓名.地址.出生日期等.那么在将表单提交到服务器进一步处理前,JavaScript程序会检查表单以确认用户确实输入了信息并且这些信息是符合要求的. 一.什么是正则表 ...
- Beta No.6
今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...
- Beta版本展示博客
1 团队介绍 团队组成: 齐爽爽(258)个人博客:http://www.cnblogs.com/shuangshuangblog/ 马帅(248)个人博客:http://www.cnblogs.co ...
- 20145237 《Java程序设计》第4周学习总结
20145237 <Java程序设计>第4周学习总结 教材学习内容总结 一. 继承 . 定义:面向对象中,涉及对象过多时容易出现重复行为,为了避免这种情况,就可把重复的部分写成父类,由子 ...
- java 注解的实现机制
一.什么是注解: 注解是标记,也可以理解成是一种应用在类.方法.参数.属性.构造器上的特殊修饰符.注解作用有以下三种: 第一种:生成文档,常用的有@param@return等. 第二种:替代配置文件的 ...
- dede观看总结自己总结
知识点一:{dede:arclist channelid="18" addfields="language,pfz" limit="0,5" ...
- python构造一个freebuf新闻发送脚本
前言: 放假学习完web漏洞后.想写一个脚本 然而自己菜无法像大佬们一样写出牛逼的东西 尝试写了,都以失败告终. 还有一个原因:上学时间不能及时看到,自己也比较懒.邮件能提醒自己. 需要安装的模块: ...
- 单点登录实现机制:web-sso
参考链接,感谢作者:https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGckZ2TkJiM0ZyQktCZlo2Mi5uNmp6S0I/QysrJyszPztGXi5K ...
- 阿里云API网关(8)开发指南-SDK下载
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...