2011-09-21 4 views
1

J'utilise en veille prolongée GenriDAOHibernate Session

Voici mon code ::

private Class<T> persistentClass; 
public Class<T> getPersistentClass() { 
     return persistentClass; 
} 
public GenericHibernateDAO(Class<T> persistentClass){ 
     this.persistentClass=persistentClass; 
} 
public T findById(long id) { 
     SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 
     Session session=sessionFactory.getCurrentSession(); 
     Transaction transaction = null; 

     T entity=null; 
     try { 
       transaction = session.beginTransaction(); 
       entity=(T)session.get(getPersistentClass(), id); 
       //  transaction.commit(); 
     } catch (HibernateException e) { 
     //  transaction.rollback(); 
       e.printStackTrace(); 
     } finally { 
     //  transaction = null; 
     } 
     return entity; 
} 

}

Quand je commets la transaction et essayez d'accéder aux attributs de l'objet (c.-à-POJO) il donnera l'exception d'hibernation "aucune session" ou session fermée

si je ne commets pas son travail correctement. mais le problème est que la session reste ouverte.

Quels sont les moyens d'accéder à cette entité ???

+0

Veuillez mettre en forme le code lorsque vous l'affichez (je l'ai fait cette fois-ci) – kunal

Répondre

1

Hope this helps: http://community.jboss.org/wiki/GenericDataAccessObjects

public abstract class GenericHibernateDAO<T, ID extends Serializable> 
     implements GenericDAO<T, ID> { 

    private Class<T> persistentClass; 
    private Session session; 

    public GenericHibernateDAO() { 
     this.persistentClass = (Class<T>) ((ParameterizedType) getClass() 
           .getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    @SuppressWarnings("unchecked") 
    public void setSession(Session s) { 
     this.session = s; 
    } 

    protected Session getSession() { 
     if (session == null) 
      throw new IllegalStateException("Session has not been set on DAO before usage"); 
     return session; 
    } 

    public Class<T> getPersistentClass() { 
     return persistentClass; 
    } 

    @SuppressWarnings("unchecked") 
    public T findById(ID id, boolean lock) { 
     T entity; 
     if (lock) 
      entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE); 
     else 
      entity = (T) getSession().load(getPersistentClass(), id); 

     return entity; 
    } 

    @SuppressWarnings("unchecked") 
    public List<T> findAll() { 
     return findByCriteria(); 
    } 

    @SuppressWarnings("unchecked") 
    public List<T> findByExample(T exampleInstance, String[] excludeProperty) { 
     Criteria crit = getSession().createCriteria(getPersistentClass()); 
     Example example = Example.create(exampleInstance); 
     for (String exclude : excludeProperty) { 
      example.excludeProperty(exclude); 
     } 
     crit.add(example); 
     return crit.list(); 
    } 

    @SuppressWarnings("unchecked") 
    public T makePersistent(T entity) { 
     getSession().saveOrUpdate(entity); 
     return entity; 
    } 

    public void makeTransient(T entity) { 
     getSession().delete(entity); 
    } 

    public void flush() { 
     getSession().flush(); 
    } 

    public void clear() { 
     getSession().clear(); 
    } 

    /** 
    * Use this inside subclasses as a convenience method. 
    */ 
    @SuppressWarnings("unchecked") 
    protected List<T> findByCriteria(Criterion... criterion) { 
     Criteria crit = getSession().createCriteria(getPersistentClass()); 
     for (Criterion c : criterion) { 
      crit.add(c); 
     } 
     return crit.list(); 
    } 

} 
0

Mise en veille prolongée par défaut est paresseux. Très probablement, les attributs que vous obtenez sont chargés paresseusement. Chaque fois que la session est ouverte, vous pouvez accéder aux propriétés car Hibernate récupère ces propriétés au fur et à mesure de l'initialisation/de l'accès.
par exemple:

public class Person{ 
    private Set<Child> children; 

    public Set<Child> getChildren(){ 
      return children; 
    } 
    public void setChildren(Set<Child> p0){ 
     this.children=p0; 
    } 
} 

ici lorsque vous chargez l'instance d'une personne la collection enfants n'est pas chargé avec impatience. Hibernate les récupère lorsque vous y accédez. Si la session est fermée, il jette un LazyInitializationException

Avoir un concept look de Lazy Loading et chargement Désireuse en veille prolongée aussi pour commencer essaient de jeter un regard sur la Open Session in View modèle si vous utilisez Hibernate dans une application Web.