2014-10-10 6 views
1

Это ошибка: Вызванный:SessionFactory Hibernate Error (проект Spring MVC)

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of 
type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean 
which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Это мой persistence-context.xml:

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

    <!-- Datasource to connection management (http://commons.apache.org/dbcp/configuration.html) 
    --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close"> 
     <property name="driverClass" value="${datasource.mysql.driverClassName}" /> 
     <property name="jdbcUrl" value="${datasource.mysql.url}" /> 
     <property name="user" value="${datasource.mysql.username}" /> 
     <property name="password" value="${datasource.mysql.password}" /> 
     <property name="maxIdleTime" value="${datasource.mysql.maxIdle}" /> 
    </bean> 

    <!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="br.com.mirian.martins.core.model" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
       <prop key="hibernate.c3p0.timeout">${datasource.mysql.timeout}</prop> 
       <prop key="hibernate.connection.release_mode">after_transaction</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- Transaction manager for a single Hibernate SessionFactory --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
     scope="prototype"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
     <property name="defaultTimeout" value="120" /> 
    </bean> 

    <bean id="transactionTemplate" 
     class="org.springframework.transaction.support.TransactionTemplate"> 
     <property name="transactionManager" ref="transactionManager" /> 
    </bean> 
</beans> 

Это мой DAOImpl (generic):

/** 
* Classe generica com metodos padroes utilizados na camada de persistencia 
* 
* @param <T> 
* @param <ID> 
*/ 
public class DAOImpl<T, ID extends Serializable>{ 

    private transient final Class<T> clazz; 

    @Autowired 
    private SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    public DAOImpl() { 
    this.clazz = (Class<T>) ((ParameterizedType) 
    getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    /** 
    * SessionFactory injection 
    * 
    * @param sessionFactory 
    */ 
    public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
    } 

    /** 
    * Recupera a sessao corrente 
    * 
    * @return sessao corrente 
    */ 
    protected Session getSession() { 
    return sessionFactory.getCurrentSession(); 
    } 

    /** 
    * Utiliza a sessao corrente para criar uma nova instancia de criteria 
    * 
    * @return instancia de criteria 
    */ 
    protected Criteria createCriteria() { 
    return getSession().createCriteria(clazz); 
    } 

    /** 
    * Utiliza a sessao corrente para criar uma nova query 
    * 
    * @param hql 
    * @return query 
    */ 
    protected Query createQuery(String hql) { 
    return getSession().createQuery(hql); 
    } 
} 

Это мой controller:

@Controller 
public class IndexController { 

    @Autowired 
    UserService userService; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String index(HttpServletRequest request, HttpServletResponse response) { 


    return "index"; 

    } 

} 

Пожалуйста, если кто-то сейчас, как решить эту проблему. Спасибо

+0

, где ваш файл конфигурации весной? вы должны поместить TransactionManager в конфигурационный файл весны. Так что весна может включить весеннюю транзакцию для спящего режима! –

+0

не могли бы вы добавить код вашего файла web.xml и servlet-context.xml –

+0

Это основное причина исключения? Можете ли вы показать полный стек? – pomkine

ответ

3

Здесь вы путаться в двух вещах

  1. JPA EntityManagerFactory

    EntityManagerFactory и EntityManager. Они определяются стандартом JPA.

  2. SessionFactory

    SessionFactory и Session являются Hibernate специфичные.

оба имеют там Pros & Cons, так как вы используете SessionFactory (не JPA), вы не должны использовать persistence.xml вообще.

JPA EntityManagerFactory

Если вы хотите использовать JPA с Spring, вам нужно положить persistence.xml в META-INF папку внутри папки источника, и объявить LocalContainerEntityManagerFactory в applicationContext.xml

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name = "persistenceUnitName" value = "MyJPA" /> 
</bean> 

Затем вы можете придать EntityManager в вашу фасоль с использованием @PersistenceContext:

@PersistenceContext 
private EntityManager em; 

настойчивость.XML

this files usually contain details related to your database, such as connection strings and their respective user names and passwords including other ORM related information. These details can be placed in other locations so you need not explicitly have one, although having such a file usually makes all persistence related information available in one place which makes looking up certain settings and configurations easier.

SessionFactory

Если вы хотите использовать SessionFactory то вы должны объявить sessionFactory боб в ваш applicationContext.xml следующим

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close"> 
     <property name="driverClass" value="${datasource.mysql.driverClassName}" /> 
     <property name="jdbcUrl" value="${datasource.mysql.url}" /> 
     <property name="user" value="${datasource.mysql.username}" /> 
     <property name="password" value="${datasource.mysql.password}" /> 
     <property name="maxIdleTime" value="${datasource.mysql.maxIdle}" /> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan" value="com.edgeowt.entities"/> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="show_sql">${hibernate.show_sql}</prop> 
        <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      </props> 
     </property> 
    </bean> 

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

Тогда вы можете иметь возможность вводить SessionFactory в ваше весна фасоль с использованием @Autowired

@Autowired 
private SessionFactory sessionFactory; 

надеюсь, что это поможет вам решить вашу проблему ...

1

Вам нужно добавить @Component в верхней части вашего DAO (или подобной аннотации Spring). Также у вас есть <context:annotation-config/> и <context:component-scan base-package="whatever"/> в вашем web.xml? Вы должны сказать Весне, чтобы выйти и обнюхать аннотации.

+0

Мы добавляем '' и '' в 'Spring applicationContext.xml' файл не int' web.xml' –

1

Вы должны добавить @Repository (весенняя аннотация) в верхней части вашего класса DAOImpl. Кроме того, вы должны вставить <context:component-scan base-package="packageName"/> для сканирования всего вашего проекта и поиска mvn-компонентов в вашем проекте и <mvc:annotation-driven /> (чтобы использовать весеннюю аннотацию) в конфигурации весны, чтобы он мог понять вашу весеннюю аннотацию.

Смежные вопросы