【问题标题】:Hibernate does't update joined collectionHibernate 不更新加入的集合
【发布时间】:2015-06-10 14:58:18
【问题描述】:

我有一个 Employee 实体(employee(id,name,company_id)):

@Entity
public class Employee {
    @Id
    @Column(name="ID")
    private Integer id; 

    @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name = "COMPANY_ID")
    private Company company;
    ...
}

我有一个公司实体(company(id,name)):

@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;
    ...
}

一家公司可以拥有更多员工,但一名员工一次属于一家公司。我加入了他们(我想获得状态为 1 的员工)并将级联设置为全部,但是当我将员工更新为另一家公司时,公司中的员工集不会刷新,旧的也不会刷新新公司。这是员工的更新方法:

sessionFactory.getCurrentSession().merge(employee);

我也尝试过 update(employee),但没有成功。我从代码中遗漏了什么?

【问题讨论】:

    标签: hibernate orm


    【解决方案1】:

    首先,您的employeeSet 映射错误。改成

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "company")
    @Where(clause="status_code = '1'")
    private Set<Employee> employeeSet;
    

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

    【讨论】:

    • 我更正了映射。第二部分比我想象的要难。当我更新员工时,我如何知道应该更新哪个公司?此外,我有所有公司的公司列表,并且有一个服务列表,其中包含提供服务的公司(这是一个多对多的连接),所以更新应该知道两者。这是否意味着我必须手动更新所有列表?
    • 如果我正确理解了您的模型,您需要更新一家公司,以防您只是将员工从其中移除(即employee.getCompany()),如果您要将员工转移到新公司,则需要更新另一家公司(那是新公司)。如果有多个列表包含应该更新的公司,那么只要列表包含托管实体就不会有问题,因为它们都将引用同一个公司实例。
    • 确实,我忘记了。添加到新公司现在工作,但我怎么知道旧公司?我不会在任何地方存储以前的值。
    • 你可以使用查询,只要确保设置query.setFlushMode(FlushMode.MANUAL),因为没有它,更改将在执行查询之前刷新到数据库。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2011-07-03
    • 1970-01-01
    • 2014-01-05
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多