实体观察员并不总是有效

时间:2017-04-11 08:06:39

标签: java spring hibernate spring-data

我有弹簧启动和弹簧数据设置(@Data)。当一个实体的属性发生变化时,我需要做一些动作。我试图使用观察者模式,所以当我们从代码中调用该属性的setter时,我在那里添加了stateChanged。你认为这会按照预期的方式运作,还是春天正在召唤幕后策划者?

3 个答案:

答案 0 :(得分:4)

Spring绝对不会不时地打电话给这些制定者。

要在数据库中保留实体更新之前执行自定义代码,可以在实体类中的方法上使用@PreUpdate注释,或者如果使用@,则可以使用此方法获得更高级别的抽象实体类。 PreUpdate代码是相同的。

@PreUpdate
public void onPreUpdate() {
    //your custom code here
}

执行此操作,您可以从您的setter中删除stateChanged调用。

答案 1 :(得分:1)

我们对两种不同的场景有类似的需求,并且必须使用两种不同的解决方案。

对于hibernate实体,我们将org.hibernate.event.service.spi.EventListenerRegistry用于会话工厂并监听所需的事件,如PRE_UPDATE或SAVE等。在我们的案例中,监听器是一个spring bean,具有其他应用程序的必备知识。然后事件监听器通知所需的bean发生的事件。但这只是有效的hibernate事件。

对于其他情况,我们必须通知应用程序的其他部分发生了一些有趣的事情。不完全可观察的模式,但需要类似。我们使用org.springframework.context.ApplicationEventPublisher和其他bean使用org.springframework.context.ApplicationListener

监听所需类型的事件

根据我的经验,第二种方式更清晰,因为班级彼此不了解。但是,如果您的实体是休眠实体,则此方法可能无效。

答案 2 :(得分:-1)

我还在研究这个问题。但.. 我想我找到了答案。因为我确信我在春天的环境中看到了在场景后面被召唤的人。 ITS from the AUTOWIRING-一个财产并在施工人员中自动化

 @Autowired private ServiceTest testService;

VS

@Autowired
public ServiceOther(ServiceTest testService){
     this.testService = testService;
}

如果我们在构造函数自动装配,那么观察者模式可以应用于弹簧环境中的实体 >对于那个属性。

仍然不是1000%肯定。所以如果有人擅长这个话题,请解释一下。