2012-04-12 12 views
0

非常に配線された問題があります。JPA/HiberanteはFetchType.EAGER用のjoin sqlを生成しませんが、Spring @ Transactionalは注釈付きです

JPA/HiberanteはFetchType.EAGERの結合sqlを生成しませんが、Spring @ Transactionactionは注釈を付けます。しかし、私が@トランザクションを削除すれば。すべて順調。

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); 

} 

assertNotNullが上@Transactional場合に失敗します。ここでは

はコードです。しかし、もし@Transactionalがコメントしたら成功するだろう。

詳細をデバッグします。休止状態に@Transactional私はJPAプロバイダとしてelicpseLinkに切り替えよう

orderService.findOrder(randomOrder.getId()); 

ALOSのSQLに参加生成しないとき、ちょうど見つけることができます。 @Transactionalがコメントしたとき、orderService.findOrder(randomOrder.getId())は空のリスト(nullでない、サイズ0)を返します。

アドバイスはありますか?どうもありがとう!

答えて

0

他のJPAプロバイダに移植可能にするために、クエリでfetch joinを指定する以外は、Hibernateの結合にはコメントできません。特にEclipseLinkは、JPA設定やネイティブ・クエリー・ヒントや@JoinFetchアノテーションなしで熱心な関係に加わることはありません。

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

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

+0

1コードはHibernateとeclipseLinkで同じ結果を得ます。私は双方向の関係を構築すればうまくいくことを知っています。 – user1327938

関連する問題