OpenSessionInViewFilter
SeasarおよびS2Hibernateを使わせていただいております。関係者の皆様ありがとうございます。
S2HibernateにはOpenSessionInViewFilterが用意されていますが、これはJSPなどのViewでSessionを取得することを前提としているようで、DAOからHibernateを使おうとするとOpenSessionInViewFilterが取得したSessionとは別のSessionを開いてしまいます。
JoeyではTapestryのPageやComponentなどでSessionを取得するのはスマートじゃないので、S2HibernateのOpenSessionInViewFilterと同じような感じでFilterを設定して、以下のようなdiconファイルを使うようにしました。
<components> <include path="j2ee.dicon"/> <!-- session Factory (when use OpenSessionInView Pattern) --> <component class="org.asyrinx.joey.hibernate.seasar.filter.S2SessionFactoryWrapperImpl" /> <component class="org.asyrinx.joey.hibernate.seasar.filter.RequestS2SessionFactoryImpl" /> <component class="org.asyrinx.joey.hibernate.seasar.filter.RequestFilterChainTxImpl" > <aspect>j2ee.requiredTx</aspect> </component> </components>
ちょっとクラス名がイケてないんで変える予定です。で、web.xmlはこんな感じ。
<filter> <filter-name>OpenSessionInView</filter-name> <filter-class>org.asyrinx.joey.hibernate.seasar.filter.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInView</filter-name> <url-pattern>/app</url-pattern> </filter-mapping>
これもパッケージ名がおかしいな。直そう。
×org.asyrinx.joey.hibernate.seasar.filter.OpenSessionInViewFilter
○org.asyrinx.joey.s2hibernate.filter.OpenSessionInViewFilter
だね。
これで何も気にせずDAOでS2Sessionが取得できるっす。
近日中に公開します。