我想在(数据库)会话开始时将一些SQL发送到数据库。
例如SET TIME ZONE 'user-timezone'
,或将其客户端IP地址设置为自定义变量(postgres中的“GUC”)。
如何在Hibernate中自动执行此操作?
EclipseLink有一个postAcquireClientSession
事件,但我没有看到Hibernate。
答案 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
方面选择性地应用。