Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate:事件侦听器或拦截器,在实践中有哪些优点/缺点?_Hibernate - Fatal编程技术网

Hibernate:事件侦听器或拦截器,在实践中有哪些优点/缺点?

Hibernate:事件侦听器或拦截器,在实践中有哪些优点/缺点?,hibernate,Hibernate,我将实现一个功能,在Hibernate执行删除操作后更新表中的id。但我想得到一些关于哪种方法更好的反馈。另外,我正在更新表中的值,Hibernate不知道,所以我必须直接进行jdbc更新——这是可能的。至于使用侦听器/侦听器,我会选择侦听器——它在可以侦听的事件方面更灵活。拦截器的主要目的是在某个事件发生之前检查/更改对象属性(例如删除);而侦听器可以配置为侦听“PostDelete”事件或 但是,如果所述表未映射,为什么您需要其中一个?您可以在调用delete()之后(或者在调用flush(

我将实现一个功能,在Hibernate执行删除操作后更新表中的id。但我想得到一些关于哪种方法更好的反馈。另外,我正在更新表中的值,Hibernate不知道,所以我必须直接进行jdbc更新——这是可能的。

至于使用侦听器/侦听器,我会选择侦听器——它在可以侦听的事件方面更灵活。拦截器的主要目的是在某个事件发生之前检查/更改对象属性(例如删除);而侦听器可以配置为侦听“PostDelete”事件或

但是,如果所述表未映射,为什么您需要其中一个?您可以在调用delete()之后(或者在调用flush()之后,如果涉及外键),直接在代码中更新它


您也可以在触发器中执行此操作(当然,这可能取决于数据库中是否有必要的信息)。

正如我所知,拦截器是hibernate团队的旧实现,侦听器是拦截器的新灵活版本。我觉得使用hibernate listener作为拦截器更容易。

似乎很多人更喜欢侦听器-它们提供了更广泛的事件列表,并且更灵活,但有些东西拦截器提供,而侦听器不提供


例如,如果您想在将实体保存到数据库之前修改实体,则应使用拦截器。

那么hibernate会看到一个视图,我需要在delete上传入一个会话id,我无法在where子句中传入该id。因此,当hibernate在视图上执行删除操作时,会运行一个“而不是”触发器,但在该触发器运行之后,我需要某种方式将刚刚执行删除操作的人员的会话id作为审计形式传递到视图的基表中。但是hibernate对这个基表一无所知,所以@PostDelete可以对一个非orm的表进行插入/更新吗?@PostDeleteEvent(传递给您的侦听器)扩展了AbstractEvent(),它有一个getSession()方法。因此,您可以使用
createSQLQuery()
或将SQL定义为命名查询并使用
getNamedQuery()
,设置必要的参数并执行它。我还没有在PostDeleteListener中特别尝试过这个,但我不明白为什么它不起作用。我知道这是一个陈旧的线程,但只适用于任何新的谷歌用户;在侦听器中获取新会话的最佳方法是使用:
StatelessSession session=event.getPersister().getFactory().openStatelessSession()我们还可以在使用侦听器将实体保存到数据库之前修改它。在Preperis或preUpdate方法中