org.mise en veille prolongée.LazyInitializationException: échec paresseusement initialiser une collection de rôle (Hibernate + Ressort)
J'ai un spring mvc+Hibernate application web avec les fichiers suivants:
applicationContext.xml
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/db"/>
<property name="username" value="kjhkjkj"/>
<property name="password" value="dsfa@efe45"/>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="hibernateSessionFactory"/>
</bean>
<bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="txManager"/>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<property name="target">
<bean class="dao.DocumentViewDao">
<property name="sessionFactory" ref="hibernateSessionFactory"/>
</bean>
</property>
<property name="proxyTargetClass" value="true"/>
</bean>
<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>orm/Document.hbm.xml</value>
<value>orm/UploadedDocument.hbm.xml</value>
<!-- More resource files go here -->
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.generate_statistics = true
hibernate.cache.use_query_cache = true
hibernate.cache.use_second_level_cache = true
hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider
hibernate.query.substitutions = true 't', false 'f'
</value>
</property>
</bean>
<bean id="documentViewDao" class="dao.DocumentViewDao">
<property name="sessionFactory" ref="hibernateSessionFactory"/>
</bean>
dao.DocumentViewDao
@Transactional
public class DocumentViewDao extends HibernateDaoSupport
{
public List all ( )
throws HibernateException
{
Session session = this.getSessionFactory ( ).getCurrentSession ( );
return session.createQuery ( new StringBuilder ( 35 )
.append ( "SELECT d.id AS id, d.identifier AS identifier, d.title AS title, u.version AS version, u.effectFrom AS effectFrom " )
.append ( "FROM Document AS d " )
.append ( "LEFT OUTER JOIN d.uploadedDocumentsById AS u " )
.append ( "WITH u.isCurrent = true" )
.toString ( ) )
.setCacheable ( true )
.setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP )
.list ( );
}
public Document getDocument ( int documentId )
throws HibernateException
{
Session session = this.getSessionFactory ( ).getCurrentSession ( );
Document document = null;
Query q = session.createQuery ( "FROM IsoDocument AS d " +
"LEFT OUTER JOIN FETCH d.uploadedDocumentsById " +
"WHERE d.id = :documentId"
);
q.setParameter ( "documentId", documentId );
q.setCacheable ( true );
document = ( Document ) q.uniqueResult ( );
return document;
}
}
contrôleur.DocumentController
public class DocumentController implements Controller
{
public ModelAndView handleRequest ( HttpServletRequest request, HttpServletResponse response )
throws Exception
{
ModelAndView modelAndView = new ModelAndView ( "document" );
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext ( );
DocumentViewDao documentViewDao = ( DocumentViewDao ) context.getBean ( "transactionProxy" );
Document document = DocumentViewDao.getDocument ( Integer.parseInt ( request.getParameter ( "id" ) ) );
modelAndView.addObject ( "document", document );
return modelAndView;
}
}
L'ORM classes et de la cartographie devrait être OK, je ne vais pas les écrire (perte de lignes :))
Donc, le problème est que je vous
org.mise en veille prolongée.LazyInitializationException: échec paresseusement initialiser une collection de rôle: orm.Document.uploadedDocumentsById, pas de session ou la session a été fermée
lorsque la page est généré par le contrôleur.DocumentController est actualisé. Évidemment, il y a un problème avec la mise en cache et les transactions qui je ne peux pas résoudre. En outre, en utilisant tous les() à partir de dao.DocumentViewDao ne débite pas lancer une telle exception (mais il n'y a pas de FETCH dans la requête). Donc, avez-vous des idées? J'ai aussi le plaisir de tous les commentaires et/ou suggestions sur ce code dans orger à l'améliorer (je suis nouveau sur Spring et Hibernate).
Vous devez vous connecter pour publier un commentaire.
Lorsqu'une requête de retour de l'instance d'entité(s) est mis en cache et vous avez un accès au cache, le cache retourne uniquement l'IDENTIFIANT(s) de la /des entité(s), puis la session est utilisé pour charger les entité(s). Cela signifie que la jointure fecth n'est pas appliqué plus quand vous avez un accès au cache. Cela signifie également que toutes les instances d'entité retournée par la requête doit également être dans le cache de second niveau, sinon le rendement pourrait en fait être pire que sans le cache de requêtes.
Vous devez donc utiliser
Hibernate.initialize(document.getUploadedDocumentsById()
dans le DAO pour s'assurer qu'il est initialisé.