gpt4 book ai didi

java - 当类删除对关联表的引用时,如何从关联表中删除行?

转载 作者:行者123 更新时间:2023-11-29 16:07:05 25 4
gpt4 key购买 nike

我有三个类,用户和产品,以及它们的关联类订单。我希望能够通过编辑用户或产品中的集来添加和删除关联表中的行。添加工作正常,但是当我从例如中删除一些订单时用户,它们保存在数据库中。

已关注 this example我想出了这段代码。

@Getter
@Setter
@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private Set<Order> orders;

public void setOrders(Set<Order> orders) {
this.orders = orders;
orders.forEach(order -> order.setUser(this));
}
}

@Getter
@Setter
@Entity
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
private Set<Order> orders;

public void setOrders(Set<Order> orders) {
this.orders = orders;
orders.forEach(order -> order.setProduct(this));
}
}

和关联类:

@Getter
@Setter
@Entity
@NoArgsConstructor
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@ManyToOne
@JoinColumn
private Product product;

@NotNull
@ManyToOne
@JoinColumn
private User user;

public Order(User user, Product product) {
this.user = user;
this.project = project;
}

@Override
public boolean equals(Object o){
if (this == o) return true;
if (!(o instanceof Order)) return false;
Engagement that = (Order) o;
return Objects.equals(user.getUsername(),
that.user.getUsername()) &&
Objects.equals(product.getName(),
that.product.getName());
}

@Override
public int hashCode(){
return Objects.hash(user.getUsername(),
product.getName());
}
}

在我的 OrderService 类中,我添加和编辑一组订单,如下所示:

public addProductsToUser(User user, Set<Product> products){
Set<Order> orders = products.stream().map(product -> new Order(user, product)).collect(Collectors.toSet());
user.setOrders(orders);
userRepository.save(user); //save from CrudRepository
}

我预计当我更新用户时,它也会更新订单,以便不再引用的订单将被删除,但我得到了我保留的多个订单条目。

最佳答案

我认为您正在寻找orphanRemoval = true。这指定与父级断开连接的对象将被删除。

在您的情况下,注释看起来像这样:

@OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL)
private Set<Order> orders;

有关更多详细信息以及两者之间的区别,请参阅这篇文章: What is the difference between cascade and orphan removal from DB?

关于java - 当类删除对关联表的引用时,如何从关联表中删除行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55633401/

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