2008-12-31 44 views
2

您能否描述在模型中代表實體的POJO中包含OID(通常爲數據庫行標識符)的優缺點?帶OID的值對象

其實我不是等在談論有關平等/哈希碼問題,我應該更好地描述我的問題(我的壞:))...

我們已經有了一些這些實體的代表業務對象的類(如產品,目錄等)。有時他們有一個'商業id',例如Product可以通過其獨特的ProductId(它有3個字段:id,type,repository)來找到。

在我們的數據庫中,Product表除了3個業務列(id,type,repository)之外,還有一個代理主鍵列(OID),以方便外鍵引用並減少聯接子句。

Product/ProductId類是我們公開給其他應用程序的API的一部分。因此,例如,他們可以打電話:

productManager.findProductById(ProductId productId); 

的問題是,應該或不應該的OID包含在產品或產品編號類知道我們的客戶預計將使用產品ID標識。

優點:

  • 我可以使用OID做另一個查找喜歡

    Product p = productManager.findProductById(ProductId productId); 
    Catalog c = productManager.findAllCatalogsContainingProduct(p.getOid()); 
    

我們正在使用的產品編號查找了很多應用程序,以便本每次往返數據庫時都會保存,以避免找到與ProductId匹配的OID。

缺點:

  • 我剛剛曝光的OID到客戶端(讓我們希望他不使用它,而不是業務鍵!)

你可以列出其他優點和缺點?

回答

1

數據庫行標識符=主鍵?如果是這樣,則不存在專業或認可,您必須擁有它,否則您無法將POJO與其對應的數據庫行相關聯。

要檢索產品和目錄,標準的SQL方法是做一個Join。例如,我DAL我可以這樣做:

SearchCriteria sc = new SearchCriteria(); 
sc.AddBinding("ProductId", productId); 
List<Entity> Products = SQL.Read(sc, new Product(new Catalog()); 

List<Entity> Products = SQL.Read(sc, new Catalog(new Product()); 

這樣就沒有必要透露任何東西給調用者,也不是一個往返。

+0

我更新了我的問題,提供了更多信息:) – 2008-12-31 18:11:43

0

如果您的equals()或hashCode()的實現基於標識符,那麼您可能會遇到問題,因爲它最初可能爲空,然後一旦對象被保留就會更改。請看下圖:

http://java.sun.com/javase/6/docs/api/java/util/Set.html

注意:如果使用可變對象作爲一組元素大,一定要小心。如果對象的值以影響等於比較的方式更改,而對象是集合中的元素,則不會指定集的行爲。這種禁令的一個特例是,一個集合不允許自己作爲一個元素。

我們假設您的hashCode()實現基於標識符,equals()在其比較中使用hashCode()。如果將該對象添加到Set並且其標識爲空,則等於比較將執行一種方式。如果你將對象保存在集合中,它的標識符值可能會改變,從而改變equals()和hashCode()的行爲。這打破了上述Set的「契約」。

這是一個邊緣案例,但值得注意的一點。

+0

當然,你是對的,但這不是我的問題的重點,對於我太稀疏抱歉抱歉... – 2008-12-31 18:12:35