org.hibernate.LazyInitializationException no session or session was closed lors de l'execution d'un test Junit
Bonjour tout le monde,
Je développe une application avec Spring et Hibernate mais je ne connais pas très bien aucun des technologies. J'ai un problème que je n'arrive pas à résoudre malgré les dizaines d'entrées sur le net.
J'obtiens une org.hibernate.LazyInitializationException depuis un test Junit lors de l'accès à un attribut de mon entité, cet attribut est chargé en mode lazy.
Voici les éléments que je peux vous fournir afin que vous pussiez m'aider:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| @Entity
@Table(name = "rejeu_commande")
public class Order implements Serializable {
...
@OneToMany(mappedBy = "order", targetEntity = com.francetelecom.facade.hibernate.model.EtaskOrder.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
private List<EtaskOrder> etaskOrders;
....
} |
Et voici la classe Junit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package com.francetelecom.facade.services.findAndGetCustomerOrder.manager;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/applicationContext-test.xml" })
public class FindAndGetOrderManagerTestCase extends AbstractJUnit4SpringContextTests{
@Autowired
private FindAndGetOrderManager testedClass;
@Autowired
private ReplayOrderRepository replayOrderRepository;
@Test
public void testCreateOrder() throws RepositoryException, OrderException, TranscoException {
long idOrderFacades=10000107000000004L;
String erreurInjection = "98";
Order order= replayOrderRepository.getOrderById(idOrderFacades);
CreateCustomerOrder customerOrder =replayOrderRepository.getCreateCustomerOrderFromDB(order);
FacadeOrder facadeOrder = new FacadeOrder();
order.getEtaskOrders();
FindAndGetOrder findAndGetorder = testedClass.createOrder(customerOrder, order, false);
assertEquals(idOrderFacades, findAndGetorder.getIdFacades());
assertEquals(facadeOrder.getOffreCompose(), findAndGetorder.getContract());
//assertEquals(facadeOrder.getInternalId(),findAndGetorder.getParsifalOrderId())
assertEquals(facadeOrder.getParsifalOrderId(),findAndGetorder.getParsifalOrderId());
assertEquals(facadeOrder.getCreationDate(), findAndGetorder.getCreationDate());
//String statusCode = String.valueOf(findAndGetRepository.getFindAndGetOrderManager().computeLocalStatusCode(order.getWorkflowStatus()).getCode());
//assertEquals(statusCode,findAndGetorder.getStatusCode());
assertEquals(facadeOrder.getSource(),findAndGetorder.getReferential());
assertFalse(findAndGetorder.isDetails());
assertEquals(erreurInjection, findAndGetorder.getLocalRejectionCause());
} |
Lors de l’accès a etaskorders j'obtiens l'exception LazyInitializationException dont la trace complète est ci-dessous:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.facade.hibernate.model.Order.etaskOrders, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:119)
at org.hibernate.collection.PersistentBag.isEmpty(PersistentBag.java:255)
at com.francetelecom.facade.order.FacadeOrder.populateWorkflowInformationWithDatabaseData(FacadeOrder.java:1523)
at com.francetelecom.facade.services.findAndGetCustomerOrder.manager.FindAndGetOrderManager.createOrder(FindAndGetOrderManager.java:59)
at com.francetelecom.facade.services.findAndGetCustomerOrder.manager.FindAndGetOrderManagerTestCase.testCreateOrder(FindAndGetOrderManagerTestCase.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) |
Comment je peux eviter ce problème?
La solution consistant à définir le fetch pour eTaskOrders comme fetch = FetchType.EAGER n'est pas possible à cause de prérequis applicatives.
Merci d'avance pour votre aide
Aurea