使用 Hibernate 或 JDBC 将用户从 Java 中的用户会话传递到 Firebird 触发器
Passing user from user session in Java to Firebird Trigger using Hibernate or JDBC
我有一个用于审核数据修改的触发器。我需要在每次 JDBC 调用之前发送一个查询,以便它向 Firebird 发送用户 ID。我如何将它与 Hibernate 一起使用?
JDBC查询示例:
select rdb$set_context('USER_SESSION','CURRENT_USER', ?) from rdb$database
我知道有两种方法可以实现:
执行本机查询以设置值:
EntityManager em = emf.createEntityManager();
Query contextSetQuery = em.createNativeQuery(
"select rdb$set_context('USER_SESSION','CURRENT_USER', ?) from rdb$database");
contextSetQuery.setParameter(1, "MARK_NATIVE");
contextSetQuery.getSingleResult();
// other stuff
获取结果势在必行,因为获取结果才是实际设置上下文变量的内容。
解包到 Hibernate Session
并在连接上设置客户端信息 属性
EntityManager em = emf.createEntityManager();
Session session = em.unwrap(Session.class);
session.doWork(connection -> connection.setClientInfo("CURRENT_USER", "MARK_CLIENT_INFO"));
// other stuff
Connection.setClientInfo
的 Jaybird 实现将执行与本机查询(以及您问题中的查询)相同的操作。
我有一个用于审核数据修改的触发器。我需要在每次 JDBC 调用之前发送一个查询,以便它向 Firebird 发送用户 ID。我如何将它与 Hibernate 一起使用?
JDBC查询示例:
select rdb$set_context('USER_SESSION','CURRENT_USER', ?) from rdb$database
我知道有两种方法可以实现:
执行本机查询以设置值:
EntityManager em = emf.createEntityManager(); Query contextSetQuery = em.createNativeQuery( "select rdb$set_context('USER_SESSION','CURRENT_USER', ?) from rdb$database"); contextSetQuery.setParameter(1, "MARK_NATIVE"); contextSetQuery.getSingleResult(); // other stuff
获取结果势在必行,因为获取结果才是实际设置上下文变量的内容。
解包到 Hibernate
Session
并在连接上设置客户端信息 属性EntityManager em = emf.createEntityManager(); Session session = em.unwrap(Session.class); session.doWork(connection -> connection.setClientInfo("CURRENT_USER", "MARK_CLIENT_INFO")); // other stuff
Connection.setClientInfo
的 Jaybird 实现将执行与本机查询(以及您问题中的查询)相同的操作。