2017-02-14 1 views
0

Dans mon projet en cours de printemps, j'ai cette configuration Hibernate sur mon fichier rootCOntext.xml:Mise en veille prolongée ne persistent pas de données sur la base de données (voir la mise à jour 3)

<?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:context="http://www.springframework.org/schema/context" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="jdbc:postgresql:mydata"/> 
     <property name="username" value="klebermo"/> 
     <property name="password" value="123"/> 
    </bean> 

    <bean id="hibernate4AnnotatedSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan" value="org.kleber.model" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 
</beans> 

mais quand l'application a besoin pour exécuter cette requête:

@Transactional 
public List<E> select(String orderby, String groupby) { 
    return (List<E>) this.getCurrentSession().createCriteria(clazz).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
} 

qui figure sur cette classe:

public abstract class Dao<E> { 
    protected Class<E> clazz; 

    @Autowired 
    protected SessionFactory sessionFactory; 

    public Dao(Class<E> clazz) { 
     this.clazz = clazz; 
    } 

    public Session getCurrentSession() { 
     return sessionFactory.getCurrentSession(); 
    } 
    ... 
} 

Je reçois ce erreur:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) 
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:456) 
    org.kleber.model.Dao.getCurrentSession(Dao.java:22) 
    org.kleber.model.Dao.select(Dao.java:43) 
    org.kleber.model.Service.select(Service.java:35) 
    org.kleber.model.Controller.list(Controller.java:87) 
    org.kleber.model.Controller$$FastClassBySpringCGLIB$$aa38cb3a.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:652) 
    org.kleber.model.usuario.UsuarioController$$EnhancerBySpringCGLIB$$7dce8c33.list(<generated>) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:158) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 

Quelqu'un peut voir ce qui ne va pas ici?

MISE À JOUR

je change ma méthode DAO pour cela:

@Transactional 
public List<E> select(String orderby, String groupby) { 
    Session sess = sessionFactory.openSession(); 
    Transaction tx = null; 
    List<E> list = null; 
    try { 
     tx = sess.beginTransaction(); 
     list = sess.createCriteria(clazz).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
     tx.commit(); 
    } catch (Exception e) { 
     if(tx != null) 
      tx.rollback(); 
     throw e; 
    } finally { 
     sess.close(); 
    } 
    return list; 
    //return (List<E>) this.getCurrentSession().createCriteria(clazz).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
} 

et maintenant je reçois cette erreur:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.kleber.model.usuario.Usuario.listas, could not initialize proxy - no Session 
    org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582) 
    org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201) 
    org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:145) 
    org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261) 
    com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:102) 
    com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) 
    com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) 
    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) 
    com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) 
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292) 
    com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681) 
    com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057) 
    org.kleber.model.Controller.list(Controller.java:88) 
    org.kleber.model.Controller$$FastClassBySpringCGLIB$$aa38cb3a.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:652) 
    org.kleber.model.usuario.UsuarioController$$EnhancerBySpringCGLIB$$7c57ca50.list(<generated>) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:158) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 

Ce que je suppose que les points à la question de savoir comment J'implémente les relations entre ma classe et la couche Model.

qui est ma classe:

public class Usuario { 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Integer id; 

@Column 
@Input 
@Text 
private String login; 

@Column 
@Input 
@Password 
private String senha; 

@Column 
@Input 
@Text 
private String nome; 

@Column 
@Input 
@Text 
private String sobrenome; 

@Column 
@Input 
@Email 
private String email; 

@OneToOne 
private Cart cesta; 

@ManyToMany 
private List<Wishlist> listas; 

@ManyToMany 
private List<Orders> pedidos; 

@ManyToMany 
@Select 
private List<Credencial> credenciais; 

@Column 
@Input 
@Date 
private java.util.Date expirationDate; 

@Column 
@Input 
@Checkbox 
private Boolean locked; 

@Column 
@Input 
@Checkbox 
private Boolean enabled; 
} 

Quelqu'un sait comment résoudre ce problème? Sans utiliser FetchType.EAGER pour les relations ManyToMany (Si je fais cela, l'application ne démarre même pas, parce que je reçois une erreur hibernate ne peut pas aller chercher plusieurs sacs).

MISE À JOUR 2

J'essaie dans ma méthode DAO:

@Transactional 
public List<E> select(String orderby, String groupby) { 
    Session sess = sessionFactory.openSession(); 
    Transaction tx = null; 
    List<E> list = null; 
    try { 
     tx = sess.beginTransaction(); 

     Criteria criteria = this.getCurrentSession().createCriteria(clazz); 
     if(orderby != null) 
      criteria = criteria.addOrder(Order.asc(orderby)); 
     if(groupby != null) 
      //TODO 
     for(Field field : clazz.getDeclaredFields()) { 
      if(field.isAnnotationPresent(ManyToMany.class)) 
       criteria = criteria.setFetchMode(field.getName(), FetchMode.EAGER); 
     } 
     list = criteria.list(); 

     tx.commit(); 
    } catch (Exception e) { 
     if(tx != null) 
      tx.rollback(); 
     throw e; 
    } finally { 
     sess.close(); 
    } 
    return list; 
} 

et maintenant je une obtenir la première erreur mentionné dans ce post.

MISE À JOUR 3

Alors, je parviens à corriger cette erreur de changer la méthode getCurrentSession() classe Dao que:

public Session getCurrentSession() { 
    return sessionFactory.openSession(); 
} 

mais maintenant quand je soumets des données de mes formes, ils ne sont pas conservées sur la base de données, même si aucune erreur n'est déclenchée.

+0

Bonjour. Je voudrais vous aider avec ce problème. Est-il nécessaire d'utiliser des configurations basées sur xml? – Taras

+0

oui, c'est ce que j'utilise pour ce projet en cours. –

+0

Et est-il également nécessaire d'utiliser l'API Criteria. Je veux dire est-ce possible d'utiliser HQL? – Taras

Répondre

0

Il y a plusieurs problèmes avec votre code. Commençons depuis le début.

@Transactional ne fonctionne pas dans votre cas. Ceci est clairement visible depuis votre pile que vous avez copiée car Spring utilise des objets proxy pour implémenter des appels transactionnels. Comme je vois, votre configuration devrait être OK, donc la seule chose que je peux penser est que vous utilisez une mauvaise annotation.

Malheureusement, il existe 2 annotations @Transactional, une du package javax.transaction et une du package org.springframework.transaction.annotation. Évidemment, vous devez utiliser le dernier, sinon il ne fonctionnera pas correctement.

Deuxième chose, exception d'initialisation paresseuse. Cela se produit parce que vous essayez d'initialiser une relation paresseuse en dehors d'une transaction.

Il y a plusieurs solutions pour cela:

  1. vient le chercher dans une transaction
  2. Fetch directement avec la requête initiale

La première chose va résoudre le problème, mais il ne sera pas performer très bien par rapport à la deuxième solution.

Pour la première chose, vous pouvez le faire en appelant une méthode sur la collection paresseuse, par exemple

list.getLazyCollection().size() 

ou vous pouvez utiliser le mécanisme de mise en veille prolongée pour ce faire:

Hibernate.initialize(list.getLazyCollection()) 

La seule chose importante est de le faire dans une transaction.

Cette dernière solution, qui récupère la relation, implique directement des requêtes JPQL/HQL ou une API Criteria dans votre cas.

0

-je utiliser les packages que vous et moi avons ces deux entrées supplémentaires dans mon xml fichier de configuration:

<context:component-scan base-package="com.mypkg.daos"/> 
<context:annotation-config/> 

Comme vous utilisez ensuite @Transactional et @Autowried annotations je suppose que ce serait une bonne idée d'ajouter ces deux attributs de configuration.

+0

Mais j'avais ces deux entrées, dans mon fichier 'applicationContext.xml', référencées dans mon' web.xml' avec la balise 'init-param' associée à l'entrée de servlet pour' org.springframework.web.servlet.DispatcherServlet' . Ai-je besoin de les dupliquer sur mon fichier 'rootContext.xml'? –

+0

Oui, je les ai dupliqués afin que vous puissiez donner un coup –

+0

ok, je l'ai fait, mais ne pas résoudre le problème (même erreur se produit). –

0

je suppose que le printemps ne peut pas à injecter le SessionFactory correctement

Je permettre des transactions d'annotation de printemps dans votre XML; essayez de jeter un oeil ici http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html; vous devez activer transaction ou en ajoutant dans votre classe de configuration ce @EnableTransactionManagement ou en ajoutant dans votre XML ceci: <tx:annotation-driven/>

Alors ce que je ferais est la suivante:

J'écris ce dépôt OAC

@Repository 
    public class Dao<E> { 
     protected Class<E> clazz; 

     @Autowired 
     protected SessionFactory sessionFactory; 

     public Dao(Class<E> clazz) { 
      this.clazz = clazz; 
     } 

     public Session getCurrentSession() { 
      return sessionFactory.getCurrentSession(); 
     } 
     public List<E> select(String orderby, String groupby) 
     { 
     return (List<E>) this.getCurrentSession().createCriteria(clazz).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
     } 
    } 

Ensuite, je créer une classe de service où je ferais la

suivante
@Service 
public class ServiceClass<E> 
{ 
    @Autowired 
    private Dao<E> repos; 

@Transactional 
public List<E> select(String orderby, String groupby) { 
    return repos.select(orderby, groupby); 
} 
} 

J'espère que cela est utile

Angelo

+0

La transaction est déjà activée sur mon projet, via '' dans ma configuration XML, et j'ai l'annotation '@ Transactional' sur les méthodes de Ma classe Dao et Service. Je ne travaille toujours pas. –

+0

@KleberMota ne pas mettre la transaction sur DAO mais uniquement en service –

0

Je suggère d'essayer définir la source de données sur votre transactionManager au lieu de sessionFactory, comme ceci:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

Raison de ce changement se trouve sur cette link. Aussi, assurez-vous que vous disposez des éléments suivants:

  1. <tx:annotation-driven transaction-manager="transactionManager"/> déclaré sur votre dossier xml, dans votre cas rootContext.xml.
  2. <context:component-scan base-package="com.myproject"/> pour rendre les haricots visibles au printemps.
  3. @Repository sur votre DAO.
  4. @Transactional sur votre méthode (s) ou au niveau de la classe.

    1. et 4. permet à Spring de créer et de créer des proxies avec le support de transaction.
+0

transactionManager ne fonctionne pas uniquement avec la propriété 'dataSource' (l'application ne démarre même pas). Si j'essaie avec 'dataSource' et' sessionFactory', la même erreur se produit. En ce qui concerne les autres options, toutes sont déjà en place. –