Spring Transactions&Hibernate:怠zyな初期化
-
10-10-2019 - |
質問
私がこれまで読んだことから、私はトランザクションを使用することがHibernateの怠zyな荷重問題の解決策になると理解していました。セッションは、それ以上のアドューックなしで、サービスレイヤーのトランザクション全体で利用可能になります。
それで、私は自分の取引管理を誤解したのでしょうか?春や冬眠に関しては、私は実際にニュースですが、多分あなたたちは私を助けることができます。
私の構成:
<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
注釈とa Hibernate-template
自動操作を使用して注入された豆。
サービスの実装の典型的なヘッダーは次のとおりです。
@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {
@Autowired
LeerlingDAO leerlingDAO;
@Autowired
LeerplanDAO leerplanDAO;
とともに @Service(readOnly=false)
その特定の方法で実際に保存/更新された場合、注釈。
サービスで適切な関連付けをロードできることを確認するために、何か他のものを構成する必要がありますか、それとも通常トランザクションによって処理されますか?
今、私は実際にすべきことを少し混乱させているので、私を助けてください:)
解決
怠zyなロードの問題とトランザクションは、実際には他のものとは関係ありません。しかし、それは別の話です:)あなたの豆のセッションへのアクセスとは別に、あなたはすべてうまくやった。どうやってこれを行うのかわかりません。標準的なソリューション(春2.xでは、3.x約3.xはまだわかりませんが、まだ見ていません)は、セッションにアクセスできる場合、クラスのベースクラスとして冬眠装置を使用することです。しかし、個人的には、春固有のクラスに依存するため、私には少し危険に見えます。より良い方法は、セッションを豆に注入することです。これを行うには、それに似た定義でセッションビーンを宣言する必要があります。
<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
他のヒント
春の私の理解は今まで悪いだけだったと思います。実際、セッション管理には実際の管理はありませんでした。基本的に今起こったのは、DAOからデータを取得できる可能性がありますが、それを受け取った直後、セッションが閉じられていたために怠zyなコレクションをロードすることさえできませんでした。
これで、各リクエストの先頭にセッションをスレッドに添付し、終了したときに閉じます。これは常に最も理想的なソリューションではありませんが、学校プロジェクトではあまり気にしません。
他の解決策は次のとおりです。 @around
セッションは、サービスメソッド呼び出し中にのみ利用可能であることが使用されます。これが最良の解決策だと思いますが、このプロジェクトのために今それを深く掘り下げるつもりはありません。良いことは、私がそれが存在することを知っていることです。
この記事も私を大いに助けてくれました: http://www.jroller.com/kbaum/entry/orm_lazy_initialization_with_dao
興味のある方へ:ここに私が追加する必要がありました:春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>