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

标签 java mysql hibernate web-applications spring-mvc

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

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

要执行我一直在使用的 native 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 触发器中断。我通过在不存在触发器的情况下进行测试验证了这一点。

最佳答案

我发现这个 SO 问题与我的非常相似: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();

关于java - 在 Java、Spring MVC、Hibernate with Annotations Web 应用程序中设置 MySQL 用户变量的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877423/

相关文章:

java - BitSet valueOf 的作用是什么?

php - 高效更新mysql数据库数据

hibernate - 如何毫无问题地使用JPA 2.0 @ManyToMany

java - spring- uuid 作为主键无法更新

java - JTextPane 不换行?

java.lang.UnsatisfiedLinkError : Native method not found: package. ClassName.stringFromJNI:()Ljava/lang/String;

java - 如何用eclipse设置JFrame背景图片

mysql - HL7-FHIR:使用 RESTful api 和 json 还是适应数据库的格式更好?

mysql - 在 Rails 中添加外键

mysql - Spring JPA OneToMany 重复条目 MySQLConstraint 违规错误