当前位置: 首页 > 知识库问答 >
问题:

Hibernate不更新加入的集合

国斌斌
2023-03-14

我有一个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;
    ...
}
@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的员工),并将cascade设置为all,但当我将员工更新为另一个公司时,该公司的employeeSet不会刷新,旧公司也不会刷新,新公司也不会刷新。这是员工的更新方法:

sessionFactory.getCurrentSession().merge(employee);

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

共有1个答案

徐文彬
2023-03-14

首先,EmployeeSet映射是错误的。将其更改为

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

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

 类似资料:
  • 问题内容: 我有一个产品对象,它属于某些类别,即经典的多对一关系。 我想插入和更新产品而不预先选择类别。像这样: 要么 是否可以在不选择类别的情况下进行更新和插入?我不想为此使用HQL或直接查询。 问题答案: session.load()专门用于此类情况。以下: 不会打数据库。但是,如果没有提供给定ID的类别,它将在稍后阶段(刷新期间或多或少)引发异常。 使用速度快且没有副作用(级联等)。

  • 问题内容: 我发现从Hibernate的集合中删除orphan记录并没有被删除。我一定在做一些简单的错误(这是Hibernate-101!),但是我找不到它。 给定以下内容: 以及以下更新代码: DAO片段: 以下测试失败: 总而言之,我发现: 从作者的藏书中删除该书后,该书仍存在于数据库中 如果我检查,那本书不存在该书 这种“感觉”就像我没有刷新会话或适当地强制进行更新-但我不确定应该在哪里进行

  • 我有两个类和,它们具有一对多关系。 假设我已经在我的数据库结构中持久化了,如下所示: ---编辑--- 实体不是什么花哨的东西,比如:

  • 问题内容: 我有一个简单的测试,尝试在其中更新对象,但是合并似乎在执行插入操作而不是更新操作。 } 这是我的更新方法 更新代码 现在,我收到以下错误无法提交JPA事务;嵌套的异常是javax.persistence.RollbackException:标记为rollbackOnly的事务 问题答案: 我有一个版本列,当种子数据插入数据库时​​未设置该列。因此,所有有关更新和删除的问题

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 我正在学习hibernate和Spring Boot(也是Thymeleaf),遇到了以下问题: 环境:我有一个表单,处理创建和更新数据基于ID参数在GET方法,如果ID等于数据库中的一行,那么更新,否则保存。ID存储在隐藏的输入标记中,并与表单数据一起插入到实体对象中。然后将该对象发送给一个服务,该服务调用DAO来使用saveOrUpdate()方法保存或更新数据。 问题总结:在我的服务中,我有