-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: Problèmes avec des collections lazy / on demand fetching
PostPosted: Fri Feb 08, 2013 9:09 am 
Beginner
Beginner

Joined: Tue Feb 05, 2013 10:04 am
Posts: 20
Bonjour,
je suis très nouveau dans le monde d'Hibernate et j'ai des problèmes avec la stratégie de lazy fetching, j'ai lu beacoup dans des autres forums mais je ne

trouve pas une solution, mon application nécessite un module indépendant de quelque web container comme weblogic, jboss ...etc , ce pour ça que je utilise

des transactions jdbc et un context de session thread. Mon fichier de configuration de Hibernate (hibernate.cfg.xml) est:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/content</property>
<property name="hibernate.connection.username">gnxDBGenerator</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
</session-factory>
</hibernate-configuration>


Le problème consiste en que quand je fais un query à la database, je obtiens un detached object, c'est à dire, dans mon DAO je fais:

tx = sessionFactory.getCurrentSession().beginTransaction();
query = sessionFactory.getCurrentSession().createQuery("from " + "table");
query.setMaxResults(maxResults);
query.setFirstResult(firstRow);
List<Data> ret = (List<Data>)query.list();
tx.commit();

Quand tx.commit() se exécute, la session se ferme et quand j'intente de faire un get d'un collection j'obtiens un erreur de lazy collection initialization.
Quelles solutions existent pour résoudre ce problème? C'est possible de le résoudre avec Hibernate listeners ou interceptors?
Je veux atteindre "on demand fetching".
Où est-ce que je peut trouver un exemple complet d'un Hibernate 4 event listener?

Merci beacoup.


Last edited by amartin on Mon Feb 11, 2013 3:21 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Fri Feb 08, 2013 11:04 am 
Newbie

Joined: Tue May 31, 2011 6:41 am
Posts: 8
salut
Tu peux nous montrer tes classes de mapping et ton bout de code pour recupere l'objet


Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Mon Feb 11, 2013 3:44 am 
Beginner
Beginner

Joined: Tue Feb 05, 2013 10:04 am
Posts: 20
Merci pour votre réponse.

Mon code est:

DAO:

Code:
public class ArtistDAOBase implements DaoElement
{
   
   private Transaction tx;
   
   private final SessionFactory sessionFactory = getSessionFactory();
       
        public SessionFactory getSessionFactory()
   {
      logInfo.info("[Class Artist] | getSessionFactory() : Getting new session factory");
      try
      {
        Configuration configuration = new Configuration();
        configuration.configure().setProperty("hibernate.show_sql", "false");
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        logDebug.debug("[Class Artist] | getSessionFactory() : New session factory created successfully");
        return (configuration.buildSessionFactory(serviceRegistry));
      }
      catch (Exception e)
      {
         logError.error("[Class Artist] | getSessionFactory() : Could not locate SessionFactory in JNDI", e);
         throw new IllegalStateException("Could not locate SessionFactory in JNDI");
      }
   }

        protected void startOperation()
   {
      tx = sessionFactory.getCurrentSession().beginTransaction();
      logDebug.debug("[Class Artist] | startOperation() : New transaction started from current session.");
   }
   
   /**
       * Ends a transaction
       */
   public void endOperation()
   {
       tx.commit();
       logDebug.debug("[Class Artist] | endOperation() : Transaction commited, session ended.");
   }
       
         public List<Artist> findAll(int maxResults, int firstRow)
   {
      logInfo.info("[Class Artist] | findAll(int maxResults, int firstRow) : Getting all Artist instances");
      try
      {
         startOperation();
         Query query = sessionFactory.getCurrentSession().createQuery("from " + "Artist");
         query.setMaxResults(maxResults);
                        query.setFirstResult(firstRow);
         List<Artist> ret = (List<Artist>)query.list();
             endOperation();
         logDebug.debug("[Class Artist] | findAll(int maxResults, int firstRow) :  Get all Artist instances success");
         return ret;
      }   
      catch (RuntimeException re)
      {
         logError.error("[Class Artist] | findAll(int maxResults, int firstRow) : Get all Artist instances exception failure", re);
         throw re;
      }
   }
}

