2011-06-13 29 views
2

我有幾個對象使用Hibernate,BatchTransaction和Transaction映射到數據庫中的表。 BatchTransaction的表(batch_transactions)具有對事務的外鍵引用,名爲transaction_id。如何直接通過Hibernate更新外鍵值?

在過去,我已經使用了用於內部調用運行批處理事務,並完成從BatchTransaction的參考交易,一旦交易完成一個批處理運行。插入事務後,我只需調用batchTransaction.setTransaction(txn),所以我有一個從BatchTransaction到Transaction的@ManyToOne映射。

我改變批處理運行,以便它通過Web服務執行其交易。新插入的Transaction的ID將由服務返回,我將直接更新BatchTransaction中的transaction_id(而不是使用BatchTransaction上的Transaction字段的setter,這會要求我不必要地加載新插入的項目)。

好像做的是使用SQL,而不是休眠的最合理的方式,但我想知道如果有一個更優雅的方式。有任何想法嗎?


這裏是基本的映射。

BatchQuery.java

@Entity 
@Table(name = "batch_queries") 
public class BatchQuery 
{ 
    @ManyToOne 
    @JoinColumn(name = "query_id") 
    public Query getQuery() 
    { 
     return mQuery; 
    } 
} 

Query.java

@Entity 
@Table(name = "queries") 
public class Query 
{ 
} 

的想法是不設置BatchQuery對象上的 「查詢」 屬性更新batch_queries的query_id列。

+0

可能你可以把HBM文件作爲參考,然後我們可以看看。 – 2011-06-13 02:12:55

+0

我沒有HBM文件,因爲我使用了註釋。我會添加映射。 – Rafe 2011-06-15 17:12:08

+0

請參閱下面的答案 – 2011-06-16 04:37:07

回答

1

使用直接SQL更新,或HQL更新,肯定是可行的。

沒有看到完整的問題,它看起來對我來說,你可能會作出修改,您的域名是值得記錄在您的域。您可能正在轉向擁有僅具有TransactionId成員而不是完整事務的BatchTransaction。

如果在其他活動中,BatchTransaction仍然需要水合該交易,我會考慮爲TransactionId添加一個單獨的映射,並將其作爲管理映射(使Transaction關聯更新並插入false)。

如果BatchTransaction將不再與完整的交易予以關注,只是刪除添加的TRANSACTIONID場後關聯。

0

正如您所寫,我們可以使用SQL來解決上述問題。但我會建議不要通過SQL更新主鍵。

現在,當您更改密鑰時,這意味着您要創建一個新對象,因此,您可以先用先前的密鑰刪除現有對象,然後嘗試插入帶有更新的新對象鍵(在你的情況TRANSACTION_ID)