【问题标题】:Referential integrity constraint violation on delete in a manytomany relationship在多对多关系中删除时违反参照完整性约束
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      相关资源
      最近更新 更多