Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题

Spring 3.1 + JPA 2.0 (Hibernate 4) + MySQL 配置 近来闲暇时间摆弄了一下Spring、Hibernate,原因非常简单,做得项目在用Java做web开发,项目使用的Jersey+EclipseLink框架。而Spring与Hiberante早已名声在外,所以可以说是慕名而来啦!接触时间不长,所以文章中有误在所难免,欢迎板砖侍候。 查看Hibernate tutorial,Hibernate提供了3种方式实现ORM: 1. Native Hib 阅读详情

1. 使用过程

  在项目中我使用Spring Boot 2.0.0.RELEASE开发并且集成了Spring JPA;我这里将Hibernate版本设置为5.1.2.Final,这里做修改主要是因为LocalDate跟数据库映射时有些问题才做更换,其他基本没什么大的问题;数据库使用了MySQL
  

2. 背景

  使用MySQL,所以先对MySQL做一些了解,这里MySQL数据库中有四种存储引擎,主要介绍两种,分别为MyISAM和InnoDB,它们两个的区别如下:

\InnoDBMyISAM
访问速度相对慢快
事务支持不支持
外键支持不支持
应用场景需要事务提交、回滚功能应用以查询为主的应用

各种引擎简要介绍
https://blog.youkuaiyun.com/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.youkuaiyun.com/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算是学到了些东西,但是会遇到问题说明自己还是没有了解它,不说了,好好学习。

Spring Boot(六):Spring Boot 集成 hibernate & JPA 今天我们继续来学习Springboot对象持久化。首先JPA是Java持久化API,定义了一系列对象持久化的标准,而hibernate是当前非常流行的对象持久化开源框架,Spring boot就默认集成了这种框架,加速web应用开发。 阅读详情

相关推荐

【Spring错误笔记】spring.jpa.hibernate.ddl-auto=update造成删除索引的线上事故

spring.jpa.hibernate.ddl-auto=update造成删除索引的线上事故

长路漫漫的歇脚处 6345

Hibernate无法连接Mysql数据库的问题解决

刚开始学习J2EE,第一次使用Hibernate连接数据库,发现出现无法连接数据库的情况。在查阅了各种资料的情况下,尝试各种方式解决无果后,终于发现了问题真正所在——Mysql版本过高(Mysql8.0)与起始的hibernate.cfg.xml文件无法匹配。 首先放出原始的hibernate.cfg.xml代码: <?xml version="1.0" encoding="UTF-8"?&...

Happy357的博客 2448

如何用Bertalign快速搞定多语言句对齐?5分钟上手教程(附避坑指南)

本文详细介绍了如何利用Bertalign工具快速实现多语言句对齐,从安装配置到实战应用的全流程指南。通过LaBSE句向量技术,Bertalign显著提升了对齐准确率,支持25种语言的任意组合,特别适合处理复杂句式。文章还提供了常见问题的解决方案和性能优化技巧,帮助用户高效完成多语言文本对齐任务。

weixin_42538752的博客 352

hibernate中flush()、refresh()、clear()缓存操作

flush():使数据库中的对象和session缓存中的对象的状态保持一致。为了保持一致,则可能发送对应的sql语句(若缓存中的对象和数据库中的对象一样则不发送sql语句)。 1、在transaction的commit()方法中:先调用session的flush方法,再提交事务。 2、flush方法可能会发送sql语句,但不会提交事务。 3、注意:在未提交事务或显示的调用session.fl

Zzooper的博客 1万+

Source Insight 4.0舒适黑主题 仿心情看的舒服就行

Source Insight 4.0主题 仿心情看的舒服就行 source insight自带的主题怎么看怎么别扭,于是在试用全网各种主题配色后,在其中一个基础上自定义了c/c++的语法配色 截全图有点糊 函数定义 全局变量 局部变量 枚举变量引用 全局变量引用及结构体成员 宏定义引用 ----------------------后面会再把主题文件贴上来-------------- ...

weixin_43443402的博客 1303

SillyTavern 向量存储配置踩坑记:从卡死到本地部署 Ollama 跑通

用此命令看到镜像就算成功。

qq_62483451的博客 1259

spring连接mysql出现问题_spring+hibernate连接mysql问题啊

查询时报:Causedby:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherigh...查询时报:Caused by: com.mysql.jdbc.e...

weixin_33784572的博客 143

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4004

java事务未结束 查询数据库

解决Java事务未结束查询数据库的问题 在进行Java开发时,我们经常会遇到涉及数据库操作的场景。在进行数据库查询时,有时候会遇到事务未结束的情况,导致查询结果并不是最新的数据。这可能是因为事务未提交或者事务隔离级别设置不当所致。本文将介绍如何解决Java事务未结束查询数据库的问题,并提供代码示例说明。 事务未结束查询数据...

weixin_42511206的博客 334

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 242

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2950

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。 瞬时态 ...

天空之城 237

共享单车数据抓取与分析:使用Python爬虫抓取共享单车使用数据与地图信息

通过本篇博客,我们展示了如何使用Python爬虫抓取共享单车的使用数据和地图信息,并通过简单的数据分析得出有价值的见解。在实际应用中,数据的收集与分析不仅能帮助城市管理者更好地规划单车站点,还能为用户提供更精准的单车使用体验。未来,我们可以将此分析与机器学习模型相结合,进一步预测单车的使用趋势,优化调度算法,实现更加智能的共享单车管理。

2201_76125261的博客 2204

