0

私はSpring / Hibernateプロジェクトを実行しようとしていますが、実行できないようです。以下のエラーが表示されます。私はそれを機能させることに近づいていると思いますが、明らかに何かが欠けています。誰かが私のコードの何が問題なのか教えてもらえますか? これを機能させるために 4 日間を費やしましたが、どこにも到達していないので、知りたいです。

これは私が得ているエラーです:

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)

アプリケーションコンテキスト

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

ダオ

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

2 に答える 2

0

あなたのdaoはSpringによって管理されていません.daoのインスタンスを手動で作成しただけです. したがって、何も自動配線されません。

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

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

于 2012-04-16T16:09:19.570 に答える
0

テストドライバーは意味がありません。Spring アプリケーション コンテキストが機能することを確認したい場合は、コンテキストから取得した Bean を使用します。

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 アプリケーション コンテキストで構成されているため、必要ありません。

于 2012-04-16T16:13:32.857 に答える