0

我有一个非常有线的问题。

JPA/Hiberante 在 Spring @Transactional 注释时不会为 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 on,assertNotNull 将失败。但是如果@Transactional 评论会成功。

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

orderService.findOrder(randomOrder.getId());

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

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

4

1 回答 1

0

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

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

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

于 2012-04-12T16:47:44.713 回答