讲师中心 微信公众号
AI工具推荐 视频效率加速

强制 Hibernate 使用自定义连接以支持 Oracle 审计属性设置

风涛吖_4679

风涛吖_4679

发布时间:2026-09-02 16:47:26

|

907人浏览过

|

来源于php中文网

原创

强制 Hibernate 使用自定义连接以支持 Oracle 审计属性设置

本文介绍如何在不破坏 hibernate 核心机制的前提下,为特定数据库操作(如 oracle 审计表更新)临时注入并独占使用一个带动态连接属性的 jdbc 连接,确保触发器可读取用户上下文,同时立即释放连接。

本文介绍如何在不破坏 hibernate 核心机制的前提下,为特定数据库操作(如 oracle 审计表更新)临时注入并独占使用一个带动态连接属性的 jdbc 连接,确保触发器可读取用户上下文,同时立即释放连接。

在 Oracle 审计场景中,客户强制要求通过 DBMS_APPLICATION_INFO.SET_CLIENT_INFO 或连接级 CONNECTION_PROPERTY(如 oracle.jdbc.clientInfo)向触发器传递用户身份、操作类型等上下文信息,且该信息必须在连接建立时即设定——不可运行时修改。这使得标准 Hibernate 连接池(如 HikariCP 或 C3P0)完全失效:无法为每次请求动态配置连接属性,也无法安全复用连接。

此时,最合理的技术路径不是弃用 Hibernate,而是在必要时刻“借道”其 Session 机制,将自定义连接精准注入单次执行上下文。Hibernate 提供了 Session.doWork(Work) —— 一个专为原生 JDBC 操作设计的安全钩子,它允许你在受管 Session 生命周期内直接访问底层 Connection,且该连接不会被归还至池中(只要你不显式提交或关闭它,Hibernate 会在 doWork 结束后自动清理)。

以下是推荐实现方式:

Agent Git Oracle
Agent Git Oracle

高级仓库分析与重构指南。基于AI推理识别技术债务与架构反模式。

下载
// 1. 构建带审计属性的连接(注意:务必使用与 Hibernate 相同的 JDBC URL 和驱动)
Properties auditProps = new Properties();
auditProps.setProperty("v$session.client_info", "USER=alice;ACTION=UPDATE_INVENTORY");
auditProps.setProperty("v$session.module", "InventoryService");

String jdbcUrl = "jdbc:oracle:thin:@//db.example.com:1521/ORCL";
Connection customConn = DriverManager.getConnection(jdbcUrl, auditProps);

// 2. 获取 Session 并绑定自定义连接(关键:使用 doWork + 自定义 ConnectionProvider)
Session session = sessionFactory.openSession();
try {
    session.doWork(connection -> {
        // 此处 connection 即为 customConn(需通过适配器桥接)
        // ✅ 但注意:Hibernate 默认不接受外部 Connection —— 需配合自定义 ConnectionProvider 或 TransactionCoordinator
        // 更可靠的做法是:使用 Spring 的 TransactionTemplate + DataSourceUtils(见下文替代方案)
    });
} finally {
    session.close();
}

⚠️ 重要限制与注意事项

  • Session.doWork() 中的 Connection 是 Hibernate 当前事务绑定的连接,无法直接替换为外部 DriverManager.getConnection() 实例。强行传入会导致 IllegalStateException 或连接泄漏。
  • 正确做法是:利用 Spring 的 TransactionTemplate + DataSourceUtils.getConnection()(若项目已集成 Spring),或实现 Hibernate ConnectionProvider 的轻量包装,使其在特定标记下返回新连接。

✅ 推荐生产级方案(Spring 环境):

@Autowired
private JdbcTemplate jdbcTemplate; // 或 DataSource

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveWithAuditContext(String userId, String action, InventoryEntity entity) {
    // Step 1: 获取带属性的新连接(不走池)
    Properties props = buildAuditProperties(userId, action);
    try (Connection con = dataSource.getConnection()) {
        // 设置 Oracle 客户端信息(关键!)
        con.setClientInfo("CLIENT_INFO", String.format("USER=%s;ACTION=%s", userId, action));

        // Step 2: 在该连接上执行 Hibernate 操作 → 需绕过 SessionFactory 默认行为
        // ✅ 方案:使用 Hibernate's StatelessSession(无缓存、无代理、直连)
        StatelessSession statelessSession = sessionFactory.openStatelessSession(con);
        try {
            statelessSession.insert(entity); // 或 update/delete
            // 触发器将读取当前连接的 client_info
        } finally {
            statelessSession.close();
        }
    } catch (SQLException e) {
        throw new RuntimeException("Failed to set audit context", e);
    }
}

? 总结

  • 不要试图“塞入”外部连接到标准 Session;应转向 StatelessSession(支持传入已有 Connection)或 Spring 的 DataSourceUtils 手动管理事务边界。
  • 每次操作后连接必须显式关闭(try-with-resources),避免连接泄漏。
  • 审计逻辑应严格限定于目标表,其他业务操作仍走常规 Hibernate 流程,保障性能与一致性。
  • 务必在数据库侧验证 SYS_CONTEXT('USERENV', 'CLIENT_INFO') 是否被触发器正确读取——这是方案成功的最终标尺。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

1833

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

5780

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

598

2025.10.14

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

20

2026.09.20

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

0

2026.09.20

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

180

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

100

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

80

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn