我有一个使用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吗?