在Java、Spring MVC、Hibernate with Annotations web应用程序中设置MySQL用户变量的最佳方法是什么?

在Java、Spring MVC、Hibernate with Annotations web应用程序中设置MySQL用户变量的最佳方法是什么?,java,mysql,hibernate,web-applications,spring-mvc,Java,Mysql,Hibernate,Web Applications,Spring Mvc,我需要能够设置一个MySQL用户变量,该变量用于Spring MVC Hibernate web ap中的触发器。此用户变量用于Hibernate操作的表上的MySQL触发器。我需要在Hibernate对数据库的所有写访问期间正确设置这个用户变量 不幸的是,HQL没有设置MySQL用户变量的技术,我找到的直接执行MySQL的方法似乎不适用于事务。因为用户变量的生命周期是数据库连接的生命周期,所以我需要MySQL使用与HQL执行相同的连接来执行。但是,我的事务似乎在执行本机MySQL之后运行HQL

我需要能够设置一个MySQL用户变量,该变量用于Spring MVC Hibernate web ap中的触发器。此用户变量用于Hibernate操作的表上的MySQL触发器。我需要在Hibernate对数据库的所有写访问期间正确设置这个用户变量

不幸的是,HQL没有设置MySQL用户变量的技术,我找到的直接执行MySQL的方法似乎不适用于事务。因为用户变量的生命周期是数据库连接的生命周期,所以我需要MySQL使用与HQL执行相同的连接来执行。但是,我的事务似乎在执行本机MySQL之后运行HQL,因此MySQL触发器不存在预期的用户变量

要执行本机MySQL查询,我一直在使用:

HibernateEntityManager em=(HibernateEntityManager) getEntityManager();
Connection connection=em.getSession().connection();
Statement s = connection.createStatement();
s.executeUpdate("SET @current_user_id="+userId);

当springmvc提交我的事务时,它运行HQL查询,然后抛出异常,因为@current_user_id导致MySQL触发器中断。我在没有触发器的情况下通过测试验证了这一点。

我发现这个问题与我的问题非常相似:

因此,我按照建议,在实体管理器上使用存储过程和executentivequaly方法来调用它

这是我的存储过程代码:

DROP PROCEDURE IF EXISTS set_current_user
CREATE PROCEDURE set_current_user(IN user_id BIGINT)
BEGIN
  SET @current_user_id = user_id
END
我称之为:

Query q = em.createNativeQuery("CALL set_current_user("+userId+")");
        q.executeUpdate();