使用Hibernate级联删除不希望在Map上工作



我有一个使用PostgreSQL支持的Hibernate的应用程序。

我有一个部门的第一堂课:

class Department {
    ...
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
    @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN })
    Collection<User> getUsers() {
        return users;
    }
}

然后我有一个用户类:

class User {
    ...
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="user_guid", referencedColumnName="guid")
    @MapKey(name="deviceGuid")
    @Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    public Map<String, Device> getDevices() {
        return devices;
    }
}

然后我有一个设备类,现在没有任何链接:

class Device {
    ...
}

要删除用户,我只需将其从部门的"用户集合"中删除,级联就可以清除孤立用户。

现在,我希望映射中的所有设备实例也被删除,但这不会发生。所以我得到了一个典型的错误:

Caused by: java.sql.BatchUpdateException: Batch entry 0 update equipment.device set user_guid=null where user_guid='88a5b24c-b20f-4aa4-93d0-36fafed0f3c1' was aborted. Call getNextException to see the cause.

我做错了什么?

我使用的是PostgreSQL,Hibernate 3.4.0,JPA 1.0.2。

谢谢!

好吧,我终于找到了答案。

问题是我的设备类是这样的:

Device {
    ...
    @ManyToOne(optional=false, fetch = FetchType.LAZY)
    @JoinColumn(name="user_guid", referencedColumnName="guid")
    public UserDO getUser() {
        return user;
    }
}

因此,User和Device都有@JoinColumn注释。这意味着双方都会加深关系。这太愚蠢了。仅从用户中删除@JoinColumn就解决了问题。

所以现在,用户是这样的(注意新的mappedBy属性):

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="user")
@MapKey(name="deviceGuid")
public Map<String, Device> getDevices() {
    return devices;
}

这是帮助我找到答案的堆栈溢出问题:有人能解释一下hibernate中的mappedBy吗?

最新更新