在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
相关产品推荐
相关产品推荐

