Как лучше всего установить пользовательскую переменную MySQL в веб-приложении Java, Spring MVC, Hibernate с аннотациями? - PullRequest
1 голос
/ 07 октября 2010

Мне нужно иметь возможность установить пользовательскую переменную MySQL, которая используется в триггере в веб-приложении Spring MVC Hibernate. Эта переменная пользователя используется в триггерах MySQL для таблиц, которыми манипулирует Hibernate. Мне нужно, чтобы эта пользовательская переменная была правильно установлена ​​во время всех обращений Hibernate к базе данных.

К сожалению, в HQL нет метода установки пользовательских переменных MySQL, и метод, который я нашел для непосредственного выполнения MySQL, похоже, не работает с транзакцией. Поскольку срок жизни пользовательской переменной - это время соединения с базой данных, мне нужно, чтобы MySQL выполнялся с использованием того же соединения, с которым будет выполняться их HQL. Однако мои транзакции, похоже, запускают HQL после того, как собственный MySQL был выполнен, и, следовательно, ожидаемая пользовательская переменная отсутствует для триггера 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. Я подтвердил это путем тестирования без присутствия триггеров.

1 Ответ

2 голосов
/ 08 октября 2010

Я нашел этот вопрос, который очень похож на мой: Как использовать переменные Mysql с 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();
...