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 がオンの場合、assertNotNull は失敗します。ただし、@Transactional がコメントした場合は成功します。

より多くの情報をデバッグします。Hibernate の @Transactional が join sql を生成しない場合を調べるためだけに

orderService.findOrder(randomOrder.getId());

また、JPAプロバイダーとしてelicpseLinkに切り替えようとしています。@Transactional がコメントすると、さらに悪いことに、 orderService.findOrder(randomOrder.getId()) は空のリスト (null ではない、サイズ 0) を返します。

何かアドバイス?どうもありがとう!

4

1 に答える 1

0

他のJPAプロバイダーに移植できるようにクエリでフェッチ結合を指定する必要があることを除いて、Hibernateの結合についてコメントすることはできません。特にEclipseLinkは、JPA設定、ネイティブクエリヒント、または@JoinFetchアノテーションがないと熱心な関係に参加しません。

EclipseLinkで空のコレクションについて。これは、関係の片側のみを設定するためです。JPAでは、双方向の関係の両側を設定して、データベースの内容との整合性を維持する必要があります。@Transactionalがコメント化されると、永続化されたときに空のアイテムコレクションがあった同じrandomOrderインスタンスが返されます。

randomOrder.addItems(randomItem);を呼び出してみてください。およびrandomItem.setOrder(randomOrder); orderService.saveOrder(randomOrder);の前 電話。

于 2012-04-12T16:47:44.713 に答える