程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Hibernate映射文件打成jar,JUnit測試無法正確執行的問題分析

Hibernate映射文件打成jar,JUnit測試無法正確執行的問題分析

編輯:關於JAVA

之前將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>

問題雖然解決了,但還有一點還是不明白,為何項目運行沒問題呢?

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved