【发布时间】: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_id 是null。我希望删除孩子,因为我将 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