2017-06-05 41 views
0

我正在使用Spring MVC和Hibernate開始一個項目。我很關心與班級構成有關的最佳做法。假設我有一個名爲User的類,並使用像Hibernate這樣的ORM技術。Java Spring MVC + Hibernate類組合

我不知道是否應該包括所有與用戶類內的用戶實體相關的。我知道Hibernate通過延遲加載自動提高了性能,因此當我們檢索用戶時它不會檢索所有實例變量。不過,我覺得如果我們在U​​ser類中包含了太多的變量,查詢User對象將變得非常昂貴。

考慮這個例子:

@Entity 
@Table(name = "Users") 
public class User{ 

private String username; 
private String password; 
private long user_id; 

private Collection<Transaction> transactions; 

} 

在這裏,用戶類存儲交易的集合。每筆交易都代表用戶在網站上進行的購買交易。但我們不需要爲每個用戶存儲一個交易集合。

相反,我們可以做一個交易表所示:

@Entity 
@Table(name = "UserTransactions) 
public class Transaction{ 

    private int user_id; 
    private int order_id; 
    private double amount_paid; 
} 

通過此次交易表中,我們仍然可以存儲每一筆交易的每個用戶作出。

這只是一個例子,還有很多變量不需要存儲在User類中,並可以用自己的表來表示。所以我想知道在User類中是否存在所有這些變量的損害,或者我們是否應該小心並選擇包含在User類中的東西?每種方法的優缺點是什麼?

預先感謝您!

+0

你想問什麼?如何創建hibernate實體之間的關係? –

回答

2

看來你有用戶和UserTransation之間的一個一對多的關係。一個用戶可以有很多交易,一個交易只有一個用戶。

所以我不明白你爲什麼想知道,如果你要存儲在用戶的一切。你不能。您必須擁有2個域對象User和UserTransaction,並具有一對多關係(在數據庫中具有User和(User)Transaction表)。然後,當你用Hibernate查詢一個用戶時,默認情況下使用「lazy-loading」不與一個Transaction進行連接。對於需要Transaction的數據訪問模式,明確地進行「fetch連接」,以便在單個SQL查詢中獲取用戶及其事務。

1

如果您不想存儲在數據庫中的所有變量,那麼你可以使用

@Column(insertable=false, updatable=false) or @transient 

,並使用交易表將是一個比較好的方法只有TRANSACTION_ID和user_ID的是有限制他們和休息所有用戶詳細信息您可以在一些其他的表存儲,因爲它會更加有組織和標準化,將導致更少的開銷