GORM (Hibernate) 拦截器在 Hibernate 在 Grails 应用程序的数据库中运行某些 SQL 之前运行它?
我有一个 grails 应用程序,其中使用 GORM。这很好用。但是我有一个要求,在数据库中调用任何 SQL 之前,它必须运行某个存储过程。那么,有没有一种方法可以触发我的方法,在 Hibernate 运行 SQL 进行选择、插入、更新、删除等之前启动存储过程。 我们将非常感谢您的回复。
(PS-我必须运行某些存储过程的原因是更改 Oracle Workspace)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可能有多种选择。
您可以使用扩展 org.springframework.jdbc.datasource.DelegatingDataSource 的 dataSource 包装器,并在调用 getConnection 时运行该语句。
我想每个事务只调用一次语句(存储过程)就可以了,所以 DelegatingDataSource 可能是最合适的解决方案。
您还可以使用 http://www.grails.org/plugin/jdbc-pool 插件(包装 Tomcat JDBC 池)并尝试挂钩数据源池实现。 Tomcat JDBC Pool 支持拦截器。
如果有帮助的话,也可以使用 Hibernate 拦截器修改 GORM/Hibernate 发送的 SQL:是否可以在 Grails 中动态映射域对象的表名称? .
There might be several options.
You could use a dataSource wrapper that extends org.springframework.jdbc.datasource.DelegatingDataSource and runs the statement whenever getConnection is called.
I guess it's ok to call the statement (stored proc) only once per transaction, so DelegatingDataSource is probably the most approriate solution.
You could also use http://www.grails.org/plugin/jdbc-pool plugin (wraps Tomcat JDBC Pool) and try to hook to the datasource pool implementation. Tomcat JDBC Pool supports interceptors.
It's also possible to modify the SQL sent by GORM/Hibernate using a Hibernate interceptor, if that helps: Is it possible to map a table name for a domain object dynamically in grails? .
目前尚不清楚是否要在执行任何 SQL 之前运行此存储过程一次,还是在执行每个 SQL 语句之前运行一次。以下是针对这两种情况的建议:
仅
调用一次在
Bootrap.init()
中调用存储过程的方法,然后每次
调用 之前* GORM 事件处理程序
It's not clear whether you want to run this stored proc once before any SQL is executed, or before every SQL statement is executed. Here's a suggestion for both cases:
Once Only
Call the method that invokes the stored proc in
Bootrap.init()
Before Every
Call the method from the before* GORM event handlers