使用Hibernate遇到的各种异常坑

小编 2026-06-23 阅读:346 评论:0
前言 今天使用SpringBoot整合Hibernate的时候测试的时候遇到一些异常问题,准备总结一下。把问题记录下来,希望能够帮助大家解决。 整合环境 SpringBoot 2.1.1 J...

前言

今天使用SpringBoot整合Hibernate的时候测试的时候遇到一些异常问题,准备总结一下。把问题记录下来,希望能够帮助大家解决。

整合环境

  • SpringBoot 2.1.1
  • JDK1.8
  • Hibernate5.3.7

异常一

异常信息如下
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported;
use JPA-style ordinal parameters (e.g., `?1`) instead : FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ? [FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ?];
nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported;
use JPA-style ordinal parameters (e.g., `?1`) instead : FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ? [FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ?]
Caused by: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported;

use JPA-style ordinal parameters (e.g., `?1`) instead : FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ? [FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ?]
 
Caused by: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported; use JPA-style ordinal parameters (e.g., `?1`) instead : FROM com.wip.hibernate.dao.entity.Article as a WHERE a.title = ? and a.category = ?
代码如下(Dao)

下面代码主要写了一个查询,查询文章标题和分类是否同时间存在,用的是点位设置参数的方式,在其他博主看到说Hibernate4.1之后对于HQL中查询的点位符做了改进,由于我这里是使用的老式的点位符所以报了上面的异常。

public boolean articleExists(String title, String category) {
    String hql = \"FROM Article as a WHERE a.title = ? and a.category = ?\";
    int count = entityManager.createQuery(hql).setParameter(0, title)
            .setParameter(1, category).getResultList().size();
    return count > 0;
}
解决办法

从告警提示信息中可以看出,它建议用命名参数或者JPA占位符两中种方法来代替老的占位符查询方法。

  • 方法一,改成命名参数的方式
public boolean articleExists(String title, String category) {
    String hql = \"FROM Article as a WHERE a.title = :title and a.category = :category\";
    int count = entityManager.createQuery(hql).setParameter(\"title\", title)
            .setParameter(\"category\", category).getResultList().size();
    return count > 0;
}
  • 方法二:改成JPA点位符的方式
public boolean articleExists(String title, String category) {
    String hql = \"FROM Article as a WHERE a.title = ?0 and a.category = ?1\";
    int count = entityManager.createQuery(hql).setParameter(0, title)
            .setParameter(1, category).getResultList().size();
    return count > 0;
}
  • 注意:其中 \"?\" 后面的 \"0\"代表索引位置,在HQL名句中可以重复出现,并不一定是从0开始,可以是任何数字,只是参数要与期对应上。
  • 采用后面两种查询方法修改后就不会有异常产生了,个人推荐使用方法一,看起来更直观一点,性能方面相对也会好一点。
  • 日志打印成功SQL语句
    select
       article0_.article_id as article_1_0_,
       article0_.category as category2_0_,
       article0_.title as title3_0_ 
    from
       articles article0_ 
    where
       article0_.title=? 
       and article0_.category=?
    

异常二

异常信息如下
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process \'persist\' call;
nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process \'persist\' call
Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process \'persist\' call
代码如下(Service)

下面代码先是判断文章文章是否存在,不存在则执行添加方法。

public synchronized boolean addArticle(Article article) {
    if (articleDao.articleExists(article.getTitle(),article.getCategory())) {
        return false;
    } else {
        articleDao.addArticle(article);
        return true;
    }
}
解决办法

由于使用EntityManager的时候在进行增删改的时候需要添加事务Transactional,由于我这里没有加所以出现上面异常。

  • 添加 @Transactional即可
@Transactional
public synchronized boolean addArticle(Article article) {
    if (articleDao.articleExists(article.getTitle(),article.getCategory())) {
        return false;
    } else {
        articleDao.addArticle(article);
        return true;
    }
}
  • 注意,添加事务可以直接在方法上添加,也可以直接在类上添加,在类上添加的话代表每个方法都代有事务。
  • 日志打印添加成功SQL语句
    insert 
    into
        articles
        (category, title) 
    values
        (?, ?)
    

异常三

异常信息如下
org.springframework.dao.InvalidDataAccessResourceUsageException: error performing isolated work;
SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: error performing isolated work
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table \'bucket_test.hibernate_sequence\' doesn\'t exist
代码如下

这里同样是执行添加方法的时候出错的,看到其它博主说是ID自增的问题,我这里设置的是GenerationType.AUTO,所以会出现上面异常。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = \"article_id\")
private int articleId;
解决办法

在实体类上修改@GeneratedValue的strategy即可,将AUTO属性改成IDENTITY属性。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = \"article_id\")
private int articleId;
  • 最后完美解决。
以上是我遇到的一些坑,后续会持续更新,有问题欢迎留言,看到第一时间回复。

最后附上:SpringBoot整合全家桶 欢迎star谢谢你的支持。

================================================================================
感谢阅读,写得不好的地方请指教,能帮助到你是对我最好的回报,不卑不亢,加油。
请你记住比你优秀的一定比你努力,比你努力的人一定比你优秀。
================================================================================
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表