【问题标题】:Hibernate, JPA cant delete one-to-many relationHibernate,JPA无法删除一对多关系
【发布时间】:2013-05-30 18:27:52
【问题描述】:

我有一对多的关系:

@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, 约束contact_ibfk_1外键 (user_id) 参考文献

UPD 删除用户的代码如下:

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

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

【问题讨论】:

  • 您是否尝试在OneToMany 关系上设置orphanRemoval = true?另外,您是如何尝试删除记录的?
  • 是的,我有。但出于某种原因,Maven 告诉我:“注释类型 OneToMany 的属性 orphanRemoval 未定义”。
  • orphanRemoval 是在 JPA 2.0 中引入的,所以如果您使用的是旧版本,可以解释为什么它未定义。 orphanRemoval 在类似的关系上总是对我有用(使用 eclipselink)。听起来CascadeType.DELETE_ORPHAN 是特定于Hibernate(且已弃用)的,相当于orphanRemoval,所以我不确定为什么它不适合你。最后一个想法是确保您拥有equalshashCode properly defined

标签: java hibernate jpa persistence


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多