我在存储这个简单的映射时遇到了一些问题:
@Entity
public class Account extends UUIDBase {
private Profile profile;
@OneToOne(cascade = CascadeType.ALL, optional = false)
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
}
@Entity
public class Profile extends UUIDBase {
...
}
我们的实体具有“creationDate”和“lastUpdated”的所有属性。这些属性放在映射的超类UUIDBase中。当实体被持久化或更新时,两个字段将在@PrePersist和@PreUpdate回调中更新。这种方法很好,除了级联的情况。
当我们存储帐户时,个人资料也会一直存储。帐户的creationDate和lastUpdated属性将通过回调方法初始化。不会调用Profile的回调方法。你有一个暗示会出错吗?
答案 0 :(得分:0)
他们应该被召唤。确保正确注册回调。
最近修复的MappedSuperclass上的回调存在问题,因此您可能需要在2.2中将回调添加到子类中。
您确定没有调用回调,还是没有更新值?
如果您直接在配置文件上调用persist,则回调称为?
如何注册回调?
答案 1 :(得分:0)
感谢您的回答。我想我现在修好了。我在上面描述了两个实体“帐户”和“个人资料”。上面的描述中缺少实体“员工”。这是映射:
@Entity
public class Employee extends UUIDBase {
public Account account;
@OneToOne(cascade = {CascadeType.REFRESH, CascadeType.REMOVE}, orphanRemoval = true)
public Account getAccount() {
return this.account;
}
public void setAccount(Account account) {
this.account = account;
}
}
映射是“员工可以拥有帐户。帐户必须有个人资料”。问题出在服务类中:
public void saveEmployee(Employee data) {
Employee savedEmployee = empDao.saveEmployee(data);
accountService.saveAccount(data.getAccount()); <-- Here is the failure
}
首先,我保存员工并获取已保存的员工对象。之后,我尝试通过自己的服务保存员工帐户。当我获取已保存的员工对象的帐户时,一切正常并且调用回调。当我从“data”参数中获取帐户时,不会调用回调。