You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Spring Data JPA自定义ID生成器中无法访问session.connection()方法

Spring Data JPA自定义ID生成器中session.connection()调用失败的解决方案

在Hibernate 5.2及以上版本中,SharedSessionContractImplementor的connection()方法已被标记为过时,且直接调用会违反Hibernate的连接生命周期管理规则,导致无法正常获取连接或抛出异常。以下是两种可行的解决方式:

方式一:使用官方推荐的JdbcConnectionAccess获取连接

通过session.getJdbcConnectionAccess()获取连接,该方法遵循Hibernate的连接管理规范,同时配合try-with-resources自动释放连接,避免资源泄漏:

package com.ashokit.generators;

import java.io.Serializable;
import java.sql.Connection;

import org.hibernate.engine.jdbc.spi.JdbcConnectionAccess;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

public class OrderIdGenerator implements IdentifierGenerator {
    
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) {
        String prefix = "OD";
        String suffix = "";
        try (Connection connection = session.getJdbcConnectionAccess().obtainConnection()) {
            // 在这里执行JDBC操作,比如查询数据库生成后缀
            // 示例:
            // Statement stmt = connection.createStatement();
            // ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM orders");
            // if (rs.next()) {
            //     suffix = String.format("%06d", rs.getLong(1) + 1);
            // }
        } catch (Exception e) {
            throw new RuntimeException("生成订单ID失败", e);
        }
        return prefix + suffix;
    }   
}

方式二:避免直接操作JDBC连接,使用Hibernate内置API生成ID

如果你的需求是生成前缀+序列/自增值的ID,可以直接通过Hibernate的NativeQuery获取数据库序列值,无需手动管理连接:

package com.ashokit.generators;

import java.io.Serializable;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

public class OrderIdGenerator implements IdentifierGenerator {
    
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) {
        String prefix = "OD";
        // 假设数据库中存在名为order_seq的序列
        Long sequenceValue = (Long) session.createNativeQuery("SELECT nextval('order_seq')")
                                           .uniqueResult();
        return prefix + String.format("%06d", sequenceValue);
    }   
}

注意事项

  • 不要忽略异常:原代码空catch块会掩盖问题,建议抛出运行时异常或记录详细日志
  • 保证线程安全:ID生成逻辑需处理并发场景,避免重复ID,数据库序列、分布式ID方案都是可靠选择
  • 版本适配:Hibernate 6.x部分API有调整,需对应版本参考官方文档

内容的提问来源于stack exchange,提问作者FAHEEM KHAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:34:26