Spring @Transactional注释时,JPA / Hibernate不为FetchType.EAGER生成连接sql

时间:2012-04-12 02:08:59

标签: spring hibernate jpa transactional

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

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打开,assertNotNull将失败。但是如果@Transactional评论会成功。

我调试了更多信息。只是为了找出Hibernate上的@Transactional何时不会为

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

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

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

1 个答案:

答案 0 :(得分:0)

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

至于EclipseLink上的集合是空的。这是因为您只设置了关系的一面。 JPA要求您设置双向关系的两端,以使它们与数据库中的内容保持一致。当@Transactional被注释掉时,您将获得持久存在时具有空项集合的相同randomOrder实例。

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