2012-04-16 6 views
0

私はSpring/Hibernateプロジェクトを手に入れようとしていますが、動かすことができません。私は以下のエラーが発生しています。私はそれが仕事に近づいていると思うが、私は明らかに何かが欠けている。誰かが自分のコードに何が間違っているか教えてもらえますか?私は知りたいと思う、私は4日を働かせようと努力してきたので、どこにもいない。Hibernate "No CurrenetSessionContext" Error

これは私が取得していますエラーです:

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

あなたのDAOは、スプリングによって管理されていない、あなただけ手動でDAOのインスタンスを作成しました。したがって、何もautowiredされません。

あなたには2つのオプションがあります - 休止状態のセッションをdaoに注入できるようにします(コンストラクタのパラメータとして渡されます)。または、ロードされたアプリコンテキストからBeanを呼び出します。

単体テストの恩恵を受ける場合は、モックオブジェクトを渡すことができます。

0

あなたのテストドライバは意味がありません。 Hibernateはあなたのケースで、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を必要としない:あなたは、Springアプリケーションコンテキストが動作することを確認するには、コンテキストから取得した豆を使用しています。

+0

私が近づいていますと思いますが、今は NoSuchBeanDefinitionException ContentComponentDAOImpl C = 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)で自動検出を有効にする必要があります。 #beans-scanning-autodetection)を実行します。 – axtavt

関連する問題