【Spring】 HibernateのSessionFactory設定の重箱の隅 | さすらいびとの徒然漂流記

さすらいびとの徒然漂流記

ふらふら漂流するさすらいびとのように,色々な話題についてお気楽極楽,徒然なるままに…

SpringのコンテキストファイルできるSessionFactory設定.

いろいろと調べたけど,すべてが出ているものが見つからなかったのでちょっとサンプル作成.

リスナエントリキー名が特にわからず,コードから抽出.


とりあえず,Forumを参照したりCode Hackしたりしてサンプル化しました.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <!-- セッションファクトリ設定 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- データソース設定 -->
        <property name="dataSource" ref="dataSource" />

        <!-- マッピングリソース設定(ディレクトリ版) -->
        <property name="mappingDirectoryLocations"
            value="classpath:/com/hibernate/mapping" />

        <!-- マッピングリソース設定(個別ファイル版) -->
        <property name="mappingResources">
            <list>
                <value>com/hibernate/Personal.hbm.xml</value>
                <value></value>
            </list>
        </property>

        <!-- Hibernateプロパティ設定 -->
        <property name="hibernateProperties">
            <props>
                <!-- SQL dialect -->
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLInnoDBDialect
                </prop>

                <!-- JDBC connection pool (use the built-in) -->
                <prop key="hibernate.connection.pool_size">1</prop>

                <!-- Enable Hibernate's automatic session context management -->
                <prop key="hibernate.current_session_context_class">thread</prop>

                <!-- Disable the second-level cache  -->
                <prop key="hibernate.cache.provider_class" >
                    org.hibernate.cache.NoCacheProvider
                </prop>

                <!-- Echo all executed SQL to stdout -->
                <prop key="hibernate.show_sql">true</prop>

                <!-- Drop and re-create the database schema on startup -->
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>

                <!-- connection pool setup(C3P0版) -->
                <prop key="hibernate.c3p0.min_size">1</prop>
                <prop key="hibernate.c3p0.max_size">5</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_preriod">3000</prop>

                <!-- connection pool setup(Apache DBCP版) -->
                <prop key="hibernate.dbcp.maxActive">10</prop>
                <prop key="hibernate.dbcp.maxIdle">10</prop>
                <prop key="hibernate.dbcp.maxWait">180000</prop>
                <prop key="hibernate.dbcp.whenExhaustedAction">1</prop>
                <prop key="hibernate.dbcp.ps.maxActive">10</prop>
                <prop key="hibernate.dbcp.ps.maxIdle">10</prop>
                <prop key="hibernate.dbcp.ps.maxWait">180000</prop>
                <prop key="hibernate.dbcp.ps.whenExhaustedAction">1</prop>
            </props>
        </property>

        <!-- L2キャッシュ設定 -->
        <property name="entityCacheStrategies">
            <props>
                <prop key="com.mycompany.Customer">read-write</prop>
                <prop key="com.mycompany.Product">read-only,myRegion</prop>
            </props>
        </property>
        <property name="collectionCacheStrategies">
            <props>
                <prop key="com.mycompany.Order.items">read-write</prop>
                <prop key="com.mycompany.Product.categories">read-only,myRegion</prop>
            </props>
        </property>

        <!-- インタセプタ設定 -->
        <property name="entityInterceptor" ref="daoEventInterceptor" />

        <!-- イベントリスナ設定 -->
        <property name="eventListeners">
            <map>
                <entry key="auto-flush">
                    <bean class="org.hibernate.event.def.DefaultAutoFlushEventListener" />
                </entry>
                <entry key="merge">
                    <bean class="org.hibernate.event.def.DefaultMergeEventListener" />
                </entry>
                <entry key="create">
                    <bean class="org.hibernate.event.def.DefaultPersistEventListener" />
                </entry>
                <entry key="create-onflush">
                    <bean class="org.hibernate.event.def.DefaultPersistEventListener" />
                </entry>
                <entry key="delete">
                    <bean class="org.hibernate.event.def.DefaultDeleteEventListener" />
                </entry>
                <entry key="dirty-check">
                    <bean class="org.hibernate.event.def.DefaultDirtyCheckEventListener" />
                </entry>
                <entry key="evict">
                    <bean class="org.hibernate.event.def.DefaultEvictEventListener" />
                </entry>
                <entry key="flush">
                    <bean class="org.hibernate.event.def.DefaultFlushEventListener" />
                </entry>
                <entry key="flush-entity">
                    <bean class="org.hibernate.event.def.DefaultFlushEntityEventListener" />
                </entry>
                <entry key="load">
                    <bean class="org.hibernate.event.def.DefaultLoadEventListener" />
                </entry>
                <entry key="load-collection">
                    <bean class="org.hibernate.event.def.DefaultInitializeCollectionEventListener" />
                </entry>
                <entry key="lock">
                    <bean class="org.hibernate.event.def.DefaultLockEventListener" />
                </entry>
                <entry key="refresh">
                    <bean class="org.hibernate.event.def.DefaultRefreshEventListener" />
                </entry>
                <entry key="replicate">
                    <bean class="org.hibernate.event.def.DefaultReplicateEventListener" />
                </entry>
                <entry key="save-update">
                    <bean class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener" />
                </entry>
                <entry key="save">
                    <bean class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener" />
                </entry>
                <entry key="update">
                    <bean class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener" />
                </entry>
                <entry key="pre-load">
                    <bean class="org.hibernate.event.def.DefaultPreLoadEventListener" />
                </entry>
                <entry key="pre-update">
                    <bean class="org.hibernate.event.def.DefaultPreUpdateEventListener" />
                </entry>
                <entry key="pre-delete">
                    <bean class="org.hibernate.event.def.DefaultPreDeleteEventListener" />
                </entry>
                <entry key="pre-insert">
                    <bean class="org.hibernate.event.def.DefaultPreInsertEventListener" />
                </entry>
                <entry key="post-load">
                    <bean class="org.hibernate.event.def.DefaultPostLoadEventListener" />
                </entry>
                <entry key="post-update">
                    <bean class="org.hibernate.event.def.DefaultPostUpdateEventListener" />
                </entry>
                <entry key="post-delete">
                    <bean class="org.hibernate.event.def.DefaultPostDeleteEventListener" />
                </entry>
                <entry key="post-insert">
                    <bean class="org.hibernate.event.def.DefaultPostInsertEventListener" />
                </entry>
                <entry key="post-commit-update">
                    <bean class="org.hibernate.event.def.DefaultPostUpdateEventListener" />
                </entry>
                <entry key="post-commit-delete">
                    <bean class="org.hibernate.event.def.DefaultPostDeleteEventListener" />
                </entry>
                <entry key="post-commit-insert">
                    <bean class="org.hibernate.event.def.DefaultPostInsertEventListener" />
                </entry>
            </map>
        </property>
    </bean>

    <!-- データソース設定 -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/springhibernate" />
        <property name="username" value="someuser" />
        <property name="password" value="iamalazypassword" />
    </bean>

    <!-- Interceptor実装クラス -->
    <bean id="daoEventInterceptor" class="com.hibernate.DaoEventAspect" />

    <!-- トランザクション設定 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- DAO例 -->
    <bean id="personalDao" class="com.hibernate.PersonalDao">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>