2012-04-16 60 views
0

我正在使用以下方法將對象集合保存到數據庫。休眠模板SaveOrUpdateALL主鍵自動生成

public Collection save(Collection instances) { 

     try { 
      this.getHibernateTemplate().saveOrUpdateAll(instances); 
      this.getHibernateTemplate().flush(); 


     } catch (RuntimeException re) { 

      throw re; 
     } 
     return instances; 
    } 

實例的主鍵是由HibernateTemplate自動生成的。在JVM啓動後,當第一次調用這個方法時,Hibernate運行下面的查詢來獲取Max實例上使用的主鍵。從table_name的

但執行方法的第二個時間

選擇MAX(主鍵ID),我沒有看到執行此查詢。看起來像hibernate在會話中的某個地方存儲了這個值。

現在,如果表由另一個進程(可以說是一個存儲過程或SQL)進行更新,則對ORA-00001:唯一約束(SCHEMANAME.PRIMARY_KEY_CONSTRAINT)的所有後續調用都將失敗,從而違反了異常。如果JVM重新啓動,Hibernate再次執行max(主鍵)生成查詢,並且一切正常。

有人可以幫助我做什麼,以確保主鍵自動生成查詢在每次執行該方法時(而不僅僅是第一次)運行。謝謝。

回答

1

您可能選擇了增量生成器,它將最大值存儲在內存中,然後遞增它。當您有多個進程訪問數據庫(即大部分時間)時,此策略不適用。

選擇另一種策略(序列,表,本地,取決於您的數據庫功能和您的偏好)。

查看http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generator的詳細信息

+0

該屬性設置在哪裏?它在Hibernate配置屬性中。謝謝你的幫助。我沒有廣泛使用Hibernate,但你提供的鏈接是有幫助的。 – Ravi 2012-04-17 02:59:42

+0

我在Hibernate Table映射配置文件中找到了id生成器。但將其更改爲增量以外的任何內容都會引發Hibernate映射異常,並說該ID生成器不能實例化。 Ravi 2012-04-17 03:16:59