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 :
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>();
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
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;
}
quand les lignes 40-41 sont commentées, la méthode fonctionne bien.
Par contre, quand ces lignes sont présentes, je me retrouve avec l'erreur suivante, lancée par questionnaire = questionnaireDao.saveOne(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)
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.
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 ?