0

これまで読んだことから、トランザクションを使用することがHibernateの遅延読み込みの問題の解決策になることがわかりました。セッションは、サービスレイヤーでのトランザクション全体を通じて、それ以上の遅延なしに利用できます。

では、トランザクション管理を誤って構成した可能性がありますか?春と休止状態に関しては、私は実際には初心者ですが、皆さんが私を助けてくれるかもしれません。

私の構成:

<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
    id="sessionFactory">
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>
<!-- Hibernate Template bean that will be assigned to DAOs. -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

<!--
    Transaction manager for a single Hibernate SessionFactory (alternative
    to JTA)
-->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>

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

私のDAO実装では、自動配線を使用して@RepositoryアノテーションとHibernate-templateBeanを注入するだけです。

サービス実装の一般的なヘッダーは次のとおりです。

@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

@Service(readOnly=false)その特定のメソッドで実際に保存/更新されたものがある場合は、注釈を付けます。

サービスに正しい関連付けをロードできるようにするために何か他のものを構成する必要がありますか、それともこれは通常トランザクションによって処理されますか?

今、私は実際に何をすべきか少し混乱しているので、助けてください:)

4

2 に答える 2

1

遅延読み込みの問題とトランザクションは、実際には相互に関連していません。しかし、それは別の話です:) Beanでのセッションへのアクセスを除けば、すべてうまくいきました。これをどのように行うのかわかりません。標準的な解決策(春の2.xでは、3.xについてはまだわかりませんが、まだ調べていません)は、セッションにアクセスする予定のクラスの基本クラスとしてHibernateDaoSupportを使用することです。しかし、Spring固有のクラスへの依存関係が追加されるため、個人的には少し危険に見えます。より良い方法は、Beanにセッションを挿入することです。これを行うには、次のような定義でセッションBeanを宣言する必要があります。

<bean name="hibernateSession" class="org.springframework.orm.hibernate3.SessionFactoryUtils" factory-method="getSession"
  scope="prototype">
    <constructor-arg index="0" ref="hibernateSessionFactory"/>
    <constructor-arg index="1" value="false"/>
    <aop:scoped-proxy/>
</bean>

そしてそれを使用します。

詳細は次のとおりです。

http://stas-blogspot.blogspot.com/2009/10/hibernate-spring-in-standalone.html

于 2010-10-21T23:36:25.817 に答える
1

今までの春の理解は悪かったと思います。実際、セッション管理には実際の管理はありませんでした。基本的に、現在起こっていることは、DAOからデータを取得できたが、受信した直後は、セッションが閉じられていたため、レイジーコレクションをロードすることさえできなかったということでした。

現在、休止状態のインターセプターを使用しています。このインターセプターは、各リクエストの開始時にセッションをスレッドに接続し、終了時にセッションを閉じます。これは必ずしも最も理想的な解決策ではありませんが、学校のプロジェクトではあまり気にしません。

もう1つの解決策は、次のように思われます。@aroundセッションがサービスメソッドの呼び出し中にのみ使用可能になるようにAOPを追加します。これが最善の解決策だと思いますが、このプロジェクトについては、今のところ深く掘り下げるつもりはありません。良いことは、それが存在することを私が知っていることです。

この記事も私を大いに助けました:http ://www.jroller.com/kbaum/entry/orm_lazy_initialization_with_dao

興味のある方へ:ここに私が追加しなければならなかったものがあります:Spring MVC 3.0には、mvc:intereceptorsより少ないxmlを入力できるようにするという新機能があります。

<!-- WEB-INF/applicationContext.xml or your own XML config file -->
<mvc:interceptors>
    <bean
        class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
</mvc:interceptors>
于 2010-10-23T09:17:10.453 に答える