2010-02-12 96 views
0

因此,在最近的一個項目(一個小型​​內部工具)中,我想用而不是來使用我們通常在我們所有項目中使用的ORM工具。原因在於,我特別不喜歡它們,特別是在複雜對象層次和關係的複雜項目中。使用ORM很難調試性能問題以及ORM庫可能在封面上進行「優化」的許多事情引發的其他問題。從數據庫加載時代表不完整的對象

所以當我沒有ORM工具的幫助時,我正在考慮一種惰性加載對象的某些屬性的方法。假設一個例子:

class Student { 
private List<Course> courses; 

public List<Course> getCourses() {...} 
public void setCourses(List<Course> courses) {...} 
} 

所以在這種情況下,我們把「課程」懶散。所以我想要一種方法來區分「數據庫」沒有從數據庫中加載的情況,以及即使從數據庫中獲取「課程」實際上爲空的情況。

什麼是我能達到它的典型方法。我在想,可能會關聯一個類型爲「Course」的特殊空對象,表示數據庫中實際上不存在任何數據。而java null意味着數據不會從數據庫中獲取。但是這樣做會打破抽象的意義,因爲這種屬性的獲取者需要做出訪問DAO以獲取數據的決定。

回答

1

如果您不喜歡像Hibernate這樣的標準ORM庫,爲什麼不使用像iBATIS這樣的工具? iBATIS是Hibernate和普通SQL之間的中介。本質上它將結果集映射到Java對象,但它不會爲您編寫任何SQL。

之後我們從Hibernate切換到它 - 像你一樣 - 發現Hibernate對於更復雜的模式不能很好地工作。

它確實支持動態類增強,但它也支持通過將連接放入SQL來避免N + 1選擇(對不起,這是很糟糕的解釋,但請檢查user guide瞭解更多信息)。

無論如何,要回答你的實際問題,我可能會實現這個通過使用cglib或類似的東西來增強一個類(創建一個動態的子類)。您保留已加載或未加載的屬性的Map,然後您不需要特殊值。

但是我認爲使用一個已經存在的庫可能是一個更好的主意,如果可能的話重新發明輪子從不是一個好主意。

0

你不能被加載課程和courses區分被加載,但通過使用null暗示空「不裝」和一個空Collection暗示「加載,但沒有提供的課程」。

但是,如果訪問者被調用但數據尚未被延遲加載,我的優先選擇是拋出RuntimeException(例如IllegalStateException)。這使得調試變得更加容易,並且避免了在整個代碼中散佈檢查的需求。

相關問題