我目前正在使用Spring + Struts2和Hibernate,我的要求是:
模块本身中将存在所有特定于模块的.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'''并且可以与DB连接。因为我给出了部署的subModule jar文件的路径,请参阅下面的代码:
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/subModule.jar</value>
</list>
</property>
以上所有.hbm和DAO / DbSession类都存在于Master模块中。现在我想在我作为jar部署的Sub模块中使用这个'''sessionFactoryErik'''。所以为此我在Sub模块中创建了另一个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.
任何人都可以帮助我。如何在子模块中获取相同的会话对象,因为只有Master模块可以建立连接,因为它不会知道它已部署(部署为jar)模块。
感谢。 塔潘
答案 0 :(得分: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>
答案 1 :(得分:0)
sessionFactoryErik bean返回 org.hibernate.internal.SessionFactoryImpl 对象,
所以你应该指定 org.hibernate.internal.SessionFactoryImpl 或其超类
在au.com.master.persistance.dao.XyzDbSession构造函数中输入( SessionFactory )
参考。