双向的@OneToMany/@ManyToOne关联级联操作
双向的@OneToMany/@ManyToOne关联级联操作
我在将一个实体(员工)与具有@OneToMany关系的实体(社区)进行映射时遇到了问题。
当我将一个实体(社区)分配给一个实体(员工),其中Community的值为null时,它能正常工作。
问题出现在当Employee已经被分配了一个Community的值时。
当我改变这个值并保存更改后,Employee得到了新的Community值,并且这个新的Community在集合中也有这个Employee。
唯一的问题是旧的Community仍然在集合中有这个Employee,但它应该被移除。这只发生在数据库重新启动时。
我尝试使用@JoinColumn和@JoinTable来解决这个问题,但问题仍然存在。我希望避免通过调用JPA在更新/创建服务方法中从旧关系中删除实体。
有没有解决这个问题的方法?
以下是代码:
社区实体:
@Entity @Table(name = "community") public class Community implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") @SequenceGenerator(name = "sequenceGenerator") @Column(name = "id") private Long id; @OneToMany(mappedBy = "community", orphanRemoval = true, cascade = CascadeType.ALL) private Setemployees = new java.util.LinkedHashSet<>(); // 其他属性和方法 }
员工实体:
@Entity @Table(name = "employee") public class Employee implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") @SequenceGenerator(name = "sequenceGenerator") @Column(name = "id") private Long id; @ManyToOne(optional = false) @JoinColumn(name = "community_id") private Community community; // 其他属性和方法 }
员工服务实现:
@Service @Transactional public class EmployeeServiceImpl implements EmployeeService { @Override public EmployeeDTO save(EmployeeDTO employeeDTO) { Employee employee = employeeMapper.toEntity(employeeDTO); employee = employeeRepository.save(employee); return employeeMapper.toDto(employee); } @Override public EmployeeDTO update(EmployeeDTO employeeDTO) { Employee employee = employeeMapper.toEntity(employeeDTO); employee = employeeRepository.save(employee); return employeeMapper.toDto(employee); } }
原因:根据问题描述,出现这个问题的原因可能有两个。一是可能在一个Community的集合中的Employee对象与另一个Community中的Employee对象不同,即它们的id不同,这可能是因为有重复的Employee对象存在。二是可能之前的更新操作没有正确提交到数据库,导致了数据丢失,即Employee对象与Community对象之间的关联外键community_id没有正确更新。
解决方法:根据问题描述,需要找出具体发生了什么。首先可以排除代码逻辑的问题,因为代码本身是正确的。然后可以检查是否存在重复的Employee对象,如果有,需要将其删除或合并。如果没有重复的Employee对象,则需要检查之前的更新操作是否正确提交到了数据库中,如果没有,需要重新提交。最后,还需要检查外键community_id是否正确更新,如果没有正确更新,需要找出原因并进行修复。