IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Erreur lors du remove


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    chef
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : chef

    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut Erreur lors du remove
    Bonjour,

    Lors de l'exécution d'une suite de tests automatiques, chacun de mes tests commence par une suppression de tous les objets (méthode deleteAll qui supprime d'abord toutes les instances d'entités, classe par classe, puis se termine par la suppression d'un arbre de folders: le remove se propage en cascade (CascadeType.REMOVE) de la racine vers les fils).
    Le premier deleteAll fonctionne bien.
    Au 2eme deleteAll, j'ai systématiquement l'erreur suivante sur la suppression du folder racine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`opdm/folder`, CONSTRAINT `FK7DC2088E52075A1A` FOREIGN KEY (`parent_id`) REFERENCES `folder` (`id`))
    Si j'exécute le deleteAll seul (le même code, exécuté depuis un autre test unitaire, donc depuis une nouvelle JVM), juste après avoir eu l'erreur, celà fonctionne.
    J'imagine que l'erreur est liée au fonctionnement de l'EntityManager (configuré via Spring), mais je coince.

    Quelqu'un a-t-il une piste ?

    Voici mon entité Folder (Persistable est une classe générique contenant les champs id et version):
    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
    @Entity
    public class Folder extends Persistable {
     
    	private static final long serialVersionUID = -3351025698625005441L;
     
    	private String name;
    	private Collection<Folder> children;
    	private Folder parent;
     
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	@OneToMany(cascade=CascadeType.REMOVE, fetch=FetchType.LAZY, mappedBy="parent")
    	public Collection<Folder> getChildren() {
    		return children;
    	}
     
    	public void setChildren(Collection<Folder> children) {
    		this.children = children;
    	}
     
    	@ManyToOne(fetch=FetchType.LAZY)
    	public Folder getParent() {
    		return parent;
    	}
     
    	public void setParent(Folder parent) {
    		this.parent = parent;
    	}
     
    	public Folder()
    	{
    	}
    et mon fichier de configuration de Spring:
    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
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    		<property name="dataSource" ref="dataSource" />
    		<property name="jpaVendorAdapter">
    			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    				<!-- 
    				-->
    					<property name="showSql" value="true" />
    				<property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect" />
    				<property name="generateDdl" value="true" />
    			</bean>
    		</property>
    		<property name="loadTimeWeaver">
    			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    		</property>
    	</bean>
     
    	<!-- la source de donnéees DBCP -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    		<property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
    		<property name="url" value="jdbc:mysql://localhost/monprojet" />
    		<property name="username" value="guest" />
    		<property name="password" value="guest" />
    	</bean>
     
    	<!-- le gestionnaire de transactions -->
    	<tx:annotation-driven transaction-manager="txManager" />
    	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<!-- traduction des exceptions -->
    	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
     
    	<!-- persistence -->
    	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    chef
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : chef

    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut
    Bon, j'ai trouvé la cause de l'erreur:
    lors de l'instanciation de mes Folder, je n'affectais qu'un côté de la relation parent/children. Je n'affectais que le parent, sans ajouter le nouveau folder dans la liste des children du père:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public Folder(Folder parent, String name)
    	{
    		this.name = name;
    		this.parent = parent;
     
    		// correction
    		if (parent != null)
    		{
    			parent.getChildren().add(this);
    		}
    	}
    Comme le lien (1-N) se traduit uniquement par l'ajout d'une colonne parent_id, je pensais naïvement que la liste children n'avait de sens qu'en mémoire mais n'affectait pas l'API de persistence.

    Si quelqu'un a une explication, je suis preneur.

    Merci d'avance

Discussions similaires

  1. Erreur lors de l'execution d'un script jsp
    Par tuxor dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 06/08/2004, 13h35
  2. Erreur lors de la connexion
    Par mathll65 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 23/03/2004, 18h46
  3. Erreur lors d'une requete INNER JOIN
    Par k-lendos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2004, 16h09
  4. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 18h16
  5. [VB6] Erreur lors de l'ouverture d'un document Word
    Par Marco le Pouillot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2003, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo