我目前正在研究 Spring + Struts2 和 Hibernate,我的要求是:
- 我有主模块,它将建立数据库连接,由系统中的所有其他模块(部署为 Jar)共享。
所有模块特定的 .hbm 和持久性类都将存在于模块本身因此例如我的主模块将具有 Hibernate 连接文件(通过 spring)将所有 .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''' 并可以与数据库连接。当我给出部署的 subModule jar 文件的路径时,请参见下面的代码:
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/subModule.jar</value>
</list>
</property>
以上所有 .hbm 和 DAO/DbSession 类都存在于 Master 模块中。现在我想在部署为 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)模块。
谢谢。塔班