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

Spring Java Discussion :

[SPRING 2.5][Hibernate]Problème de session: LazyInitializationException:no session [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut [SPRING 2.5][Hibernate]Problème de session: LazyInitializationException:no session
    Bonjour,
    Pour situer mon contexte, je développe actuellement dans le cadre d'une application java SE, un programme qui permet de sauvegarder dans une base de données toutes les requêtes posées par des utilisateurs pour générer des stats. Les données sont lues depuis des fichiers XML et stockées dans une base de données Mysql.
    J'utilise JPA, les annotations Spring et Hibernate.

    Grace à mes anciens posts et vos réponses, j'ai pu utiliser les annotations Spring pour me faire injecter les beans services dans mon main afin d'invoquer les différentes méthodes sur une Personne.

    Voici mon problème :

    J'ai une relation many to many entre une personne et une requête :

    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
     
    @Entity
    @Table(name = "PERSONNE")
    public class Personne implements Serializable {
     
    	// champs
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Long			id;
     
    	@SuppressWarnings("unused")
    	@Version
    	@Column(name = "VERSION", nullable = false)
    	private int				version;
     
    	@Column(name = "ID_Personne", nullable = false, unique = true)
    	private int				id_personne;
     
    	@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
    	@JoinTable(name = "PERSON_REQUEST", joinColumns = @JoinColumn(name = "PERSON_ID"), inverseJoinColumns = @JoinColumn(name = "REQUEST_ID"))
    	private Set<Request>	requests	= new HashSet<Request>();
    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
     
    @Entity
    @Table(name = "REQUEST")
    public class Request implements Serializable {
     
    	// ID
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Long		id;
     
    	@Column(name = "DATE", nullable = false)
    	@Temporal(TemporalType.TIMESTAMP)
    	private Date		date;
     
           // relation inverse Request -> PErsonne
    	@ManyToMany(mappedBy = "requests", cascade = {   CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
    	private Set<Personne>	Personnes = new HashSet<Personne>();
    Dans mon Main, lorsque j'essaye de rajouter une requête à la liste des requêtes posées par une personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
    		// couche service
    		IService service = (IService) ctx.getBean("service");
     
    Personne person = new Personne(id_personne);
    Request requete = new Request(id_request);
    person.getRequests().add(requete);
    request.getPersonnes().add(person);
    service.savePersonne(person);
    J'ai une exception qui me dit que la session a été fermée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    15:26:04,673 ERROR LazyInitializationException:19 - failed to lazily initialize a collection of role: fr.pack.entites.Personne.requests, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: fr.pack.entites.Personne.requests, no session or session was closed
    	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
    	at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189)
    	at fr.stime.test.TrackLoader.PersistFile(TrackLoader.java:180)
    	at fr.stime.test.TrackLoader.run(TrackLoader.java:75)
    	at fr.stime.test.InitDB.callTrackLoader(InitDB.java:92)
    	at fr.stime.test.InitDB.main(InitDB.java:52)
    J'ai cherché sur les forum et dans la doc Spring mais je n'ai pas trouvé une réponse claire à ma question!

    Avez-vous une idée comment résoudre ce problème ?

    Voic mon fichier de 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
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
     
     
        <bean id="propertyConfigurer"
              class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
              <property name="location" value="jdbc.properties" />
       </bean>  
     
    	<context:annotation-config />
    	<context:component-scan base-package="fr.pack.dao" />
    	<context:component-scan base-package="fr.pack.service" />
    	<context:component-scan base-package="fr.pack.manager" />
     
     
    	<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.MySQL5InnoDBDialect" />
    				<property name="generateDdl" value="true" />
    			</bean>
    		</property>
    		<property name="jpaProperties">
                     <props>
                         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                         <prop key="hibernate.hbm2ddl.auto">update</prop><!--  validate | update | create | create-drop-->
                     </props>
            </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="${jdbc.driver}" />
    		<property name="url" value="${jdbc.url}" />
    		<property name="username" value="${jdbc.username}" />
    		<property name="password" value="${jdbc.password}" />
    	</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" />
     
    </beans>
    Merci beaucoup par avance de votre réponse.

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Il aurait fallu nous montrer ton service

    Mais je dirais que ça vient du fait que tu n'as pas déclaré ton services (ou ses méthodes) commes transactionnelles.
    Spring va ouvrir la session hibernate lorsque tu exécutes une méthode marquée par @Transactional.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut [SPRING 2.5][Hibernate]Problème de session: LazyInitializationException:no session
    Salut djo.mos,

    Merci de m'avoir encore répondu.

    Non, j'ai mis les bonnes annotations que tu m'as indiqué la dernière fois.

    Voici mon service et mon DAO

    /************** DAO ***************/
    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
     
    @Repository
    @Transactional
    public class DaoImpl implements Dao {
    	private static final Logger	LOG	= Logger.getLogger(DaoImpl.class);
     
    	@PersistenceContext
    	private EntityManager		em;
     
     
     
    	// get Personne by Id
    	public PDV getPersonne(Long Id) {
    		return em.find(Personne.class, Id);
    	}
     
    	// get Personne by Id_Personne
    	@SuppressWarnings("unchecked")
    	public PDV getPersonneById(int id_Personne) {
    		PDV result = null;
    		Session hibSession = (Session) em.getDelegate();
    		Criteria criteria = hibSession.createCriteria(Personne.class).add(Restrictions.eq("id_Personne", id_personne));
    		List<Personne> _results = criteria.list();
    		if (_results != null && _results.size() == 0) {
    			System.err.println("getPersonneById: No entity found for query");
    		}
    		else
    			result = _results.get(0);
    		return result;
    	}
     
    	// save Personne
    	public Personne savePersonne(Personne personne) {
    		em.persist(personne);
    		return personne;
    	}
     
    	// update Personne
    	public Personne updatePersonne(Personne personne) {
    		return em.merge(personne);
    	}
     
    	// delete Personne
    	public void deletePersonne(Long Id) {
    		Personne pdv = em.find(Personne.class, Id);
    		if (pdv == null) {
    			throw new DaoException(-1);
    		}
    		em.remove(pdv);
    	}
     
    	// get all Personne
    	@SuppressWarnings("unchecked")
    	public List<Personne> getAllPersonne() {
    		return em.createNamedQuery("get All Personne").getResultList();
    	}
     
    	// get all Request of Personne
    	@SuppressWarnings("unchecked")
    	public List<Request> getAllRequestsOfPersonne(Long pdvId) {
    		return em.createNamedQuery("get all Request of PDV").setParameter("Id_personne", pdvId).getResultList();
    	}
    /****************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
    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
     
    @Service("service")
    public class ServiceImpl implements IService {
     
    	// couche [dao]
    	private Dao	dao;
     
    	public Dao getDao() {
    		return dao;
    	}
     
    	@Autowired
    	public void setDao(Dao dao) {
    		this.dao = dao;
    	}
     
     
     
    	// get Personne by Id
    	public Personne getPersonne (Long id) {
    		return dao.getPersonne (id);
    	}
     
    	// get Personne by IdPDV
    	public Personne getPersonne ById(int pdv) {
    		return dao.getPersonne ById(pdv);
    	}
     
    	// save Personne 
    	public Personne savePersonne (Personne pdv) {
    		return dao.savePersonne (pdv);
    	}
     
    	// update Personne 
    	public Personne updatePersonne (Personne pdv) {
    		return dao.updatePersonne (pdv);
    	}
     
    	// delete Personne 
    	public void deletePersonne (Long id) {
    		dao.deletePersonne (id);
    	}
     
    	// get all Personne 
    	@SuppressWarnings("unchecked")
    	public List<Personne > getAllPersonne () {
    		return dao.getAllPersonne ();
    	}
     
     
    	// get all Request of Personne 
    	@SuppressWarnings("unchecked")
    	public List<Request> getAllRequestsOfPersonne (Long pdvId) {
    		return dao.getAllRequestsOfPersonne (pdvId);
    	}
    Merci pour votre aide

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Oups, c'est de ma faute
    J'ai lu ton premier post un peu trop vite.

    J'avais cru qu'il y avait pas de session, mais non, en fait, il s'agit d'autre chose, la fameuse (maudite) LazyInitializationException et là, c'est plus Hibernate que Spring.

    Essaies ceci :
    - Crées la personne
    - Enregistre là, en écrasant la variable avec ce que te retourne Hibernate
    - Idem pour request
    et essaies ensuite de faire l'association, mais c'est pas sûr que ça marcherait

    Autre chose, la gestion de transactions serait mieux placé dans le service, et non pas dans le DAO.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    1- J'ai déplacé l'annotation @Transactional sur le service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Service("service")
    @Transactional
    public class ServiceImpl implements IService {
    2- Pour le fameux problème d'hibernate, j'essaye de contourner le problème mais ce n'est pas évident par que je rencontre le même problème pour mes autres entités request <==> pages, etc. en plus dans la même fonction j'ouvre et je ferme beaucoup de fichier XML,

    J'ai vu que dans d'autres forum ils proposent de placer un filtre dans le web.xml. mais comme j'utilise une classe main je ne peux pas passer par cette solution à moins que de transformer tous mes fetch = FetchType.EAGER ce qui n'est pas possible par ce que je vais exploser ma mémoire. (très couteux en ressources).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <filter>
    		<filter-name>hibernateFilter</filter-name>
    		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    		<init-param>
    			<param-name>sessionFactoryBeanName</param-name>
    			<param-value>mySessionFactory</param-value>
    		</init-param>
    		<init-param>
    			<param-name>singleSession</param-name>
    			<param-value>false</param-value>
    		</init-param>
    	</filter>
    Il n'existe vraiment pas un autre moyen pour résoudre ce problème ?

  6. #6
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Il y aurait une solution peut être (que j'aime pas du tout) :

    Mettre ça sur ton EntityManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @PersistenceContext(type = PersistenceContextType.EXTENDED)

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

Discussions similaires

  1. [Framework] Spring/Hibernate et sessions (LazyInitializationException)
    Par stof dans le forum Spring
    Réponses: 4
    Dernier message: 18/02/2014, 15h45
  2. [MVC] Spring MVC et hibernate, could not initialize proxy - no Session
    Par dutdev dans le forum Spring Web
    Réponses: 0
    Dernier message: 25/05/2012, 16h11
  3. Spring +tapestry+hibernate : problème déploiement projet
    Par amadoulamine1 dans le forum Spring Web
    Réponses: 1
    Dernier message: 25/02/2011, 10h01
  4. Problème DWR 3 + Spring + Struts 2 + Hibernate 3
    Par maili20 dans le forum Autres
    Réponses: 2
    Dernier message: 15/05/2009, 17h28
  5. [Data] [Spring & Hibernate] Problème de session
    Par anthyme dans le forum Spring
    Réponses: 6
    Dernier message: 18/12/2007, 10h11

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