2

タイトルは少し誤解を招くかもしれませんが、アドバイスをお願いしたいと思います。

ここで、SpringMVCアプリをHibernateとトランザクションで構成したとしましょう。構成の一部は次のようになります。

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
    <property name="user" value="xxx"/>
    <property name="password" value="xxx"/>
    <property name="maxPoolSize" value="10"/>
    <property name="maxStatements" value="0"/>
    <property name="minPoolSize" value="5"/>
</bean>
<!-- Session Factory Declaration -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    <property name="packagesToScan" value="com.execon.models"/>
</bean>

<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager"/>

<!-- Transaction Manager is defined -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

それで、基本的に私が今やらなければならないことは@Autowired、DBアクセス権を管理するクラスへの私のsessinFactoryだけですか?

簡単な例ですが@Controller、これを次の場所に移動します@Service

@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;

@RequestMapping(value = "/")
public String getMainPage( Model model )
{
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery( "from Period" );
    List<Period> list = query.list();
    System.out.println( list );
    session.getTransaction().commit();
    return "MainPage";
}

ご覧のとおり、マップされたクラスのstdコンソールリストに追加しようとしています。それはうまく機能しますが、これをより大きなプロジェクトでどのように管理すべきかについてのアドバイスが必要です。セッションを取得してトランザクションを開始するutilクラスが必要ですか?または、これを管理するためにいくつかのテンプレートを使用する必要がありますか?単に私はこれを書きたくない:

    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    //
    //...
    //
    session.getTransaction().commit();

DBに接続する必要があるすべての場所で。多分私は何かを逃している、またはそれを完全に間違っているのですか?どんな助けでもいただければ幸いです

4

1 に答える 1

3

不足しているのは、Springトランザクションアノテーションです。

@RequestMapping(value = "/")
@Transactional
public String getMainPage( Model model )
{
    Session session = SessionFactoryUtils.openSession(sessionFactory);
    Query query = session.createQuery( "from Period" );
    List<Period> list = query.list();
    System.out.println( list );
    return "MainPage";
}

明らかに、あなたが指摘したように、通常のことは、dbのものを分離することです。

コンテキストファイルでは、次のものが必要になります。

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

この特定の例では、これをXXX-servlet.xmlコンテキストファイルに入れる必要があることに注意してください。これは、コントローラーを構成するものだからです。

SpringとHibernateの一般的な考え方は、トランザクションと接続の管理にSpringを使用することです。登録者を使用するSessionFactoryUtilと、現在のスレッドにバインドされたトランザクションリソースとして休止状態のセッションが使用されます。

于 2012-07-04T17:26:56.267 に答える