GeneralTao
GeneralTao

Reputation: 51

Can't remove child entity using CRUD repository in Spring

Parent entity:

@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
}

Child entity:

@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
}

App code:

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);         
}

What am I facing is:

For employee table:

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

For customer_order table:

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

So, I expected that after these strings execution

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

order1 row will be deleted from database. I think I need with some way to trigger order1 entity saving. I played around and even after order1 saving, it still remains in db with employee_id being null. I expected deleting of child, because I configured orders field as orphanRemoval = true.

My configs:

Upvotes: 1

Views: 259

Answers (1)

user2786531
user2786531

Reputation: 83

The employee1 will be detached after executing employeeRepository.flush(). You should change it's state to persistent. Why you don't execute employeeRepository.flush() after the last line of code?

Upvotes: 1

Related Questions