双向的@OneToMany/@ManyToOne关联级联操作

14 浏览
0 Comments

双向的@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 Set employees = 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);
    }
}

0
0 Comments

原因:根据问题描述,出现这个问题的原因可能有两个。一是可能在一个Community的集合中的Employee对象与另一个Community中的Employee对象不同,即它们的id不同,这可能是因为有重复的Employee对象存在。二是可能之前的更新操作没有正确提交到数据库,导致了数据丢失,即Employee对象与Community对象之间的关联外键community_id没有正确更新。

解决方法:根据问题描述,需要找出具体发生了什么。首先可以排除代码逻辑的问题,因为代码本身是正确的。然后可以检查是否存在重复的Employee对象,如果有,需要将其删除或合并。如果没有重复的Employee对象,则需要检查之前的更新操作是否正确提交到了数据库中,如果没有,需要重新提交。最后,还需要检查外键community_id是否正确更新,如果没有正确更新,需要找出原因并进行修复。

0