Spring Data JPA:通过独立仓库更新嵌入集合时如何更新实体?
问题概述
我有一个包含Order关联集合的Customer实体,使用独立的Spring Data JPA仓库(CustomerRepository和OrderRepository)对两者进行更新操作。
在同一个事务方法内执行以下操作:
- 通过
OrderRepository的save方法为某客户添加订单 - 通过
CustomerRepository的findById方法读取该客户
预期结果:客户实体包含新增的订单
实际结果:客户实体未包含该订单
环境信息
- Hibernate 6.1.7.Final
- Spring Boot 3.0.4
实体与仓库代码
Customer 实体
@Entity public class Customer { @Id String id; @OneToMany(mappedBy = "customer") List<Order> orders; }
Order 实体
@Entity @Table(name = "orders") public class Order { @Id String id; @ManyToOne @JoinColumn(name = "customer_id", nullable = false) Customer customer; }
Spring Data 仓库
CustomerRepository
@Repository public interface CustomerRepository extends JpaRepository<Customer, String> { }
OrderRepository
@Repository public interface OrderRepository extends JpaRepository<Order, String> { }
复现代码与结果
执行以下代码后:
Customer customer = new Customer(); customer.id = "customer-0"; customer = customerRepository.save(customer); Order order = new Order(); order.id = "order-0"; order.customer = customer; orderRepository.save(order); System.out.println(customerRepository.findById("customer-0"));
预期输出:
Optional[Customer{id='customer-0', orders=[Order{id='order-0', customer=customer-0}]}]
实际输出:
Optional[Customer{id='customer-0', orders=null}]
已知解决方案/规避方法
- 将
save替换为saveAndFlush,并使用EntityManager刷新Customer对象:可得到预期输出 - 将订单关联到客户,同时保存订单和客户
- 在新事务中重新读取客户
但现有代码库中数据库访问分散,实现上述方案均较为复杂。
提问
是否存在方法可以让JPA在通过OrderRepository更新关联的Order集合时,自动更新Customer实体?
内容的提问来源于stack exchange,提问作者Florian McKee
相关产品推荐
相关产品推荐

