【问题标题】:Hibernate Entity Listener for named query delete operation用于命名查询删除操作的休眠实体侦听器
【发布时间】:2013-08-15 16:51:28
【问题描述】:

对于我们的应用程序,我们需要使用休眠实现触发器。我们可以找到的一个最佳解决方案是使用 Annotation 的实体侦听器,因为我们需要侦听特定的实体更改。

除了使用命名查询删除之外,一切都很好,它不会给出任何事件。

代码实现 ** Entity** - 这里我们添加了监听器

@Entity
@EventListeners(EmployeeEventListener.class)
public class Employee {

  @Id
  private String uid;
  @Basic
  private Calendar lastUpdated;

实体监听器 -

监听器占用被修改的实体,执行预期的操作

public class EmployeeEventListener {
  @PrePersist
  public void prePersist(Object object) {
    Employee employee = (Employee)object;
    employee.setUID(UIDGenerator.newUUI());
    employee.setLastUpdated(Calendar.getInstance());
  }
  @PostUpdate
  public void postUpdate(Object object) {
    Employee employee = (Employee)object;
    employee.setLastUpdated(Calendar.getInstance());
  }

当我在实体管理器上使用 save 或 saveorupdate 时,@PrePersist@PostUpdate 运行良好。但是在执行删除命名查询时,我没有收到 @PreRemove@PostRemove 的事件

我也想获得一个删除事件。

【问题讨论】:

    标签: hibernate entitymanager entitylisteners


    【解决方案1】:

    这是不可能的:The Interceptor interface provides callbacks from the session to the application 并且通过本机 SQL 删除的对象不会传递给会话,因此回调不会运行

    【讨论】:

    • 谢谢 bellabax ,所以这行不通。好吧,我在想为什么休眠会具有事件和回调功能,如果适用于实体被加载到会话中并且对数据库操作的其他替代方式(例如使用 hql 或命名查询)无用的情况。当然这些查询由 hibernate 执行,所以为什么不给我一个回调。是 db trigger 是这里捕获命名查询的唯一选项吗?
    • 想想这个查询(HQL 或 SQL,没关系):delete * from table where <cond>。您直接从数据库和 ORM 中删除对象,以允许侦听器,应检索所有对象 @Id(至少)以允许侦听器运行。我认为这会对系统产生不良的性能影响。我从不需要监听器进行查询,我们使用触发器来实现我们的目的。
    • 是的..在我使用触发器的路上..谢谢
    • 你的意思是如果使用纯SQL,比如Query query = sessionFactory.getCurrentSession().createSQLQuery("update ... set ... where ...");,那么query.executeUpdate();Interceptor不会被触发吧?
    • 检查并找到拦截器在我的情况下不会被触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多