gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:39:20 25 4
gpt4 key购买 nike

我有一对多关系:

@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. 级联=
    javax.persistence.CascadeType.REMOVE

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

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

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

org.hibernate.util.JDBCExceptionReporter - Cannot delete or update a parent row: a foreign key constraint fails (contactmanager.contact, CONSTRAINT contact_ibfk_1 FOREIGN KEY (user_id) REFERENCES

UPD删除User的代码如下:

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

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

最佳答案

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

关于java - Hibernate,JPA无法删除一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com