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

时间:2015-02-19 18:38:53

标签: java hibernate jpa

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

我有第一个系类:

class Department {

    ...

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

然后我有一个User类:

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;
    }
}

然后我有一个Device类,暂时没有任何链接:

class Device {
    ...
}

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

现在,我希望删除Map中的所有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。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

问题是我的Device类是这样的:

Device {

    ...

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

因此用户和设备都有@JoinColumn注释。这意味着双方都建立了这种关系。这是愚蠢的。只需从用户中删除@JoinColumn即可解决问题。

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

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

这是帮助我找到答案的Stackoverflow问题:Can someone please explain mappedBy in hibernate?