Java 实体上的观察者并不总是有效的

Java 实体上的观察者并不总是有效的,java,spring,hibernate,spring-data,Java,Spring,Hibernate,Spring Data,我有一个spring引导和spring数据设置(@data)。当一个实体的属性发生更改时,我需要执行一些操作。我试图使用observer模式,所以当我们从代码中调用该属性的setter时,我已经在那里添加了stateChanged。你认为这会像预期的那样起作用吗,或者spring正在幕后调用setter?spring肯定不会不时调用这些setter 要在数据库中持久化实体更新之前执行自定义代码,可以对实体类中的方法使用@PreUpdate注释,或者如果@PreUpdate代码相同,则可以使用此方

我有一个spring引导和spring数据设置(@data)。当一个实体的属性发生更改时,我需要执行一些操作。我试图使用observer模式,所以当我们从代码中调用该属性的setter时,我已经在那里添加了stateChanged。你认为这会像预期的那样起作用吗,或者spring正在幕后调用setter?

spring肯定不会不时调用这些setter

要在数据库中持久化实体更新之前执行自定义代码,可以对实体类中的方法使用@PreUpdate注释,或者如果@PreUpdate代码相同,则可以使用此方法创建更高级别的抽象实体类

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

这样,您可以从setter中删除stateChanged调用。

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

对于hibernate实体,我们将org.hibernate.event.service.spi.EventListenerRegistry用于会话工厂,并侦听所需的事件,如PRE_UPDATE或SAVE等。在我们的示例中,侦听器是Springbean,具有其他应用程序的必要知识。然后,事件侦听器将事件发生的情况通知所需的bean。但这仅适用于休眠事件

对于其他场景,我们必须通知应用程序的其他部分发生了一些有趣的事情。并不是完全可以观察到的模式,但需求是相似的。我们使用org.springframework.context.ApplicationEventPublisher和其他bean使用org.springframework.context.ApplicationListener监听所需类型的事件


根据我的经验,第二种方式更干净,因为班级之间彼此都不知道。但是,如果您的实体是hibernate实体,这种方法可能不起作用。

我仍在研究这个问题。但是 我想我找到了答案。因为我确信我看到过二传手在春天的环境中在幕后被召唤。它来自AUTOWIRING-构造函数中的属性和AUTOWIRING

vs

因此,如果在构造函数中对该属性使用自动关联,则可以将观察者模式应用于spring环境中的实体


还是没有1000%的把握。因此,如果有人擅长该主题,请解释。

您的意思是,如果我将stateChange保留在setters中,则使用该对象的每个查询都会通知主题吗?看起来当前版本在序列化数据时没有调用setters。我将编辑我的答案。使用
@PostLoad
注释加载实体时,您可以收到通知,就像
@PreUpdate
示例一样。你想用这些观察者完成什么?如果你展示更大的图片,你可以得到更好的答案。我需要使用amazon SNS发送通知,当我的一个实体中的属性发生更改时,是时候通知其所有后续者了。如果你总是将更新的实体作为通知发送,而不仅仅是更改的字段
@PreUpdate
,那么应该这样做“因此,当我们从代码中调用该属性的setter时,我在其中添加了stateChanged”
 @Autowired private ServiceTest testService;
@Autowired
public ServiceOther(ServiceTest testService){
     this.testService = testService;
}