我有一个用于审核数据修改的触发器。我需要在每次 JDBC 调用之前发送一个查询,以便它将用户 ID 发送到 Firebird。我如何将它与 Hibernate 一起使用?
JDBC查询示例:
select rdb$set_context('USER_SESSION','CURRENT_USER', ?) from rdb$database
最佳答案
我知道有两种方法可以实现这一目标:
执行 native 查询来设置值:
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 实现将执行与 native 查询(以及您问题中的查询)相同的操作。
关于hibernate - 使用 Hibernate 或 JDBC 将用户从 Java 中的用户 session 传递到 Firebird 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413788/