Reputation: 51
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
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