之前將Hibernate的實體類及其映射文件也放到項目中,由於有多個項目使用同一個數據庫, Hibernate實體類和映射文件重復,不便於維護和升級。因此將其抽取出來,打成jar包,再引入回項目。
實際操作中,發現個詭異的問題:項目運行沒問題,但是JUnit單元測試不能運行(方法使用了HQL語 句時),總是報org.hibernate.hql.ast.QuerySyntaxException的錯誤,說明沒有找到映射文件,不知道 為何。具體報錯信息如下:
org.springframework.orm.hibernate3.HibernateQueryException: Fsettlement is not mapped [select f from Fsettlement f where 1=1 and f.fsettlementId = :fsettlementId ];
nested exception is org.hibernate.hql.ast.QuerySyntaxException: Fsettlement is not mapped [select f from Fsettlement f where 1=1 and prePayType='PRE_PAY' and f.supplierId = :supplierId and f.payTime >= :startDate and f.payTime <= :endDate and f.stockEleSupplierId = :stockEleSupplierId and f.payType = :payType and f.fsettlementId = :fsettlementId ]
...
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Fsettlement is not mapped [select f from Fsettlement f where 1=1 and prePayType='PRE_PAY' and f.supplierId = :supplierId and f.payTime >= :startDate and f.payTime <= :endDate and f.stockEleSupplierId = :stockEleSupplierId and f.payType = :payType and f.fsettlementId = :fsettlementId ]
...
Hibernate的配置如下:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- del 使用 mappingJarLocations,不能再使用mappingDirectoryLocations,不然會報錯
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:/com/allen/hbm/</value>
</list>
</property>
-->
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/model-core*.jar</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.stock.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.stock.show_sql} </prop>
<prop key="hibernate.cache.provider_class">${hibernate.stock.cache.provider_class}
</prop>
</props>
</property>
</bean>
Google上找到的方法一一試過,也許是錯誤太低級,根本就沒人會犯此錯誤吧。找不到解決方法,但 是項目還是要繼續。分析了一下,文件是否在jar中,對於JUnit來說,都是從classpath中讀取,與其他 無關。
於是嘗試改回原來的配置,發現還是不行;
難道是相對路徑,不是絕對路徑?於是將”/”去掉,還是不行;
難道要指定文件才行嗎?再一次嘗試,竟然成功了!不明白,Hibernate不是會自動掃描的嘛;雖然成 功了,但是要一一指定文件名,肯定不現實;
於是各種嘗試,將結果一一記錄,
<property name="mappingLocations">
<value>classpath*:com/allen/hbm/*.hbm.xml</value>
<!--<value>classpath:com/allen/hbm/*.hbm.xml</value>--> <!-- 此種寫 法報錯,不能識別 -->
<!--<value>classpath*:/com/alenn/hbm/</value>--> <!-- 此種寫法報錯, 不能識別 -->
<!--<value>classpath*:/com/allen/hbm</value>--> <!-- 此種寫法報錯,不 能識別 -->
<!--<value>classpath*:com/allen/hbm/</value>--> <!-- 此種寫法報錯,不 能識別 -->
<!--<value>classpath*:com/allen/hbm</value>--> <!-- 此種寫法報錯,不 能識別 -->
</property>
問題雖然解決了,但還有一點還是不明白,為何項目運行沒問題呢?
查看本欄目