jpa hibernate mysql_Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题

1. 使用过程在项目中我使用Spring Boot 2.0.0.RELEASE开发并且集成了Spring JPA;我这里将Hibernate版本设置为5.1.2.Final,这里做修改主要是因为LocalDate跟数据库映射时有些问题才做更换,其他基本没什么大的问题;数据库使用了MySQL2. 背景使用MySQL,所以先对MySQL做一些了解,这里MySQL数据库中有四种存储引擎,主要介绍两种,分...

weixin_30921875的博客 309

5、AIX系统硬件管理与故障诊断全解析

本文全面解析了AIX系统的硬件管理与故障诊断方法,涵盖系统管理服务(SMS)的使用、设备兼容性配置、设备配置数据库结构、常用命令如cfgmgr、lsattr、smitty devices的操作详解,并深入介绍了错误日志管理机制,包括errdemon、errpt、errlogger等命令的应用。通过实际案例分析和流程图展示,帮助系统管理员掌握从问题怀疑到诊断执行再到日志清理的完整流程,同时提供注意事项与最佳实践,助力AIX系统的稳定运行与高效维护。

y2z3a4b5c的博客 62

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spring data jpa 的坑

今晚尝试使用spring boot 来搭配 Hibernate 使用 MySQL。 添加pom依赖,添加 模型 ,控制器,最后新建mysql数据路,配置 属性,流程基本没问题,但项目就是跑不起来 百度了很久 一直以为是缺少依赖,尝试在pom文件添加各种依赖,结果还是无法启动,报 entityManager 无法实例化错误 pom文件如下 o

qishiwobubiaohan的博客 917

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

解决Spring Data JPA自动创建MyISAM表的问题:MySQL 9.2配置实战✨

Spring Data JPA默认创建MyISAM表的问题及解决方案 问题分析: 在MySQL 9.2环境中,Spring Data JPA自动创建的表默认使用MyISAM引擎而非InnoDB 原因在于Hibernate未能正确识别MySQL版本,使用了默认配置 解决方案: 在application.yml中明确配置: spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.MySQL8Dialect spring.jpa.propert

小丁的博客 695

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mysql数据源配置问题

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set 第一个报错是因为jpa没有配置。百度了一下配置,加上就ok了 jpa: show-sql: true database-platform: org.h...

weixin_42714605的博客 266

【达梦数据库|JPA】后端数据库国产化迁移记录

摘要:本文介绍了将SpringBoot+JPA项目从MySQL迁移至国产达梦数据库的完整方案。内容包括达梦数据库的Windows/Linux环境搭建(推荐Docker方式)、Maven驱动配置(需匹配Java版本)、Hibernate方言选择,以及详细的properties配置示例(数据源和JPA参数)。测试表明达梦与JPA兼容性良好,文末还提供了达梦与MySQL的差异参考文档。整个迁移过程技术要点明确,具有较强实操性。

刘阿宾的博客 762

spring boot 中使用 jpa以及jpa介绍

最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。 在这里我们先来了解一下jpa。1.什么是jpa呢?JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 2.jpa具有什么优势?2.1标准化 JPA 是 JCP 组织发布的 Java

深存少年梦 28万+

Spring Data JPA 之 Hibernate 加载过程与配置项

这⼀讲,我们来分析⼀下在 Spring Data JPA 的项⽬下⾯ Hibernate 的配置参数有哪些,先从 Hibernate 的整体架构进⾏分析。

曾小二的博客 2760

[Spring Boot] [JPA] 使用过程中的时区(TimeZone)问题

项目中使用了jpa(使用方便,但不适合稍复杂sql处理)和mybatis(使用了稍微负责的sql)。 但是发现数据库mysql中存储的时间有问题。mysql存储的没问题,但是jpa存储的有问题(比当前北京时间少了14个小时)。 debug发现,java生成的日期没有问题。并且java生成的时区也是Asia/Shanghai没错。 logback.xml中jpa debug日志开启方法: &...

Carl_Zhang 7365

Jpa使用详解(Hibernate)

Jpa使用详解 ORM思想 1.ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射 简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。 2.为什么要使用ORM 当实现一个应用程序时(不使用O/R Mapping)

Java后端技术栈 5338

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。 2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和.

wushijuewu 1818

【Spring Boot】Spring Boot REST + JPA + Hibernate + MySQL 示例

文章目录演示工具版本MySQL 数据库架构项目结构Maven 文件在 application.properties 文件中配置属性创建 DAO创建 Service创建 Controller创建 Main类创建测试类测试应用程序1. 使用Eclipse2. 使用Maven命令3. 使用可执行的JAR测试参考文献源码下载 本页将介绍spring boot REST + JPA + hibernate + MySQL的例子。在这里,我们将创建一个REST应用程序,使用MySQL执行CRUD操作。Spring bo

猫巳的博客 1024

关于springboot jpa 默认使用hibernate_sequences序列自增的问题

spring-boot-starter-data-jpa         spring-boot-starter-data-jpa默认采用hibernate实现方式,这对于我们的单表操作,以及ORM逆向工程使用起来都特变方便,但是我们在通过实体类逆向生成数据库表的时候,可能会存在一点问题。 hibernate实体类逆向生成数据库表的问题 问题描述       &nbsp

CrazyJavaWu的博客 4436
上一篇: 课程作业——数据结构化与保存
下一篇: HDSF文件操作
lger_Pro
博客等级 码龄10年 44粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值