gpt4 book ai didi

java - 在 hibernate 状态下删除多个关系

转载 作者:行者123 更新时间:2023-11-29 23:27:51 24 4
gpt4 key购买 nike

我的实体:

@Entity
public class User{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UC> owned = new ArrayList<UC>();
}

@Entity
public class UC{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JoinColumn(name = "ukId")
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userId")
private User user;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "catId")
private Cat cat;
}

@Entity
public class Cat{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "catId")
private Long id;
@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
private List<UC> owned = new ArrayList<UC>();
}

这就是我的问题,实际上很少。

问题#1:

我删除了一个 Cat 对象,我在 Cat 中的拥有列表中设置了cascadeType.All,因此当我删除 Cat 对象时,UC 中带有 Cat 的所有记录都将被删除,但是我得到“已删除的对象将被重新保存”通过级联”,这是因为我在 UC 与 User 之间有另一个关系,他将 UC 存储在列表中。当我从 UC 中删除 Cat 对象和记录时,我不想删除 User 对象,因此在 UC 中的 @ManyToOne 上设置级联是不行的。我该怎么办?在删除 Cat 之前,我是否应该从用户拥有的列表中删除 UC 的所有实例?我在 UC 中的关系比此处显示的要多,如果是这种情况,我也必须从其他列表中删除实例。

问题#2:

类似的情况,但我有常规的多对多关系,我想删除连接表记录而不删除关系的另一端。

最佳答案

这是我的解决方案。首先,我会去在OneToMany关联上设置一个孤儿移除,通过这种方式。

@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL, orphanRemoval = true)

然后,假设您有一个要删除的用户 u 和 Cat c。这段代码应该可以正常工作

    // Remove a cat and update the other entities
Session s = sessionFactory.openSession();
s.beginTransaction();
s.delete(c);
for (UC uc : c.getOwned())
uc.getUser().getOwned().remove(uc);
s.update(u);
s.getTransaction().commit();
s.close();

关于java - 在 hibernate 状态下删除多个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26815807/

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