在Spring的applicationContext.xml中配置映射文件,通常是在<sessionFactory>这个Bean实例中进行的,若配置的映射文件较少时,可以用sessionFactory的所属类LocalSessionFactoryBean的“mappingResources”属性,方式包括(mappingResources,mappingLocations、mappingDirectoryLocations与mappingJarLocations )定义方法如下:
第一种:
<property name="mappingResources">
<list>
<value>com/w3cs/vlar/hibernate/Person.hbm.xml</value>
<value>com/w3cs/vlar/hibernate/Car.hbm.xml</value>
<value>com/w3cs/vlar/hibernate/Engine.hbm.xml</value>
<value>com/w3cs/vlar/hibernate/Toy.hbm.xml</value>
</list>
</property>
当配置文件变得越来越多,阅读和修改起来也越来越麻烦,而且基于XML的配置也可能带来输入的错误,导致你可能因为一个字符的错误而浪费半天时间去寻找错误。
第二种:
在这种情况下,可以使用LocalSessionFactoryBean的“mappingDirectoryLocations”属性来定义映射文件,只要指出映射文件所在文件夹就可以了,Spring会替你找出该文件夹内所有的映射文件,定义方法如下:
<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/mappings</value>
</list>
</property>
第三种:
当然,它的属性值也可以通过classpath来指出,这时所指定的是工程的类路径
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/my/package/*.hbm.xml</value>
</list>
</property>
第四种:
<!-- 增加了对大对象字段处理配置Begin -->
<bean id ="oracleLobHandler"
class ="org.springframework.jdbc.support.lob.OracleLobHandler"
lazy-init ="true" >
<property name ="nativeJdbcExtractor" ref ="nativeJdbcExtractor" />
</bean>
<bean id ="nativeJdbcExtractor" class ="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init ="true"/>
<!-- 增加了对大对象字段处理配置End -->
<!-- 定义Hibernatte框架中需要的SesscionFactory对象//-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--增加了对大对象字段处理配置Begin -->
<property name ="lobHandler" ref ="oracleLobHandler"/>
<!--增加了对大对象字段处理配置End -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/my/package/login/dao/pojo/</value>
<value>classpath:/my/package/jpf/dao/pojo/</value>
......
</list>
</property>
备注说明:
<property name="mappingJarLocations"> <list> <value>classpath*:\WEB-INF\lib\XXX.jar</value> </list> </property> 错误提示org.hibernate.MappingException: Unknown entity: 实体类未映射。 现已确认,实体类无问题 其中,XXX.jar为HBM打包文件。实体类也另外打包,并导入项目。 请教这个问题如何解决?
呃。那个位置不是问题,classpath*:后,是否带路径都可以的。 现在的问题是找不到实体类,并不是无法读入hbm文件。。 从项目要求上不允许实体类和hbm文件打包在一起,必须分成2个包。。。 另外,jar包导入后,1个包还是2个包不是问题关键把,关键是为什么打包后就找不到实体类了。 打成一个包后仍然找不到实体类。。。 但是这样考虑,当初我路径写错的时候,错误提示是jar包没找到,现在的错误提示是实体类没找到,说明jar包已经找到了,但是识别不了jar包里面的实体类。 我是用ant打包的,刚才又测试了下,在实体类的包中加了一个无关的类,返回一个字符串,结果测试成功,说明jar包是找到了。 hibernate是通过hbm文件的class name来找实体类的,现在怀疑是hbm文件有问题。但是包名我检查了好多遍都没发现错误。。。 另外,<value>/WEB-INF/lib/po.jar</value> ,我最开始就用这种写法,但是错误是 java.io.FileNotFoundException: class path resource [WEB-INF/lib/Hbm.jar] cannot be resolved to URL because it does not exist