2012-04-16 3 views
0

Я пытаюсь запустить проект Spring/Hibernate и не могу заставить его работать. Я получаю ошибку ниже. Я думаю, что я близок к тому, чтобы заставить его работать, но я, очевидно, что-то пропустил. Может кто-нибудь сказать мне, что не так с моим кодом? Я хотел бы знать, потому что я потратил 4 дня, пытаясь заставить это работать, и никуда не ушел.Спящий режим «No CurrenetSessionContext» Ошибка

Это ошибка я получаю:

Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured! 
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542) 
    at cmsutil.dao.ContentComponentDAOImpl.getContentComponents(ContentComponentDAOImpl.java:37) 
    at cmsutil.util.Driver.main(Driver.java:22) 

ApplicationContext

<context:property-placeholder location="jdbc.properties"/> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.url}" 
     p:username="${jdbc.username}" 
     p:password="${jdbc.password}"/> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
     p:dataSource-ref="dataSource" 
     p:configurationClass="org.hibernate.cfg.AnnotationConfiguration" 
     p:packagesToScan="cmsutil.dao"> 
    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
     <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
     <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
     <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
     </props> 
    </property> 
    <property name="eventListeners"> 
     <map> 
     <entry key="merge"> 
      <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/> 
     </entry> 
     </map> 
    </property> 

    </bean> 

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

    <bean id="txnManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
     p:sessionFactory-ref="sessionFactory"/> 
</beans> 

hibernate.cfg.xml

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <mapping resource="contentcomponent.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

DAO

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

@Transactional 
@Repository("contentComponentDAO") 
public class ContentComponentDAOImpl implements ContentComponentDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 


    public ContentComponentDAOImpl(SessionFactory sessionFactory) { 
     setSessionFactory(sessionFactory); 
    } 


    public ContentComponentDAOImpl() { 
    } 

    @Override 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 


    @Override 
    public List<ContentComponent> getContentComponents() throws DAOException { 
     Session session = sessionFactory.getCurrentSession(); 
     List<ContentComponent> documents; 

     Query query = session.getNamedQuery("ContentComponent.findAllContentComponents"); 
     documents = query.list(); 
     return documents; 
    } 

И, наконец, водитель испытания:

package cmsutil.util; 

import cmsutil.dao.ContentComponentDAOImpl; 
import cmsutil.exceptions.DAOException; 
import java.util.Iterator; 
import java.util.List; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class Driver { 

    public static void main(String[] args) throws DAOException { 
     AbstractApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     ContentComponentDAOImpl c = new ContentComponentDAOImpl(); 
     c.setSessionFactory(sessionFactory); 
     List l = c.getContentComponents(); 
    } 
} 

ответ

0

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

У вас есть два варианта: разрешить ввод сеанса hibernate в dao (передается как параметр в конструкторе). Или вызовите свои компоненты из загруженного контекста приложения.

Если это для куколки модульного тестирования, вы можете передать макет объекта.

0

Ваш тестовый драйвер не имеет смысла. Если вы хотите, чтобы убедиться, что контекст Spring приложения работает, использовать бобы, полученный из контекста:

public static void main(String[] args) throws DAOException { 
    AbstractApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");   
    ContentComponentDAO c = factory.getBean(ContentComponentDAO.class); 
    List l = c.getContentComponents(); 
} 

Также вам не нужно hibernate.cfg.xml, так как Hibernate настроен в контексте приложения Spring в вашем случае.

+0

Я думаю, что я все ближе, но теперь я получаю NoSuchBeanDefinitionException ContentComponentDAOImpl с = factory.getBean (ContentComponentDAOImpl.class); c.setSessionFactory (sessionFactory); – EdgeCase

+0

@BusterBunker: Как я вижу из использования '@ Repository', вы ожидали, что' ContentComponentDAOImpl' будет автоопределяться как bean-компонент. Если это так, вам нужно включить автоопределение с помощью [''] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html # бобы сканирующая автоопределение). – axtavt

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