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 :

JPA Managé Spring - Problème persistence manytomany


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut JPA Managé Spring - Problème persistence manytomany
    Voilà j'ai un problème de persistence entre deux relations manytomany, l'insertion se passe bien pendant un certain temps mais voilà ce que j'obtiens comme erreur :

    Exception in thread "main" org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [org.esco.sarapis.db.entity.groupe.Classe] with identifier [34]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.esco.sarapis.db.entity.groupe.Classe#34]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:95)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:335)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:62)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:212)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:146)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy38.merge(Unknown Source)
    at org.esco.sarapis.db.domain.af.person.impl.EleveManagerAFImpl.processNewEleve(EleveManagerAFImpl.java:173)
    at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy49.processNewEleve(Unknown Source)
    at org.esco.sarapis.db.domain.af.PersonManagerAFImpl.processNewPerson(Unknown Source)
    at org.esco.sarapis.db.domain.SarapisManagerImpl.processPersonAF(SarapisManagerImpl.java:198)
    at org.esco.sarapis.db.domain.SarapisManagerImpl.process(SarapisManagerImpl.java:167)
    at org.esco.sarapis.gestionnaireAlim.domain.AlimentationManagerImpl.notifyNewParsingObject(Unknown Source)
    at org.esco.sarapis.parser.handlers.ParserHandler.endElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLNSDTDValidator.endNamespaceScope(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.esco.sarapis.parser.Parser.parse(Unknown Source)
    at org.esco.sarapis.gestionnaireAlim.domain.AlimentationManagerImpl.start(Unknown Source)
    at org.esco.sarapis.gestionnaireAlim.domain.AlimentationManagerImpl.main(Unknown Source)
    Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.esco.sarapis.db.entity.groupe.Classe#34]
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:261)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669)
    at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:194)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:123)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:235)
    at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:357)
    at $Proxy30.merge(Unknown Source)
    at org.esco.sarapis.db.dao.GenericDaoImpl.merge(GenericDaoImpl.java:142)
    at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138)
    ... 33 more

    Pour précision il s'agit d'insertions de masses... Voici les deux classes :

    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
    public abstract class APersonne{
    ....
     
    /** Relation bidirectionnelle. */
    	@ManyToMany(cascade = {CascadeType.PERSIST , CascadeType.MERGE }, fetch = FetchType.EAGER)
    	@JoinTable(name = "apersonnes_agroupes",
    			joinColumns =
    				@JoinColumn(name = "APERSONNE_ID", referencedColumnName = "ID"),
    			inverseJoinColumns =
    				@JoinColumn(name = "AGROUPEOFAPERS_ID", referencedColumnName = "ID"))
    	private Set<AGroupeOfAPersonne> groupes = new HashSet<AGroupeOfAPersonne>(); 
     
     
    	public void addGroupe(final AGroupeOfAPersonne groupe) {
    	    this.groupes.add(groupe);
    	}
     
    ....
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class AGroupeOfAPersonne{
    ...
     
    /** Relation bidirectionnelle.
             * Liste des personnes membre du groupe. */
    	@ManyToMany(fetch = FetchType.LAZY, mappedBy = "groupes")
    	private Set<APersonne> membres = new HashSet<APersonne>();
    ...
    Pour préciser j'ai une classe Eleve qui hérite de APersonne et une classe Classe qui hérite de AGroupeOfPersonne, et voici le code de l'insertion qui est défini dans mon service :

    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
     
    Eleve eleve = new Eleve();
    ..... //quelques opérations d'init sur eleve
     
    Classe clas = classeDao.findByCnEtab(cl[i], 
    etabTemp.getCleJointure().getCle(), 
    etabTemp.getCleJointure().getSource());
    // Si la classe n'existe pas on la créé
    if (clas == null) {
    	 LOGGER.info("new classe");
    	clas = new Classe();
    	clas.setCn(cl[1]);
    	clas.setProprietaire(etab);
    }
    LOGGER.info("ajout de l'élève");
    elv.addGroupe(clas);	
    LOGGER.info("eleve ajouté");
    eleve = eleveDao.merge(eleve);

    Si vous avez besoin de d'autres précisions n'hésitez pas, je suis ouvert à toute suggestion, ça fait un petit moment que je bloque sur ça et je ne comprend pas vraiment le problème.

    Après je ne comprend pas je n'ai pas de processus concurrent...

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    J'aurai une question, comment vérifier que la gestion des transaction par spring fonctionne, en gros qu'il ouvre et qu'il ferme correctement la transaction après chaque appel à une méthode de mes services ?

    sinon voici ma configuration 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
    <!-- Configuration du manager d'entity -->
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    		p:dataSource-ref="dataSource"
    		p:persistenceUnitManager-ref="persistenceUnitManager">
    		<!-- On spécifie ici l'adaptateur Spring pour limplémentation JPA utilisée -->
    		<property name="jpaVendorAdapter">
    			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
    				p:databasePlatform="${db.dialect}"
    				p:database="${db.database}"
    				p:showSql="true" 
    				p:generate-ddl="true" />
    		</property>
    		<!-- On spécifie ici le tisseur utilisée pour la modification du ByteCode, cf documentation de Spring pour plus de précisions -->
    		<property name="loadTimeWeaver">
    			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    		</property>
    		<!-- On spécifie ici le dialecte utilisé en fonction de limplémentation JPA utilisée -->
    		<property name="jpaDialect">
    			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    		</property>
    	</bean>
     
    	<!-- le gestionnaire de transactions -->	
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    		p:entityManagerFactory-ref="entityManagerFactory">
    		<property name="jpaDialect">
    			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    		</property>
    	</bean>
     
    	<tx:annotation-driven />
     
    	<!--Activation de la prise en compte des annotations de type @Required,@Autowired,@PostConstruct,
    	@PreDestroy,@Resource,@PersistenceContext,@PersistenceUnit -->
    	<context:annotation-config />

    dans mon dao generic j'ai l'entity manager
    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    par contre je n'étends pas mes dao et je ne défini pas de transactionManager dans mes services.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Bon je pense avoir trouvé, en fait j'ai modifié ceci :

    @PersistenceContext(type = PersistenceContextType.TRANSACTION)


    donc au lieu du EXTENDED c'est TRANSACTION.



    Quelqu'un pourrait expliqué la différence et dans quel cas utiliser le EXTENDED ?

    J'ai vu quelques doc mais je ne saisi pas bien ce qui doit être fait. Car je suis dans un cas où on fait des insertions en masse donc le choix du bon type serait pas mal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Persistance @ManyToMany
    Par grab76 dans le forum JPA
    Réponses: 2
    Dernier message: 22/09/2011, 16h35
  2. Réponses: 7
    Dernier message: 07/08/2008, 11h39
  3. Réponses: 2
    Dernier message: 16/07/2008, 13h56
  4. [Data] [Spring DAO][JPA] JPA managé par Spring 2.5
    Par Ylias dans le forum Spring
    Réponses: 2
    Dernier message: 09/06/2008, 19h48
  5. Réponses: 1
    Dernier message: 23/01/2008, 10h12

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