1

我有一对多的关系:

@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所有联系人的对象;我尝试使用:

  1. cascade = javax.persistence.CascadeType.ALL
  2. cascade = javax.persistence.CascadeType.REMOVE

  3. @Cascade(CascadeType.DELETE)org.hibernate.annotations

  4. @Cascade(CascadeType.DELETE_ORPHAN)org.hibernate.annotations

但没有任何帮助。我总是遇到异常:

org.hibernate.util.JDBCExceptionReporter - 无法删除或更新父行:外键约束失败 ( contactmanager. contact, CONSTRAINT contact_ibfk_1FOREIGN KEY ( user_id) REFERENCES

删除用户的UPD 代码如下:

@Transactional
public void removeUser(User user) {
    sessionFactory.getCurrentSession().delete(user);
}

我将不胜感激任何帮助!谢谢。

4

1 回答 1

0

我在这里的建议是自己进行关系管理。级联删除可能很棘手(特别是在像您这样的情况下,双向关系的所有者不是声明级联的人)并且通常非常危险,因此我通常更愿意避免它们。特别是如果您运行的是 JPA pre-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);
}
于 2013-06-01T00:24:17.963 回答