Bonjour,
J'ai deux entités : Membre et Questionnaire qui sont en association ManyToMany avec une colonne supplémentaire. J'ai donc aussi une entité ListeQuestionnaire qui représente l'association et une classe ListeQuestionnairePk pour la clé composite.
dans mon entité Questionnaire, j'ai donc une association @OneToMany avec ListeQuestionnaire :
C'est dans ma classe métier ServiceQuestionnaire que je remplis la table ListeQuestionnaire par la méthode publierQuestionnaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 @OneToMany(mappedBy = "pk.questionnaire", cascade = {CascadeType.REMOVE}, fetch = FetchType.LAZY) private List<ListeQuestionnaire> listeQuestionnaires = new ArrayList<ListeQuestionnaire>();
quand les lignes 40-41 sont commentées, la méthode fonctionne bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49 @Transactional public Questionnaire publierQuestionnaire(Long idQuestionnaire){ System.out.println("------------ publierQuestionnaire"); Questionnaire questionnaire = questionnaireDao.getOne(idQuestionnaire); Character sexeDestinataire = questionnaire.getSexeDestinataire(); if(sexeDestinataire != null) { //On recherche tous les membres concernés par ce questionnaire List<Membre> membreConcernes = null; switch(sexeDestinataire) { case 'f' : { membreConcernes = serviceMembre.findFemmes(); break; } case 'h' : { membreConcernes = serviceMembre.findHommes(); break; } case 'b' : { membreConcernes = serviceMembre.findAll(); break; } } //On enregistre les liens entre le nouveau questionnaire et les membres concernés for (Membre membre : membreConcernes) { ListeQuestionnaire listeQ = new ListeQuestionnaire(); listeQ.setARepondu(false); listeQ.setMembre(membre); listeQ.setQuestionnaire(questionnaire); listeQ = serviceListeQuestionnaire.saveOne(listeQ); questionnaire.getListeQuestionnaires().add(listeQ); } questionnaire.setPublie(true); questionnaire = questionnaireDao.saveOne(questionnaire); } else { throw new RuntimeException("Le sexe des destinataires du questionnaire n'est pas défini !"); } return questionnaire; }
Par contre, quand ces lignes sont présentes, je me retrouve avec l'erreur suivante, lancée par questionnaire = questionnaireDao.saveOne(questionnaire);:
Il me dit qu'il trouve pas une entité ListeQuestionnaire, j'en déduis qu'il cherche à enregistrer le champs List<ListeQuestionnaire> listeQuestionnaires du questionnaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 javax.persistence.EntityNotFoundException: Unable to find fr.statlife.protoE4N.data.entites.ListeQuestionnaire with id ListeQuestionnairePk [idMembre=ben.joris, idQuestionnaire=1] at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:132) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:233) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1080) at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1028) at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:623) at org.hibernate.type.EntityType.resolve(EntityType.java:431) at org.hibernate.type.EntityType.replace(EntityType.java:291) at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:507) at org.hibernate.type.CollectionType.replace(CollectionType.java:574) at org.hibernate.type.TypeFactory.replace(TypeFactory.java:548) at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:563) at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:288) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:261) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:84) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:859) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:843) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:847) at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:682) 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:597) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) at $Proxy30.merge(Unknown Source) at fr.statlife.protoE4N.data.dao.jpa.AbstractDaoJPAImpl.saveOne(AbstractDaoJPAImpl.java:44) at fr.statlife.protoE4N.metier.ServiceQuestionnaireImpl.publierQuestionnaire(ServiceQuestionnaireImpl.java:96) 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:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy38.publierQuestionnaire(Unknown Source) at fr.statlife.protoE4N.metier.TestServiceQuestionnaire.testPublierQuestionnaireHomme(TestServiceQuestionnaire.java:79) 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:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 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)
Pourtant, je pensais que spécifier cascade = {CascadeType.REMOVE} de l'annotation @OneToMany était suffisant pour qu'il fasse abstraction de ce champs
Du coup je comprends pas trop où est mon erreur. Est ce que quelqu'un pourrait éclairer ma lanterne sur ce qu'il se passe ?
Partager