2017-02-14 12 views
0

В моем текущем проекте Spring, у меня есть такая конфигурация гибернации на моем rootCOntext.xml файле:Hibernate не сохраняются данные в базе данных (см обновление 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> 

но когда приложение должно выполнить этот запрос:

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

, который содержится в этом классе:

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(); 
    } 
    ... 
} 

Я получаю это error:

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) 

Кому виделось?

UPDATE

я изменить метод 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(); 
     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(); 
} 

и теперь я получаю эту ошибку:

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) 

который я предполагаю, указывает на вопрос о том, как Я реализую отношения между моим классом из слоя модели.

, что мой класс:

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; 
} 

Кто-то знает, как решить эту проблему? Без использования FetchType.EAGER для связей ManyToMany (Если я это сделаю, приложение даже не запускается, потому что я получаю спящий режим для ошибки, не могу получить несколько пакетов).

UPDATE 2

Я стараюсь это в моем методе 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; 
} 

и теперь я получаю первую ошибку, указанную в этом сообщении.

UPDATE 3

Таким образом, мне удалось исправить эту ошибку, изменив метод getCurrentSession() Dao класс в том, что:

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

, но теперь, когда я представить данные из моих форм, они не сохранялись в базе данных, несмотря на отсутствие ошибки.

+0

Здравствуйте. Я бы хотел помочь вам с этой проблемой. Требуется ли использовать xml-конфигурацию? – Taras

+0

да, это то, что я использую для этого текущего проекта. –

+0

А также требуется использовать API критериев. Я имею в виду, что можно использовать HQL? – Taras

ответ

0

Есть несколько проблем с вашим кодом. Начнем с самого начала.

@Transactional не работает в вашем случае. Это ясно видно из вашего stacktrace, который вы скопировали, потому что Spring использует прокси-объекты для реализации транзакционных вызовов. Как я вижу, ваша конфигурация должна быть в порядке, поэтому единственное, о чем я могу думать, это то, что вы используете неправильную аннотацию.

К сожалению, есть 2 @Transactional аннотации, один из пакета javax.transaction и один из пакета org.springframework.transaction.annotation. Очевидно, вы должны использовать последний, иначе он не будет работать должным образом.

Вторая вещь, ленивое исключение инициализации. Это происходит потому, что вы пытаетесь инициализировать ленивое отношение за пределами транзакции.

Есть несколько решений для этого:

  1. Пиль внутри транзакции
  2. Пиль непосредственно с исходным запросом

Первое будет решить эту проблему, однако она не будет действительно хорошо по сравнению со вторым решением.

Для первой вещи, вы можете сделать это путем вызова какого-либо метод на ленивой коллекции, например

list.getLazyCollection().size() 

или вы можете использовать механизм Hibernate, чтобы сделать это:

Hibernate.initialize(list.getLazyCollection()) 

только важно сделать это внутри транзакции.

Последнее решение, которое извлекает отношение напрямую, включает в себя либо запросы JPQL/HQL, либо API критериев в вашем случае.

0

Я использую те же пакеты, что и вы, и у меня есть эти две дополнительные записи в моем файле xml конфигурации:

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

Как вы используете @Transactional и @Autowried аннотаций, то я предполагаю, что это было бы хорошей идеей, чтобы добавить эти два атрибута конфигурации.

+0

Но у меня были эти две записи в файле 'applicationContext.xml', указанном в моем' web.xml', с тегом 'init-param', связанным с записью сервлета для' org.springframework.web.servlet.DispatcherServlet' , Нужно ли дублировать их в файле 'rootContext.xml' тоже? –

+0

Да, я их дублировал, поэтому вы можете дать ему выстрел –

+0

ok, я сделал это, но не решу проблему (такая же ошибка возникает). –

0

Я думаю, что весна не в состоянии в инъекции SessionFactory правильно

я позволил бы пружинные аннотаций транзакции в вашем XML; попробуйте посмотреть здесь http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html; Вы должны включить транзакцию или путем добавления в классе конфигурации это @EnableTransactionManagement или путем добавления в вашем XML это: <tx:annotation-driven/>

Тогда то, что я хотел бы сделать это следующим образом:

Я пишу это хранилище DAO

@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(); 
     } 
    } 

Тогда я бы создать класс обслуживания, где я сделать следующее

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

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

Я надеюсь, что это полезно

Angelo

+0

Транзакция уже включена в моем проекте с помощью '' в моей конфигурации XML, и у меня есть аннотация '@ Transactional' как по методам из мой класс Dao и Service. Все еще не работает. –

+0

@KleberMota не помещает транзакцию в DAO, а только в сервисе –

0

Я хотел бы предложить, чтобы попытаться установить источник данных на вашем TransactionManager вместо SessionFactory, как это:

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

Причина этого изменения можно найти на этом link. Кроме того, убедитесь, что у вас есть следующее:

  1. <tx:annotation-driven transaction-manager="transactionManager"/> заявил файл xml, в вашем случае в rootContext.xml.
  2. <context:component-scan base-package="com.myproject"/> сделать фасоль видна весной.
  3. @Repository на вашем DAO.
  4. @Transactional на ваш метод (ы) или на уровне класса.

    1. и 4. позволяет использовать Spring и создавать прокси с поддержкой транзакций.
+0

transactionManager не работает только с свойством 'dataSource' (приложение даже не запускается). Если я попытаюсь использовать как 'dataSource', так и' sessionFactory', возникает такая же ошибка. Что касается других вариантов, все они уже существуют. –