【发布时间】:2020-03-24 16:08:38
【问题描述】:
得到这个异常
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);
【问题讨论】:
标签: hibernate spring-data-jpa many-to-many