我有一个使用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。
谢谢!
答案 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?