我需要能够在Spring MVC Hibernate web ap中设置一个用于触发器的MySQL用户变量。此用户变量用于由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);
当Spring MVC提交我的事务时,它运行HQL查询然后抛出异常,因为@current_user_id导致MySQL触发器中断。我通过在没有触发器的情况下进行测试来验证这一点。
答案 0 :(得分:2)
我发现这个问题与我的问题非常相似:How to use Mysql variables with Hibernate?
所以我遵循了这个建议,并在实体管理器上使用了一个存储过程和executeNativeQuery方法来调用它。
这是我的存储过程代码:
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();