2010-01-10 78 views
4

我有一個使用hibernate uniqueResult方法的登錄控制器。當我在eclipse的tomcat服務器上測試它時,一切正常。但是,當我將我的webapps部署到tomcat服務器(在同一臺機器上)時,它會失敗:即使我使用正確的憑據,它也會返回null。hibernate - uniqueResult默默地失敗

這裏是我的Hibernate代碼:

session.createCriteria(User.class) 
      .add(Restrictions.eq(User.USERNAME_FIELD, userName)) 
      .add(Restrictions.eq(User.PASSWORD_FIELD, password)).uniqueResult(); 

謝謝!

+1

一切看起來不錯,我猜這個用戶不存在 – whiskeysierra 2010-01-10 18:53:09

+2

'uniqueResult()'不是「默默地失敗」.Hibernate API清楚地表明,如果查詢返回沒有結果,那麼'uniqueResult()'將返回null(http:// docs .jboss.org/hibernate/stable/core/api/org/hibernate/Criteria.html#uniqueResult%28%29) – skaffman 2010-01-10 22:21:38

+0

作爲一個方面說明。不應該你至少哈希密碼? – 2012-08-30 12:01:34

回答

1

沒有足夠的信息,嘗試跟蹤正在生成的SQL:

坐落在log4j.properties

log4j.logger.org.hibernate.SQL=TRACE 
log4j.logger.org.hibernate.type=TRACE 

或者設置這些休眠特性

hibernate.show_sql=true 
hibernate.format_sql=true 

然後嘗試運行這些查詢使用直接在數據庫中返回null的傳遞參數。

5

也許你應該嘗試使用記錄器來查看實際的hibernate查詢和參數。這兩個記錄器,你應該做出 「調試」 是:

  • org.hibernate.SQL
  • org.hibernate.type

TRACEALL把兩者並檢查記錄結果。有關記錄器的更多信息,請參見the hibernate documentation

最常見的情況是log4j。 AFAIK,hibernate.show_sql已棄用。

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration> 
<appender name="Stdout" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<logger name="org.hibernate.SQL"> 
    <level value="TRACE"/> 
</logger> 

<logger name="org.hibernate.type"> 
    <level value="TRACE"/> 
</logger> 

<root> 
    <level value="INFO"/> 
    <appender-ref ref="Stdout"/> 
</root> 

</log4j:configuration> 
0

我已通過添加session.flush()

解決這個問題,但我絕對不會滿意這個:-(。 請告訴我,有沒有更好的解決辦法。謝謝。

+0

爲了幫助您,請按照我們的建議添加它並將其添加到您的問題中(生成的日誌)以及代碼的完整上下文 – 2010-01-10 13:04:55

+0

當我添加log4j依賴項時,我在eclipse的tomcat控制檯中看到,webapp不斷重新加載,並最終結束是「java.lang.OutOfMemoryError:PermGen空間」 我不知道如何解決這個問題:-( – robinmag 2010-01-10 13:44:08

+0

當從數據庫中讀取某些東西時需要session.flush()似乎很奇怪,我想你的意思是另一個地方你的代碼庫,你真正保存的東西,不是嗎? – whiskeysierra 2010-01-10 18:52:36