如何使用Hibernate在连接/会话开始时对db运行SQL SET语句?

时间:2014-02-19 23:33:24

标签: sql hibernate events

我想在(数据库)会话开始时将一些SQL发送到数据库。

例如SET TIME ZONE 'user-timezone',或将其客户端IP地址设置为自定义变量(postgres中的“GUC”)。

如何在Hibernate中自动执行此操作?

EclipseLink有一个postAcquireClientSession事件,但我没有看到Hibernate。

2 个答案:

答案 0 :(得分:5)

更简单的方法是实现自定义的org.hibernate.service.jdbc.connections.spi.ConnectionProvider,其示例提供here并覆盖getConnection,以便它运行您的SQL。 / p>

其他方法更加混乱,可能会或可能不会起作用,包括使用集成器来设置事件监听器,这些监听器在错误的级别监听并列在以下Stack Overflow question中。有关集成商的信息,请访问here

像Event Listeners这样的拦截器也会听错。它们的一个例子是here

其他更复杂的方法是继承SessonFactory实现,以允许您查看自定义统计信息提供程序,如果启用了统计信息,该提供程序将作为JDBCContext中connectionOpened回调的一部分进行调用。

或者,您可以继承SessonFactory Implementation和JDBC上下文实现或Session Implementation,以便自定义相同的connectionOpened回调来运行SQL。

答案 1 :(得分:2)

这可以通过hibernate会话完成:

session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.prepareStatement("SET TIME ZONE 'user-timezone'").execute();
    }
});

这可以通过实用方法完成,也可以通过@Before方面选择性地应用。