gpt4 book ai didi

java - EntityLIstener 未通过级联的 OneToOne 映射调用

转载 作者:行者123 更新时间:2023-12-01 14:32:54 27 4
gpt4 key购买 nike

我有一个 Application 对象和一些 Form 对象。每次保存表单时,我想更新Application.lastUpdated。应用程序有一个 EntityListener,我想用它来设置 Application.lastUpdated。

当我保存应用程序时,EntityListener 被调用并且它可以工作。但是,当我保存表单时,不会调用 EntityListener。我可以通过调试以及 lastUpdated 字段没有改变的事实看到这一点。表单与 CascadeType.ALL 的应用程序具有单向 OneToOne 关系。

我可以让这个设置起作用吗?如果没有,有没有比手动更好的方法每次保存表单时都会更新 Application.lastUpdated 吗?

我正在使用由 Hibernate 和 HSQLDB 支持的 JPA。所有注释都是JPA。

这是表单的关系定义

@Entity
public class CourseForm implements Serializable {

private static final long serialVersionUID = -5670525023079034136L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "application_fk")
private Application application;
//more fields
//getters and setters
}

应用程序如下所示:

@Entity
@EntityListeners({ LastUpdateListener.class })

public class Application implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;

private LocalDateTime lastUpdate;


//more fields

Application() {
}

public LocalDateTime getLastUpdate() {
return lastUpdate;
}

public void setLastUpdate(LocalDateTime lastUpdate) {
this.lastUpdate = lastUpdate;
}
//getters and setters
}

这是听众

public class LastUpdateListener {
@PreUpdate
@PrePersist
public void setLastUpdate(Application application) {
application.setLastUpdate(LocalDateTime.now());
}

最佳答案

我怀疑上述设置不起作用,因为 Application 对象实际上并未更改,因此这就是 @prePersist 和 @PreUpdate 没有被调用的原因。

我通过让每个 Form 实现一个 MasterForm 接口(interface)来解决这个问题:

public interface MasterForm {
Application getApplication();
}

然后我将 EntityListener 移到每个表单上,并让它直接更新应用程序,如下所示:

public class LastUpdateListener {
@PreUpdate
@PrePersist
public void setLastUpdate(MasterForm form) {
form.getApplication().setLastUpdate(LocalDateTime.now());
}

这按预期工作。

关于java - EntityLIstener 未通过级联的 OneToOne 映射调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16718461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com