【问题标题】:Can't remove child entity using CRUD repository in Spring无法在 Spring 中使用 CRUD 存储库删除子实体
【发布时间】:2022-01-25 15:53:24
【问题描述】:

父实体:

@Entity
class Employee {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName ="";
    private String lastName;
    private String role;

    @OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Order> orders;

    public void addOrder(Order order) {
        orders.add(order);
        order.setEmployee(this);
    }

    public void removeOrder(Order order) {
        orders.remove(order);
        order.setEmployee(null);
    }

    @Override
    public boolean equals(Object o) {

        if (this == o)
            return true;
        if (!(o instanceof Employee))
            return false;
        Employee employee = (Employee) o;
        return Objects.equals(this.id, employee.id)
                && Objects.equals(this.firstName, employee.firstName)
                && Objects.equals(this.lastName, employee.lastName)
                && Objects.equals(this.role, employee.role);
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.id, this.firstName, this.lastName, this.role);
    }

    // Constructor, getters, setters
}

子实体:

@Entity
@Table(name = "CUSTOMER_ORDER")
class Order {
    @Id
    @GeneratedValue
    private Long id;

    private String description;
    private Status status;

    @ManyToOne
    private Employee employee;

    @Override
    public boolean equals(Object o) {

        if (this == o)
            return true;
        if (!(o instanceof Order))
            return false;
        Order order = (Order) o;
        return Objects.equals(this.id, order.id) && Objects.equals(this.description, order.description)
                && this.status == order.status;
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.id, this.description, this.status);
    }

    // Constructor, getters, setters
}

应用代码:

public static app() {
    ...
    Employee employee1 = new Employee("Bilbo", "Baggins", "burglar", new ArrayList<>());
    employeeRepository.save(employee1);
    
    Order order1 = new Order("Xiaomi", Status.IN_PROGRESS);
    orderRepository.save(order1);

    employee1.addOrder(order1);
    employeeRepository.save(employee1);
    employeeRepository.flush();
    orderRepository.flush();
    employee1.removeOrder(order1);
    employeeRepository.save(employee1);         
}

我面临的是:

对于employee 表:

| id | first_name | last_name | role    |
| -- | ---------- | --------- | ------- |
| 1  | Bilbo      | Baggins   | burglar |

对于customer_order 表:

| id | description | status    | employee_id |
| -- | ----------- | --------- | ----------- |
| 1  | Xiaomi      | 0         | 1           |

所以,我希望在这些字符串执行之后

employee1.removeOrder(order1);
employeeRepository.save(employee1);

order1 行将从数据库中删除。 我想我需要某种方式来触发order1 实体保存。我玩过,即使在order1 保存之后,它仍然保留在数据库中,employee_idnull。我希望删除孩子,因为我将 orders 字段配置为 orphanRemoval = true

我的配置:

  • java: 11
  • 休眠:5.4.32
  • 弹簧启动:2.5.3
  • mysql: 8.0.26
  • spring-data-jpa: 2.5.3
  • hibernate-jpamodelgen: 5.4.32

【问题讨论】:

  • 由于订单已经不在数组中了,spring不知道要更新它,你应该使用order repo删除一个订单
  • @Chrys ,所以我需要触发订单和员工功能来删除孩子吗?有没有办法用一个像 .deleteChildFromDB 这样的函数来做到这一点?

标签: java spring hibernate jpa crud-repository


【解决方案1】:

employee1 将在执行employeeRepository.flush() 后分离。您应该将其状态更改为持久。 为什么在最后一行代码之后不执行employeeRepository.flush()

【讨论】:

  • 是的,我不明白 Spring Data JPA 中 .flash() 方法的特定用途。我会审查它。
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2018-06-11
  • 2017-03-28
  • 2020-05-05
  • 2015-07-16
  • 2019-03-10
相关资源
最近更新 更多