【问题标题】:JPA/Hiberante don't generate join sql for FetchType.EAGER while Spring @Transactional annotated当 Spring @Transactional 注释时,JPA/Hibernate 不会为 FetchType.EAGER 生成连接 sql
【发布时间】:2025-12-23 13:00:06
【问题描述】:

我有一个非常棘手的问题。

当 Spring @Transactional 注释时,JPA/Hiberante 不会为 FetchType.EAGER 生成连接 sql。但是,如果我删除 @Transactional 。一切都很好。

代码如下:

public class Item {
    @ManyToOne
    private Order order;
}   

public class Order {
    @OneToMany(mappedBy = "item", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Item> items;
}   




@Test
@Transactional
public void testFetch() throws Exception {
     Item randomItem = new Item();
     Order randomOrder = new Order();

    //OrderService and itemService is implemented by Spring Roo standard. 
    orderService.saveOrder(randomOrder);
    randomItem.setOrder(randomOrder);
    itemService.saveItem(randomItem);


    Order OrderResult = orderService.findOrder(randomOrder.getId());
    final List<Item> itemSearchResult = OrderResult.getItems();

    Assert.assertNotNull(itemSearchResult);

}

如果@Transactional 开启,assertNotNull 将失败。但是如果@Transactional 评论会成功。

我调试更多信息。只是想知道 Hibernate 上的 @Transactional 何时不会为

生成连接 sql
orderService.findOrder(randomOrder.getId());

此外,我尝试切换到 elcpseLink 作为 JPA 提供程序。事情变得更糟,当@Transactional 评论时,orderService.findOrder(randomOrder.getId()) 将返回一个空列表(非空,大小为0)。

有什么建议吗?非常感谢!

【问题讨论】:

    标签: spring hibernate jpa transactional


    【解决方案1】:

    我无法评论 Hibernate 中的连接,除非您应该在查询中指定 fetch join 以可移植到其他 JPA 提供程序。特别是 EclipseLink 不会加入没有 JPA 设置或本机查询提示或 @JoinFetch 注释的急切关系。

    至于 EclipseLink 上的集合为空。这是因为您只设置了关系的一侧。 JPA 要求您设置双向关系的双方,以便它们与数据库中的内容保持一致。当 @Transactional 被注释掉时,您将返回相同的 randomOrder 实例,该实例在持久化时具有空项目集合。

    尝试调用 randomOrder.addItems(randomItem);和 randomItem.setOrder(randomOrder);在 orderService.saveOrder(randomOrder) 之前;称呼。

    【讨论】:

    • 1 代码在 Hibernate 和 eclipseLink 中得到相同的结果。我知道如果我建立双向关系,它会起作用。
    最近更新 更多