2013-10-17 18 views
1

我們有一個新的webapp,我們正在準備部署。我們改變了我們如何包括我們的罐子,只需將它們手動轉儲到web-inf/lib中,然後使用eclipse的部署程序集將它們從公共位置動態移動到web-inf/lib中,爲我們的庫創建一個存儲庫。這個策略適用於除了一個罐子之外的所有東西...我們的休眠實體所在的一個。Hibernate packageesToScan失敗,但annotatedClasses工作

罐子在那裏,我們可以看到它。它在類路徑中,我們可以實例化它。但是當我們運行時,我們得到未知實體的異常,就好像來自目標實體的註釋從未運行過一樣。當我們用「annotatedClasses」列表替換我們的「packagesToScan」聲明時,它工作正常。然而我們的軟件包看起來正確。我寧願使用靈活的packagesToScan,而不是開發人員每次需要做簡單易忘的步驟來聲明它們的類。

任何人都知道爲什麼這可能是?

Spring配置(以下顯示所有三個在同一時間,在現實中,我們評論一個在一個時間):

<bean id="rptappSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="rptappDataSource" /> 
    <!-- works --> 
    <property name="annotatedClasses"> 
    <list><value>a.b.c.report.model.table.BOReportTask</value></list> 
    </property> 
    <!-- does not work --> 
    <property name="packagesToScan"> 
    <list><value>a.b.c.report.model.table</value></list> 
    </property> 
    <!-- also does not work --> 
    <property name="packagesToScan" value="a.b.*" /> 
    <property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop> 
     <prop key="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</prop> 
     <prop key="hibernate.bytecode.provider">javassist</prop> 
     <prop key="hibernate.show_sql">${hibernate.show.sql}</prop> 
     <prop key="format_sql">false</prop> 
     <prop key="use_sql_comments">false</prop> 
     <prop key="hibernate.cache.use_second_level_cache">false</prop> 
     <prop key="hibernate.default_schema">K702PRDR</prop> 
    </props> 
    </property> 
</bean> 

例外:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: BOReportTask is not mapped [from BOReportTask r where r.reportStatus = :status order by r.submissionTimestamp asc] 
     at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181) 
     at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111) 
     at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93) 
     at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:313) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3353) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3237) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:724) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:575) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:292) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
     at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98) 
     at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
     at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
     at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760) 
     at a.b.c.report.dao.hibernate.table.ReportTaskDao.fetchByStatus(ReportTaskDao.java:68) 
+0

是否有原因,爲什麼你使用org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean而不是一個較新的版本(hibernate/spring)? –

+0

也許有幫助(抱歉,雙後 - 無法找到編輯我以前的評論的方法) –

+0

@aumand - Re:新版本 - 我們在休眠3.5.1。我們已經提出允許升級的請求,但尚未獲得授權。如果在3.5.1之內有更好的課程,我就會全力以赴。 – user1187719

回答

2

所以我最近重新發現了這個帖子並認爲我會爲後代發佈解決方案。當導出RAD中的jar時,jar嚮導在嚮導的第一頁上有一個名爲「Add Directory Entries」的複選框。檢查一下。沒有它,我的packagesToScan引用,這是包含實體的包的根(因爲有多個實體包),將不會被發現。它表現得沒有實體。選中此項可以將內容添加到清單中,並使註釋掃描程序找到類。