CascadeType.ALL和生命周期回调的问题

时间:2011-06-15 08:28:42

标签: jpa eclipselink lifecycle cascade one-to-one

我在存储这个简单的映射时遇到了一些问题:

@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的回调方法。你有一个暗示会出错吗?

2 个答案:

答案 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”参数中获取帐户时,不会调用回调。