Bonjour à tous !

j'ai une application web avec les technos suivantes : Spring 3 - JPA 2 - Hibernate 3.5.6.
Au début j'utilisais le SGBD MySQL, mais certains problèmes de gestion des transactions m'ont poussés à essayer avec un autre SGBD (problème en question abordé dans cet autre sujet).

J'ai donc installé PostgreSQL, changé la configuration JPA, et la magie des applis multicouches a opéré.
Mais une fois que j'ai enlevé le patch qui contournait le problème de transaction pour MySQL (des @Transactional(propagation=Propagation.NEVER) sur un certain nombre de méthodes), une erreur de clé étrangère est apparue.

J'en viens donc au problème à proprement parlé (désolée pour le message un peu long, mais je me dis toujours qu'il est plus facile de résoudre un problème quand on a son contexte ) :
J'ai une entité Questionnaire et une entité Question. un Questionnaire contient plusieurs questions et une question ne se rapporte qu'à un seul questionnaire. Donc j'ai un champs idQuestionnaire dans mon entité Question qui est une clé étrangère vers le Questionnaire. Voici le mapping de ces deux entités :
Question :
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
@Entity
public class Question extends DomainObject {
	private static final long serialVersionUID = 1L;
 
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long idQuestion;
 
	private Integer numQuestion;
	private String question;
	private String typeReponse;
 
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "idQuestionnaire")
	private Questionnaire questionnaire;
//Constructeurs, getters and setters
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
@Entity
public class Questionnaire extends DomainObject {
 
	private static final long serialVersionUID = 1L;
 
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "idQuestionnaire", nullable = false)
	private Long idQuestionnaire;
 
	private String numero;
	private String titre;
	private Character sexeDestinataire;
	private Boolean publie;
 
	@OneToMany(mappedBy = "pk.questionnaire", cascade = {CascadeType.REMOVE}, fetch = FetchType.LAZY)
	private List<ListeQuestionnaire> listeQuestionnaires = new ArrayList<ListeQuestionnaire>();
 
	@OneToMany(mappedBy = "questionnaire", cascade={CascadeType.REMOVE}, fetch = FetchType.LAZY)
	private List<Question> listeQuestions = new ArrayList<Question>();
 
	@OneToMany(mappedBy = "questionnaire", cascade={CascadeType.REMOVE}, fetch = FetchType.LAZY)
	private List<Reponse> listeReponses = new ArrayList<Reponse>();
//Constructeurs, getters and setters
Mes tests du dao du Questionnaire passent sans problème, par contre les tests du dao des questions passent pas. Lors de la méthode d'initialisation des données :
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
@Before
@Transactional
public void startTransaction() throws ParseException{
	Questionnaire q1 = new Questionnaire();
	q1.setNumero("Q1");
	q1.setTitre("Nutrition");
	q1.setSexeDestinataire('b');
	questionnaire = serviceQuestionnaire.saveOne(q1);
 
	Question question1 = new Question();
	question1.setNumQuestion(1);
	question1.setQuestion("question 1");
	question1.setTypeReponse("texte");
	question1.setQuestionnaire(questionnaire);
 
	question = questionDao.saveOne(question1);
}
la ligne question = questionDao.saveOne(question1); génère l'erreur suivante :
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
WARN  - JDBCExceptionReporter      - SQL Error: 0, SQLState: 23503
ERROR - JDBCExceptionReporter      - L'élément du batch 0 insert into Question (numQuestion, question, idQuestionnaire, typeReponse, idQuestion) values ('1', 'question 1', '1', 'texte', '2') a été annulé. Appeler getNextException pour en connaître la cause.
WARN  - JDBCExceptionReporter      - SQL Error: 0, SQLState: 23503
ERROR - JDBCExceptionReporter      - ERROR: insert or update on table "question" violates foreign key constraint "fkbe5ca00676039098"
  Détail*: Key (idquestionnaire)=(1) is not present in table "questionnaire".
ERROR - tractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:262)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:178)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:791)
	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.flush(Unknown Source)
	at fr.statlife.protoE4N.data.dao.jpa.AbstractDaoJPAImpl.saveOne(AbstractDaoJPAImpl.java:45)
	at fr.statlife.protoE4N.data.dao.jpa.TestQuestionDao.startTransaction(TestQuestionDao.java:54)
	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.RunBefores.evaluate(RunBefores.java:27)
	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)
Caused by: java.sql.BatchUpdateException: L'élément du batch 0 insert into Question (numQuestion, question, idQuestionnaire, typeReponse, idQuestion) values ('1', 'question 1', '1', 'texte', '2') a été annulé. Appeler getNextException pour en connaître la cause.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2598)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2737)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 42 more
Alors j'ai bien lu l'erreur, il dit qu'il n'y a pas de questionnaire avec l'id 1, sauf que ce questionnaire a été créé et enregistré dans la base juste avant... Donc normalement, l'enregistrement devrait être dans la base.
Il est dans le contexte de persistance en tous cas car j'arrive à le récupérer et à l'afficher.
Alors pourquoi cette erreur?
J'ai trouvé sur le forum une autre discussion qui rapporte un problème similaire datant de 2006, mais cette discussion n'a jamais été résolue au final...

Merci d'avance pour toute l'aide que vous pourrez m'apporter