Bonjour,

En tentant d'implémenter une couche de persistance, je me retrouve bloqué pour une raison qui m'échappe totalement.

J'utilise Eclipselink 2.3.0 et tente d'écrire sur une base MySQL (le problème se pose aussi sous Derby, donc a priori la base n'a rien à voir là-dedans), en utilisant, au moins pour les tests, la propriété drop-and-create-tables d'eclipselink.

Mais voilà, cela fonctionne une fois, puis ensuite, plante régulièrement en renvoyant un erreur de ce type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
[EL Warning]: 2011-07-02 15:11:32.669--ServerSession(31248093)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'PROJECT' already exists
Error Code: 1050
Call: CREATE TABLE PROJECT ...
J'ai pensé à un problème de cache, j'ai cherché et trouvé plusieurs choses type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
<shared-cache-mode>NONE</shared-cache-mode>
Et autres variantes que j'ai mises dans mon persistence.xml, sans succès. Les tests passent une fois de temps en temps, de façon plus ou moins erratique, ou en tout cas sans que j'aie pu déterminer une raison valable. Par exemple, il peut passer alors que je viens de rajouter la balise shared-cache-mode, pour planter au second passage, ou au contraire repasser alors que je viens de modifier légèrement le persistence.xml (un ou deux sauts de ligne par exemple). Mais à l'inverse, la répétition de ces mêmes modifications peuvent aussi mener à l'échec.

Ce problème ne s'était je crois jamais posé avant que je passe d'Eclipselink 1.1.0 à Eclipselink 2.3.0. J'ai essayé avec les autres versions d'Eclipselink 2, sans plus de succès.

Voilà mon persistence.xml :

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
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="azerty" transaction-type="RESOURCE_LOCAL">
		<shared-cache-mode>NONE</shared-cache-mode>
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
 		<class>...</class>
		<properties>
			<property name="eclipselink.target-database" value="MYSQL" />
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://azerty.net:3306/azerty_test" />
			<property name="javax.persistence.jdbc.user" value="azerty_test" />
			<property name="javax.persistence.jdbc.password" value="password" />
			<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
			<property name="eclipselink.ddl-generation.output-mode" value="both" />
			<property name="eclipselink.logging.level" value="FINE" />
		</properties>
	</persistence-unit>
</persistence>
Je suis prêt à tester toutes les solutions proposées, parce que je commence à sécher un peu...

Merci de vos propositions.