Hibernate没有';t更新加入的集合

Hibernate没有';t更新加入的集合,hibernate,orm,Hibernate,Orm,我有一个员工实体(员工(id、姓名、公司id)): 我有一个公司实体(公司(id,名称)): 我也尝试过更新(员工),但没有成功。我从代码中漏掉了什么?首先,您的员工集映射错误。换成 @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "company") @Where(clause="status_code = '1'") private Set<Employee> employeeSet;

我有一个员工实体(员工(id、姓名、公司id)):

我有一个公司实体(公司(id,名称)):


我也尝试过更新(员工),但没有成功。我从代码中漏掉了什么?

首先,您的
员工集
映射错误。换成

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "company")
@Where(clause="status_code = '1'")
private Set<Employee> employeeSet;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“company”)
@其中(子句=“状态\代码='1')
私人雇员集;

其次,您还需要处理关系的另一面,这意味着您需要将员工添加到新公司的
employeeSet
中,并将其从旧公司中删除。为了保持已加载到hibernate会话的公司的一致性,这是必需的。

我更正了映射。第二部分比我想象的要难。当我更新员工时,如何知道应该更新哪个公司?此外,我有所有公司的公司列表,还有一个服务列表,其中包含接受服务的公司(这是一个多对多连接),因此更新应该了解这两个方面。这是否意味着我必须手动更新所有列表?如果我正确理解了您的模型,您需要更新一个公司,以防您刚刚从中删除员工(即
employee.getCompany()
),如果您将员工移动到新公司(即新公司),则需要更新另一个公司。如果有多个列表包含应该更新的公司,只要这些列表包含托管实体,就不会有问题,因为它们都引用同一个公司实例。事实上,我忘记了。新公司的增资工作正在进行中,但我如何认识旧公司呢?我不会将以前的值存储在任何地方。您可以使用查询来查询它,只需确保设置
query.setFlushMode(FlushMode.MANUAL)
,因为没有它,更改将在执行查询之前刷新到数据库。
@Entity
public class Company {
    @Id
    @Column(name="ID")
    private Integer id; 

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="COMPANY_ID")
    @Where(clause="status_code = '1'")
    private Set<Employee> employeeSet;
    ...
}
sessionFactory.getCurrentSession().merge(employee);
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "company")
@Where(clause="status_code = '1'")
private Set<Employee> employeeSet;