0

プロジェクトで struts2-spring-hibernate を使用しています。春を介してDB接続を処理しているため、hibernate.cfg.xmlは必要ありませんクエリを実行する必要があり、結果が必要です

これらの方法を使用して、結果を正常に取得しています

セッションを手動で開いて閉じます。 1. セッション session = sessionFactory.openSession(); 2. セッション newSession = HibernateUtil.getSessionFactory().openSession();

セッションを手動で処理しない 1. getHibernateTemplate().find(); 2. getSession().createSQLQuery();

どの方法が最適なのかわかりません。セッションに最適な方法を教えてください

セッションが getHibernateTemplate() および getSession() によっていつ開閉されるか。

4

1 に答える 1

0

これらのフレームワークを一緒に使用する方法を示します。私は HibernateTemplate の必要性を避けています。このクラスはあまりにも制限されていると思います。セッションを直接使用することを好みます。

プロジェクトに Spring があれば、Daos に Hibernate SessionFactory を注入する必要があるため、セッションを処理できます。まず、applicationContext.xml で SessionFactory を構成する必要があります。

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>

これで、 @Autowired アノテーションを使用して SessionFactory を注入できます。

@Repository
public class HibernateProductDao implements ProductDao {

    private final SessionFactory factory;

    @Autowired
    public HibernateProductDao(final SessionFactory factory) {
        this.factory = factory;
    }

    public List<Product> findAll() {
        return factory.getCurrentSession().createCriteria(Product.class).list();
    }

    public void add(final Product product) {
        factory.getCurrentSession().save(product);
    }
}

ここにいくつか重要なことがあります。メソッド getCurrentSession() を使用する必要があります。これにより、Spring がセッションのライフサイクルを制御できるようになります。代わりに getSession() を使用する場合は、自分の責任になります。たとえば、セッションを閉じます。

それでは、Struts 2 を構成しましょう。web.xml で:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Spring がオブジェクトを作成すると言うには、ファイル struts.xml も必要です。

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.objectFactory" value="spring" />
</struts>

最後に、アクションに Dao を挿入できます。

public class ProductAction {

    private ProductDao dao;

    @Autowired
    public ProductAction(ProductDao dao) {
        this.dao = dao;
    }
}

もちろん、Spring アノテーションを使用しているため、component-scanでパッケージをスキャンする必要があります。

これが、このフレームワークを統合するために私が見つけた最良の方法です。お役に立てば幸いです。

于 2013-01-03T20:49:48.297 に答える