2012-10-21 17 views
1

我已經在Web系統中做了一些維護,這個系統是在Java,Struts2和Hibernate 3中完成的。我的客戶迫切要求的一項是糾正登錄,因爲它非常緩慢。Hibernate運行所有表進行簡單的登錄

我可以確定用戶何時進行登錄,Hibernate會在不同表中的數據庫上生成許多與登錄無關的查詢。

我的關係有三個表:用戶,學生,教師

學生

  • ID
  • 名稱

教師

  • ID
  • 名稱

用戶

  • ID
  • 登錄
  • 密碼

每當一個學生做一個登錄查詢檢查它是否是正確的登錄名和密碼如果ID存在於Student表中。如您所見,沒有外鍵ID,例如,Student表中的ID_USER。

我的查詢:

Student student =(Student)session.createCriteria(Student.class) 
.add(Property.forName("login").eq(login)) 
.add(Property.forName("password").eq(password)) 
.setMaxResults(1) 
.uniqueResult(); 
  • 學生從用戶繼承...

我User.hbm.xml

...

<class name="com.xxx.User" table="TBL_USERS" discriminator-value="0" lazy="true"> 
    <id name="id" column="ID"> 
    <generator class="sequence"> 
     <param name="sequence">seq_users</param> 
    </generator> 
    </id> 

    <discriminator column="TYPE" insert="true" /> 

    <subclass name="com.xxx.Student" discriminator-value="1" lazy="true"> 
     <join table="TBL_STUDENTS"> 
     <key column="ID"/> 
      <property name="name" column="NAME"/> 
     </join> 
    </subclass> 

    <subclass name="com.xxx.Teacher" discriminator-value="2" lazy="true"> 
     <join table="TBL_TEACHERS"> 
      <key column="ID" /> 
       <property name="name" column="NAME" /> 
     </join> 
    </subclass> 

。 ..

在我的Hibernate日誌許多奇怪的查詢,如波紋管:

它發生在20多個不同的表和重複所有的時間,因爲,登錄行動緩慢。但我不知道爲什麼會這樣,我對Hibernate沒有太多的經驗。

休眠:

select 
     exerc0_.ID_CLASS as ID6_1_, 
     exerc0_.ID as ID1_, 
     exerc0_.ID as ID14_0_, 
     exerc0_.DATE_ENT as DATA2_14_0_, 
     exerc0_.TITLE as TITTLE14_0_, 
     exerc0_.TEXT as TEXT14_0_, 
     exerc0_.TYPE_EXERC as TYPE5_14_0_, 
     exerc0_.ID_CLASS as ID6_14_0_ 
    from 
     TBL_EXERC exerc0_ 
    where 
     exerc0_.ID_CLASS=? 

可能是什麼回事?

+1

user.hbm中是否有多對一或bag/set/list映射?我懷疑lazyloading被意外禁用# – Firo

+0

只有這樣,但現在我想改變做關係的方式。因爲我不明白髮生了什麼事。 – Ventura

回答

0

只是爲了不讓這個問題永遠打開。 很久以前問題就解決了,但我完全忘了回覆。 我不得不啓用一些懶惰加載,並確保選擇列表,而不是在其他地方設置。用LIST看起來更具性能。

@Firo在某種程度上是正確的。