【问题标题】:Is it possible to impl database 'trigger' in java code? (hibernate + jpa + spring + mysql)是否可以在 java 代码中实现数据库“触发器”? (休眠+ jpa + spring + mysql)
【发布时间】:2012-09-26 08:06:57
【问题描述】:

我正在使用 mysql 5.5 DB,hibernate.4.0 作为 spring 3.0.5 的 jpa 提供程序。

我的数据库中有一个user 表和privilege 表。我的数据库中还有一些触发器。这些触发器实现了我们应用程序的一些业务逻辑。

例如,用户 john 通过我的 Web 应用程序将记录插入表 table_foo

  1. 触发器BeforeInsertTableFoo 将检查用户的权限。如果用户没有权限,触发器将中止此操作。
  2. 另外,如果允许该操作,另一个触发器AfterInsertTableFoo将更新表table_bar中的一些记录。

有什么方法可以在 java 代码中将这个逻辑实现为“触发器”?似乎 Jpa Event Listener 和 Hibernate Event 只能做类似触发器的事情,但只能在一个表中。

当然,我可以使用 java 类来做同样的事情。但是当业务规则的数量增加时,我无法确保所有其他开发人员,甚至我自己,都会使用正确的 java 类进行数据库插入或更新。

提前谢谢。 安德鲁

【问题讨论】:

  • 嘿,你有什么解决办法吗?

标签: mysql hibernate jpa triggers


【解决方案1】:

更仔细地检查 JPA 的侦听器。您可以为 许多 个实体/表创建 一个 侦听器。

只需像这样设置一个监听器类:

public class MyListener {
@PrePersist void onPrePersist(Object entity ) {}
@PostPersist void onPostPersist(Object entity) {}
@PostLoad void onPostLoad(Object entity) {}
@PreUpdate void onPreUpdate(Object entity) {}
@PostUpdate void onPostUpdate(Object entity) {}
@PreRemove void onPreRemove(Object entity) {}
@PostRemove void onPostRemove(Object entity) {}

}

然后,对于您想要回调或“触发”的所有实体......

@Entity @EntityListeners(MyListener.class)
   public class Customer {
    }

我希望这会有所帮助。

-亚历克斯

【讨论】:

  • 谢谢亚历克斯。您的回答可以帮助我在一张表中实现类似触发器的操作。但我需要跨表完成这项工作。
  • 好吧,也许我不明白。我的意思是您可以创建一个侦听器类并将其传递给所有实体,它们执行通用逻辑或执行 if( instanceof .. 用于特定逻辑,对吗?
【解决方案2】:

我在google上找到了一些链接,里面提到了Spring managed event listeners with JPA

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多