我想在(数据库)会话开始时向数据库发送一些 SQL。
例如SET TIME ZONE 'user-timezone'
,或将其客户端 IP 地址设置为自定义变量(postgres 中的“GUC”)。
如何在 Hibernate 中自动执行此操作?
EclipseLink 有一个postAcquireClientSession
事件,但我没有看到 Hibernate 的事件。
更简单的方法是实现一个自定义 org.hibernate.service.jdbc.connections.spi.ConnectionProvider ,其中提供了一个示例here http://www.javalobby.org/java/forums/t18406.html并覆盖 getConnection,以便它运行您的 SQL。
其他更混乱且可能有效也可能无效的方法包括使用集成器来设置事件侦听器,这些方法侦听错误的级别,并在下面列出堆栈溢出问题 https://stackoverflow.com/questions/2288487/where-can-i-find-a-complete-list-of-all-hibernate-events。有关集成商的信息可从here http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#integrators.
像事件监听器这样的拦截器也会在错误的级别进行监听。其中一个例子是here http://examples.javacodegeeks.com/enterprise-java/hibernate/interceptor/hibernate-interceptor-example/
其他更复杂的方法是对 SessonFactory 实现进行子类化,以允许您查看自定义统计信息提供程序,如果启用了统计信息,则该提供程序将作为 JDBCContext 中的 connectionOpened 回调的一部分被调用。
或者,您可以对 SessonFactory 实现和 JDBC 上下文实现或 Session 实现进行子类化,以便自定义相同的 connectionOpened 回调来运行您的 SQL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)