2012-12-08 54 views
0

問題:如何在Hibernate中指出[ref]是真正的主鍵,但是當更新記錄時我希望它在[objectID上應用.update或.saveOrUpdate ]。休眠:如何更新不同的ID

上下文:我有一個場景,我正在從web服務同步信息到表中。在導入對象時,我保留對象唯一引用,這使我能夠再次運行腳本並更新本地保存的對象信息。

示例:由三個字段組成的簡單表格。

[參考文獻] [的objectID] [objectTitle]


[參考文獻] = A主鍵。新記錄插入時增量。用於內部查找和關係關聯。

[objectID] =對象本身的唯一標識符。

[objectTitle] =綁定到objectID的信息。這可能會更新。


我有點困惑如何在Hibernate中設置它。似乎我將[ref]設置爲@Id,因此它將使用生成器自動遞增。問題是我想使用[objectID]更新信息,而不是[ref]。

回答

0

嗯,這很簡單。

你開始通過加載具有給定的objectID實體:

MyEntity m = 
    (MyEntity) session.createQuery("select m from MyEntity m where m.objectID = :objectID") 
         .setParameter("objectID", theObjectID) 
         .uniqueResult(); 

然後你更新你的Web服務得到了新的標題這個實體:

m.setObjectTitle(theObjectTitle); 
+0

是否有更高效的方法來執行此操作?如果您要同步5,000多條記錄,每個記錄的開銷都很大。在更新哪個字段用作參考密鑰時,是否沒有辦法指示? – user649716

+0

是的,有。使用更新查詢。但是這會導致代碼看起來更像是JDBC代碼而不是Hibernate代碼,可能效率會更低(甚至在某些情況下可能效率會降低),而且更具有限制性。請參閱http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#batch-direct –

+0

您當然也可以使用'where m.objectId in:listOfObjectIds一次加載多個實體'子句,如果你需要一次修改很多實體。 –

-1

這是可能的更新表格中的'id'列; 其中.hbm文件中的'id'類似於:

<id name="id" type="int" column="id"> 
<generator class="increment"/> 
</id>