我有一对多的关系:
@Entity
@Table(name = "Users")
public class User {
@Id
@Column(name = "user_id", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "login", nullable = false)
private String login;
@Column(name = "password", nullable = false)
private String password;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "role_id", nullable = false)
private Role role;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = javax.persistence.CascadeType.ALL)
private Set<Contacts> contacts = new HashSet<Contacts>();
我正在尝试删除所有联系人的User
对象;我试着用:
cascade = javax.persistence.CascadeType.ALL
cascade =
javax.persistence.CascadeType.REMOVE
@Cascade(CascadeType.DELETE)
的 org.hibernate.annotations
来自@Cascade(CascadeType.DELETE_ORPHAN)
org.hibernate.annotations
醇>
但没有任何帮助。我总是得到例外:
org.hibernate.util.JDBCExceptionReporter - 无法删除或更新 父行:外键约束失败 (
contactmanager
。contact
,CONSTRAINTcontact_ibfk_1
FOREIGN KEY (user_id
)参考
UPD 删除用户的代码如下:
@Transactional
public void removeUser(User user) {
sessionFactory.getCurrentSession().delete(user);
}
我会感激任何帮助!感谢。
答案 0 :(得分:0)
我在这里的建议是自己做关系管理。级联删除可能是棘手的(特别是在像你这样的情况下,你的双向关系的所有者不是声明级联的那个)并且经常非常危险,所以我通常更喜欢避免它们。特别是如果您运行的是JPA 2.0之前的版本,那么您没有太多的选择。我只想将删除方法更改为:
@Transactional
public void removeUser(User user) {
Set<Contacts> contacts = user.getContacts();
for (Contact contact : contacts) {
sessionFactory.getCurrentSession().delete(contact);
}
contacts.clear();
sessionFactory.getCurrentSession().delete(user);
}