2013-05-30 33 views
1

我有一个一对多的关系:的Hibernate,JPA不能删除一个一对多的关系

@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

但nothi ng帮助。我总是得到异常:

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

一个删除用户

UPD 代码如下:

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

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

+0

您是否尝试在'OneToMany'关系上设置'orphanRemoval = true'?另外,你如何试图删除记录? – DannyMo

+0

是的,我已经。但由于某种原因,Maven告诉我:'注释类型OneToMany'的属性orphanRemoval未定义。 –

+0

'orphanRemoval'是在JPA 2.0中引入的,所以如果你使用的是旧版本,可以解释为什么它是未定义的。 'orphanRemoval'总是适用于我的类似关系(使用eclipselink)。这听起来像'CascadeType.DELETE_ORPHAN'是一个Hibernate特定的(和不赞成的)相当于'orphanRemoval',所以我不知道为什么它不适合你。最后一个想法是确保你有'equals'和'hashCode' [正确定义](http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html #持久类-equalshashcode)。 – DannyMo

回答

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