Bean Artist:

Code:
import java.util.HashSet;
import java.util.Set;


import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonElement;

public class Artist  implements java.io.Serializable, DboBean
{


  private Long id;
  private String name;
  private Set<Item> items = new HashSet<Item>(0);

   public Artist() {
   }
   
    public Long getId() {
        return this.id;
    }
   
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }
   
    public void setName(String name) {
        this.name = name;
    }
    public Set<Item> getItems() {
        return this.items;
    }
   
    public void setItems(Set<Item> items) {
        this.items = items;
    }
}


Un artist peut être asocié avec plusieurs items, c'est pour ça que le bean a un attribute items de type set.

Bean Item:

Code:
public class Item  implements java.io.Serializable, DboBean
{

  private Long id;
  private Artist artist;
  private int kind;
  private String name;
 
    public Item() {
    }
 
     public Long getId() {
        return this.id;
    }
   
    public void setId(Long id) {
        this.id = id;
    }

    public Artist getArtist() {
        return this.artist;
    }
   
    public void setArtist(Artist artist) {
        this.artist = artist;
    }
   
     public int getKind() {
        return this.kind;
    }
   
    public void setKind(int kind) {
        this.kind = kind;
    }
   
    public String getName() {
        return this.name;
    }
   
    public void setName(String name) {
        this.name = name;
    }
}


Le problème consiste en que quand j`intente obtenir les items d`un artist la session s`a fermé parce que dans mon DAO je fais un endoperation() et ça signifie un tx.commit et, après la session ne existe plus et je obtiens un lazy initialization error. J'ai généré tout ce code avec Hibernate Tools et je ne suis pas sûr s`il est correct. Peut-je laisser la session ouverte pour assurer que après je pourrais obtenir les collections? Ou c`est nécessaire de faire toujours un opensession ou getcurrentsession et après un tx.commit()? Où et quand dois-je fermer la session?


Merci beaucoup.

Merci pour votre aide.


Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Mon Feb 11, 2013 5:25 am 
Newbie

Joined: Tue May 31, 2011 6:41 am
Posts: 8
d'abord une chose
essaie d'enlever le commit parcequ'un Commit tu le fais quand tu le fais c'est pour enregistrer les modificatiuons ou de nouveaux enregistrements.


Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Mon Feb 11, 2013 6:01 am 
Beginner
Beginner

Joined: Tue Feb 05, 2013 10:04 am
Posts: 20
Merci pour votre réponse.

Dois-je faire les commits d' une forme atomique, c'est à dire:

tx=session.begintransaction()
faire quelque chose
tx.commit()

Ou peux-je laisser la transaction ouverte, faire un groupe d`opérations et finallement faire un commit?


Merci.


Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Mon Feb 11, 2013 8:09 am 
Newbie

Joined: Tue May 31, 2011 6:41 am
Posts: 8
les commit il faut voir
si tu n'a fait que des select tu n'as fait aucune modif sur la base donc pas besoin de commiter

si par exemple tu as mis le auto-commit a false
tu peux faire un commit apres avoir fait "un ou tes " operation(s) d'insert ou d'uptade
si tu as mis auto-commit a true pas besoin de commiter puisque les insert et update se commitent automatiquement.

j'espere avoir ete un peu clair


Top
 Profile  
 
 Post subject: Re: Problèmes avec des collections lazy / on demand fetching
PostPosted: Wed Jun 19, 2013 4:05 am 
Newbie

Joined: Wed Jun 19, 2013 3:41 am
Posts: 2
There are two people similar to the mountains to find exquisite stone, A back a full basket, the basket B is the only one he considered the most beautiful stones. A laugh B: "Why do you pick only one ah?" B said: "Although many beautiful stone, but I choose only one of the most beautiful enough." A laugh without words, down the road, A feel burdened more important, from a last resort constantly to pick a basket of stones thrown the worst, to down when he left a stone basket results!

There are many things in life, memorable, sometimes you should learn to give up.
Gentleman revenge years later my blog address
http://www.mmotank.com/


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.