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が取得できるっす。
近日中に公開します。