0

私は現在Spring+Struts2とHibernateに取り組んでいます、私の要件は:

  1. システム内の他のすべてのモジュール(Jarとしてデプロイされている)によって共有されるDB接続を行うマスターモジュールがあります。
  2. すべてのモジュール固有の.hbmおよび永続性クラスはモジュール自体に存在します。たとえば、私のマスターモジュールには(Springを介した)Hibernate接続ファイルがあり、すべての.hbmマッピングファイルがあります。以下は、Springを介して行われたHibernate接続のサンプルです。

    <bean id="dataSourceErik" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="testWhileIdle" value="true" />
      <property name="minEvictableIdleTimeMillis" value="120000" />
      <property name="timeBetweenEvictionRunsMillis" value="30000" />
    </bean>
    <bean id="sessionFactoryErik"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSourceErik" />
      <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.generate_statistics=true
            hibernate.show_sql=false
            hibernate.jdbc.batch_size=10
            hibernate.bytecode.use_reflection_optimizer=true
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider                hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
            hibernate.cache.use_second_level_cache=true
            hibernate.cache.use_query_cache=true
            net.sf.ehcache.configurationResourceName=configuration/ehcache.xml
        </value>
      </property>
    
      <property name="mappingLocations">
        <list>
            <value>classpath:configuration/hibernate/Abc.hbm.xml</value>
            <value>classpath:configuration/hibernate/Xyz.hbm.xml</value>
       </list>
      </property>        
    </bean>
    <bean id="AbcActionDAO" class="au.com.master.persistance.dao.AbcDbSession">
        <constructor-arg ref="sessionFactoryErik" />
    </bean>
    <bean id="XyzActionTypeDAO"class="au.com.master.persistance.dao.XyzDbSession">
        <constructor-arg ref="sessionFactoryErik" />
    </bean>
    

上記のxmlに以下のコードを追加すると、'''sessionFactory'''にアクセスして、DBに接続できます。デプロイされたsubModulejarファイルのパスを指定しているので、以下のコードを参照してください。

<property name="mappingJarLocations">
<list>
   <value>WEB-INF/lib/subModule.jar</value>
</list>
</property>

上記のすべての.hbmおよびDAO/DbSessionクラスはマスターモジュールに存在します。ここで、jarとしてデプロイされたサブモジュールでこの'''sessionFactoryErik'''を使用したいと思います。そのため、サブモジュールに別のxmlファイルを作成しました。このファイルは、上記の'''sessionFactoryErik'''を参照し、このモジュール固有の.hbmおよびDAO/DbSessionのマッピングを持ちます。以下のコードを参照してください。

 <bean id="sessionFactoryMonitor" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
     <property name="sessionFactoryErik" ref="sessionFactoryErik" />
     <property name="mappingLocations">
        <list>
            <value>classpath:configuration/hibernate/DDDType.hbm.xml</value>
        </list>
      </property>        
 </bean>

 <bean id="testActionDAO" class="au.com.java.subModule.persistance.dao.DddActionDbSession">
    <constructor-arg ref="sessionFactoryMonitor" />
</bean>   

プロジェクトをデプロイしてサーバーを再起動すると、以下のエラーが発生します。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoryMonitor' defined in URL [jar:file:/home/developer/Project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/erik/WEB-INF/lib/erik-monitor-1.0-SNAPSHOT.jar!/configuration/spring-monitor-dao.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactoryErik' of bean class [org.springframework.orm.hibernate4.LocalSessionFactoryBean]: Bean property 'sessionFactoryErik' is not writable or has an invalid setter method.

誰かがこれのために私を助けることができますか?デプロイされた(jarとしてデプロイされた)モジュールの知識がないため、マスターモジュールのみが接続を確立できるので、サブモジュールで同じセッションオブジェクトを取得するにはどうすればよいですか。

ありがとう。タパン

4

2 に答える 2

1

このクラスorg.springframework.orm.hibernate4.LocalSessionFactoryBeanには、sessionFactoryErik というプロパティがありません。データソースを LocalSessionFactoryBean に注入していると思います。もしそうなら、これを変更してください

<bean id="sessionFactoryMonitor" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
     <property name="sessionFactoryErik" ref="sessionFactoryErik" />
     <property name="mappingLocations">
        <list>
            <value>classpath:configuration/hibernate/DDDType.hbm.xml</value>
        </list>
      </property>        
 </bean>

これに

 <bean id="sessionFactoryMonitor" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
     <property name="dataSource" ref="sessionFactoryErik" />
     <property name="mappingLocations">
        <list>
            <value>classpath:configuration/hibernate/DDDType.hbm.xml</value>
        </list>
      </property>        
 </bean>
于 2013-02-22T01:50:44.490 に答える
0

sessionFactoryErik Bean はorg.hibernate.internal.SessionFactoryImplオブジェクトを返します。

したがって、 org.hibernate.internal.SessionFactoryImplまたはそのスーパークラスを指定する必要があります

( SessionFactory ) au.com.master.persistance.dao.XyzDbSession コンストラクターに入力

参照。

于 2013-09-24T17:30:31.863 に答える