2012-04-12 1 views
0

У меня проблема с проводной связью.JPA/Hiberante не генерируют соединение sql для FetchType.EAGER, а Spring @Transactional аннотируется

JPA/Hiberante не генерируют соединение sql для FetchType.EAGER, а Spring @Transactional аннотируется. Но если я удалю @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); 

} 

assertNotNull потерпит неудачу, если @Transactional дальше. Но будет успешным, если @Transactional прокомментировал.

Я отлаживаю дополнительную информацию. Просто, чтобы узнать, когда @Transactional на Hibernate не сгенерирует присоединиться к SQL для

orderService.findOrder(randomOrder.getId()); 

Alos я пытаюсь переключиться на elicpseLink в качестве поставщика JPA. Все становится хуже, когда @Transactional прокомментировал, orderService.findOrder (randomOrder.getId()) вернет пустой список (но не null, размер 0).

Любые советы? Большое спасибо!

ответ

0

Я не могу прокомментировать соединения в спящем режиме, за исключением того, что вы должны указать, чтобы соединение fetch в вашем запросе было переносимым для других поставщиков JPA. EclipseLink, в частности, не объединяет нетерпеливые отношения без настроек JPA или собственных подсказок или аннотаций @JoinFetch.

Что касается коллекции, пустой на EclipseLink. Это связано с тем, что вы устанавливаете только одну сторону отношений. JPA требует, чтобы вы установили обе стороны двунаправленных отношений, чтобы они соответствовали тому, что находится в базе данных. Когда @Transactional закомментирован, вы возвращаете тот же экземпляр randomOrder, у которого была пустая коллекция элементов при сохранении.

Попробуйте вызвать randomOrder.addItems (randomItem); и randomItem.setOrder (randomOrder); перед orderService.saveOrder (randomOrder); вызов.

+0

1 Код получает тот же результат в Hibernate и eclipseLink. Я знаю, буду ли я строить двусторонние отношения, это сработает. – user1327938

Смежные вопросы