在多对多关系中删除时违反引用完整性约束



获取此异常

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKrtt5rijo65gon4wgqj4pv44hj: PUBLIC.user_order FOREIGN KEY(order_id) REFERENCES PUBLIC.""order""(id) (1)"; SQL statement:
delete from "order" where "id"=?

具有以下设置:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract @Data class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_order",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "order_id"))
private Set<Order> orders = new HashSet<>();
}
@EqualsAndHashCode(callSuper = true)
@Entity
public @Data class Client extends User {
// just fields
}
@EqualsAndHashCode(callSuper = true)
@Entity
public @Data class Worker extends User {
// just fields
}
@Entity
public @Data class Order {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "orders")
@ToString.Exclude @EqualsAndHashCode.Exclude // this is due to a lombok specific stackOverFlow 
private Set<User> users = new HashSet<>();
}

当我在谷歌上搜索时,每个问题都是由于关系设置不正确造成的,我已经对所有内容进行了三次检查,在我看来都是正确的,当我检查生成的表时,所有内容都是我想要的。但是,当我尝试删除订单时,我仍然会遇到上述异常。有什么线索可以说明原因吗?

如果有用的话,我有一个关于上下文刷新的数据初始化:

Worker workerA = (Worker) new Worker().setSalary(BigDecimal.ZERO).setRole(Role.USER).setName("Kate")
.setLastName("Park").setPassword(encoder.encode("123"))
.setUsername("immkath").setFatherName("Andrii")
.setPhone("+38(066) 207 0746");
Worker workerB = (Worker) new Worker().setSalary(BigDecimal.TEN).setRole(Role.ADMIN).setName("Dar")
.setLastName("Poz").setPassword(encoder.encode("123"))
.setUsername("dpozinen").setFatherName("Andrii")
.setPhone("+38(050) 385 0660");
Order orderA = new Order().setPayState(OrderState.NOT_PAYED).setPrice(BigDecimal.valueOf(12))
.setDueDate(LocalDateTime.of(1999, 2, 3, 12, 22))
.setWorkState(OrderState.QUEUED).setCreatedDate(LocalDateTime.now());
Order orderB = new Order().setPayState(OrderState.PAYED).setPrice(BigDecimal.valueOf(12))
.setDueDate(LocalDateTime.of(1999, 2, 3, 12, 22))
.setWorkState(OrderState.DELAYED).setCreatedDate(LocalDateTime.now());
workerA.getOrders().add(orderA);
workerB.getOrders().add(orderB);
userRepo.save(workerA);
userRepo.save(workerB);

关系的两端没有cascade = CascadeType.ALL。在您的情况下,这意味着如果您尝试删除用户,它将自动删除他的user_order条目。

但是,如果您删除订单(就像您正在做的那样(,因为它不是级联的,它没有从user_order中删除的权限,并且在该表中,您仍然有指向您试图删除的订单的条目。

首先手动删除存在此订单的所有user_order条目,然后再删除订单本身,或者将cascade = CascadeType.ALL放在此处@ManyToMany(mappedBy = "orders", cascade = CascadeType.ALL)

最新更新