GORM (Hibernate) 拦截器在 Hibernate 在 Grails 应用程序的数据库中运行某些 SQL 之前运行它?

发布于 2024-10-31 19:01:44 字数 200 浏览 5 评论 0 原文

我有一个 grails 应用程序,其中使用 GORM。这很好用。但是我有一个要求,在数据库中调用任何 SQL 之前,它必须运行某个存储过程。那么,有没有一种方法可以触发我的方法,在 Hibernate 运行 SQL 进行选择、插入、更新、删除等之前启动存储过程。 我们将非常感谢您的回复。

(PS-我必须运行某些存储过程的原因是更改 Oracle Workspace)

I have a grails application in which I am using GORM. This works great. However I have a requirement where, before any SQL is called in the database, it has to run a certain stored procedure. So, is there a way I can do something that will trigger my method that kicks off a stored procedure before Hibernate runs the SQL for select, insert, update, delete etc.
Your response will be greatly appreciated.

(P.S.- The reason I have to run certain stored procedure is to change Oracle Workspace)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执手闯天涯 2024-11-07 19:01:44

可能有多种选择。

您可以使用扩展 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? .

画离情绘悲伤 2024-11-07 19:01:44

目前尚不清楚是否要在执行任何 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文