所有的情況並不少見到這樣做的第一:
DocumentService {
public Document addDocument(int customerId) {
Customer customer = session.getById(Customer.class, customerId);
Document document = new Document();
customer.getDocuments().add(document);
session.update(customer);
return document;
}
}
所以在末尾添加文檔可能看起來像一個perforamnce點球點前閱讀客戶,但要走的路,如果你不不想傳遞完整的Customer對象。
通常我會使用類似於CustomerInfo對象的東西,它只存儲一些相關信息,如id,名稱,地址等等。通常情況下,不會經常更改的所有內容,如果用戶看到陳舊的數據並不重要。 (如果關鍵的話,經常使用通知事件/消息來更新相關的信息對象)。
現在您可以將這些CustomerInfo傳遞給許多常用的服務方法。如果從數據庫加載Customer對象,我通常會更新客戶信息對象以儘可能保持其同步。
這裏只有一個規則。由於客戶信息可能包含陳舊的數據(某些其他用戶已經更改了它,所以您需要驗證其有效性)。您可以引入@Version或者比較相關屬性(如果它們已經更改)(您使用樂觀日誌記錄又名長用戶交易和兩個或多個短數據庫事務)。
所以在使用重新安裝到底是什麼錯。
如果你有一個本地嵌入式數據庫和使用Hibernate的應用程序是唯一的用戶(單個用戶安裝) ,您可能需要考慮使用單一會話方法,將會話的每次訪問同步或彙集到一起,以避免併發事務/訪問數據庫。
這樣確保只有一個Object表示每個'數據庫對象/行'。這使得很容易假設每個對象和每個Info都與數據庫同步。只有會話丟失的情況下,您必須通過將應用程序使用的所有實體重新附加到新會話來恢復,以避免出現兩個實體對象表示同一個數據庫行的情況,這在休眠中不允許。
摘要
- 使用連接是沒有錯的。
- 在應用程序中傳遞實體實例並沒有錯。記住:Hibernate通常會發出一個select來刷新對象,並驗證它代表當前會話/事務看到的當前數據庫狀態(使用@Version降低成本)。
- 您可以使用CustomerInfo/DocumentInfo對象來避免沿着實體實例傳遞以減少內存佔用並避免重新加載。
- 如果性能問題,您可以直接使用id創建文檔,然後使用您從插入(SQL)語句中添加的id創建DocumentInfo。這樣您就不必重新加載用戶或創建文檔對象。這只是爲了減少內存佔用並提高性能,但接縫不屬於您的擔憂。
我的建議是,堅持重新附加,只要你沒有內存消耗問題。