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

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

Любой совет? Огромное спасибо!


person user1327938    schedule 12.04.2012    source источник


Ответы (1)


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

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

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

person Chris    schedule 12.04.2012
comment
1 Код дает одинаковый результат в Hibernate и eclipseLink. Я знаю, что если я построю двусторонние отношения, это сработает. - person user1327938; 11.05.2012