Hibernate,JPA无法删除一对多关系

时间:2013-05-30 18:27:52

标签: java hibernate jpa persistence

我有一对多的关系:

@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)

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

  5. org.hibernate.annotations

    但没有任何帮助。我总是得到例外:

      

    org.hibernate.util.JDBCExceptionReporter - 无法删除或更新   父行:外键约束失败   (contactmanagercontact,CONSTRAINT contact_ibfk_1 FOREIGN KEY   (user_id)参考

    UPD 删除用户的代码如下:

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

    我会感激任何帮助!感谢。

1 个答案:

答案 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);
}