用于命名查询删除操作的Hibernate实体侦听器

用于命名查询删除操作的Hibernate实体侦听器,hibernate,entitymanager,entitylisteners,Hibernate,Entitymanager,Entitylisteners,对于我们的应用程序,我们需要使用hibernate实现触发器。我们可以找到的一个最佳解决方案是使用注释的实体侦听器,因为我们需要侦听特定的实体更改 除了使用命名查询的delete(它不提供任何事件)之外,其他一切都可以正常工作 代码实现 **实体**-这里我们添加了侦听器 @Entity @EventListeners(EmployeeEventListener.class) public class Employee { @Id private String uid; @Basi

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

除了使用命名查询的delete(它不提供任何事件)之外,其他一切都可以正常工作

代码实现 **实体**-这里我们添加了侦听器

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

  @Id
  private String uid;
  @Basic
  private Calendar lastUpdated;
实体侦听器-

侦听器接收实体,修改后的asd执行预期操作

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
运行良好。但是,当执行delete命名查询时,
@PreRemove
@postmove


我还想获取一个删除事件。

这是不可能的:
拦截器接口提供了从会话到应用程序的回调
,通过本机SQL删除的对象不会传递到会话,因此回调不会运行

,感谢bellabax,所以这不起作用。我在想为什么hibernate会有事件和回调功能,如果它适用于enity被加载到会话中的情况,而对于其他db操作的替代方式(比如使用hql或命名查询)则没有用处。当然,这些查询是由hibernate执行的,所以为什么不给我一个回调。db触发器是捕获命名查询的唯一选项吗?请考虑此查询(HQL或SQL,无所谓):
delete*from table where
。您正在直接从数据库中删除对象,为了允许侦听器,ORM应该检索所有对象
@Id
(至少)以允许侦听器运行。我认为这会对系统的性能产生不良影响。我从来都不需要一个监听器来进行查询,我们使用触发器来实现我们的目的。。在我使用触发器的路上。。谢谢你是说如果使用纯SQL,比如
Query Query=sessionFactory.getCurrentSession().createSQLQuery(“update…set…where…”)
,然后是
query.executeUpdate()<代码>拦截器
不会被触发,对吗?在我的情况下,选中并查找拦截器不会被触发。