簡體   English   中英

如何通過 Hibernate 直接更新外鍵值?

[英]How do you update a foreign key value directly via Hibernate?

我有幾個對象使用 Hibernate、BatchTransaction 和 Transaction 映射到數據庫中的表。 BatchTransaction 的表 (batch_transactions) 有一個對事務的外鍵引用,名為 transaction_id。

過去,我使用了一個批處理運行器,它使用內部調用來運行批處理事務,並在事務完成后完成從 BatchTransaction 到 Transaction 的引用。 插入事務后,我只需調用batchTransaction.setTransaction(txn),因此我有一個從BatchTransaction 到事務的@ManyToOne 映射。

我正在更改批處理運行程序,以便它通過 Web 服務執行其事務。 新插入的事務的 ID 將由服務返回,我想直接更新 BatchTransaction 中的 transaction_id(而不是使用 BatchTransaction 上的 Transaction 字段的設置器,這將需要我不必要地加載新插入的項目)。

似乎最合乎邏輯的方法是使用 SQL 而不是 Hibernate,但我想知道是否有更優雅的方法。 有任何想法嗎?


這是基本映射。

批量查詢.java

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

查詢.java

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

這個想法是更新 batch_queries 中的 query_id 列,而不在 BatchQuery object 上設置“查詢”屬性。

使用直接 SQL 更新或 HQL 更新當然是可行的。

沒有看到完整的問題,在我看來,您可能正在對您的域進行修改,值得在您的域中記錄。 您可能會轉向擁有一個 BatchTransaction,它的成員只是 TransactionId 而不是完整的事務。

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

如果 BatchTransaction 將不再關注完整的 Transaction,只需在添加 TransactionId 字段后刪除該關聯即可。

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

現在,當您更改密鑰時,這意味着您正在創建一個新的 object,為此,您可以先使用以前的密鑰刪除現有的 object,然后嘗試插入一個新的 ZA8CFDE6331BD59EB2AC966F8911C4B666案例 transaction_id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM