2011-10-04 68 views
2

我試圖自己學習,但很快就開始意識到,無盡的書的結尾,我會知道所有@Entity等低級別的東西,而不理解頂級。持久性設計一般問題


所以我的理解是:

  1. 我們通常聲明DAO接口我們定義所有的域模型執行的方法。其次,我們編寫Domain Model來表示數據庫中的實體。
  2. 我們編寫DAO實現類,它可以使用Hibernate,JPA,JDBC或我們在那裏創建的和實現我們的DAO接口的任何奇蹟。

(同春共連接最多)


我的問題,指的是分以上:


我們每寫域模型單一DAO接口?如果我們有涉及多個領域模型的交叉行爲,我們會聲明新的DAO接口實現並相應地調用它?例如:「庫存的客戶訂單,庫存檢查項目是否可用 - >確認是否」該去哪裏?


Hibernate如何與MVC交互?有什麼重要的方面需要注意?

在本書中,我注意到:

重寫equals和hashCode

「在簡單的場景,Hibernate是可以不需要任何特殊更改域對象本身維護實體等價但是,如果。您的應用程序要求您將實體添加到Java集合(例如java.util.Set),或者您計劃使用分離的實體,則可能需要爲您的域對象重寫默認的equals()和hashCode()方法「

也許我不太瞭解它,什麼是分離的實體?那些是我們從Hibernate上下文中取出來的 - 有效的只是類的集合?

我想要的是安全地做Hibernate的工作,然後返回給我一個模型,我將給予Servlet,並將它委託給適當的View。我們通過DAOimpl類方法的簡單返回來提取該模型,還是有點棘手?


如果我要做沒有ORM框架的持久層,只要用普通的JDBC,我的問題是什麼?我聽說Hibernate有一些處理併發請求的智能會話,那麼JDBC會發生什麼?


業務邏輯位於何處?它是DAOimpl類嗎?


對不起,如果我的一些問題是不幸的,我很欣賞任何批評和糾正。

謝謝。

回答

2

我們爲每個Domain Model編寫單個DAO接口?如果我們有 交叉切割行爲參與涉及多個 域模型,我們宣佈新的對DAO接口實現並相應地調用 它?例如:「來自庫存的客戶訂單,庫存檢查 是否可用項目 - >確認它是否」該去哪裏?

你可以這樣做。比較簡單的方法是讓服務管理DAO調用。如果您使用Spring,則可以在服務方法上定義事務邊界,所有DAO方法都將參與同一事務。所以你的DAO保持特定於他們各自的模型,理論上更簡單。請記住,當任何DAO刷新會話時,所有更改都會被推送到數據庫。所以如果你有一個User和一個Profile模型,並且它們在hibernate中被恰當地映射,如果你創建了每個模型的實例並調用刷新會話,它們都將被保存。

這種方法很吸引人,因爲DAO應該做一件事 - 執行持久性操作。如果您開始製作複雜的DAO,您可能會將應用程序的業務需求封裝在持久層中,而您並不想這樣做。服務是訂購持久性操作以實現業務需求的地方。

Hibernate如何與MVC交互?請注意0​​有什麼重要方面?

MVC是一個範例。模型視圖控制器。目的是在您的應用程序中定義明確的關注點,以便單個組件可以專注於一件事情。例如,Model對象不應該告訴視圖如何呈現自己。 Hibernate是一個ORM持久性實現。 Hibernate代碼是保存模型對象的一種方法。 MVC和hibernate幾乎沒有關係,你可以在應用程序中使用MVC,在應用程序中使用Hibernate,或者在應用程序中使用Hibernate,而不使用MVC。

也許我不太瞭解它,什麼是分離的實體? 這些是我們從Hibernate上下文中取出來的 - 有效的 只是類的集合?

documentation「Detached - 分離的實例是一個持久對象,但其Session已關閉。」

分離的實例仍然可以稍後保存,但它們需要與會話重新關聯。

如果我要做沒有ORM框架的持久層,只是簡單地使用JDBC,我的問題是什麼?我聽說Hibernate有一些處理併發請求的智能 會話,那麼JDBC會怎麼樣呢? JDBC?

主要缺點是如果您的應用程序使用對象來表示實體,則需要將jdbc結果轉換爲對象。你還需要編寫sql。使用jdbc並不是一個壞主意。 ORM是一個選項。 JDBC是另一種選擇。你也可以混合搭配,但這可能很複雜。對您的應用程序的併發請求不應該成爲持久層的問題。只要確保你的DAO不保存任何狀態(即使用靜態變量),你應該沒問題。

業務邏輯位於何處?它是DAOimpl類嗎?

這是您的域模型和您的服務的組合。如前所述,如果您需要按順序保存內容,可以使用服務。如果您有一些要求某些字段應限制在某些值的要求,那可能在模型本身中。它不在DAO中 - 那些應該只是處理持久性。

+0

非常感謝您,我可以使用此對象將它作爲模型傳遞給視圖嗎?它只是一個實例嗎? Cat fritz =(Cat)sess.load(Cat.class,generatedId); – Aubergine

+0

@aubergine我不明白 – hvgotcodes

+0

:-)我只是問具體問題如何從Hibernate Session中檢索實體到一個簡單的類實例。 Cat fritz =(Cat)sess.load(Cat.class,generatedId);貓弗裏茨不是持久的,可以用於服務和作爲一個模型嗎?對不起:-) – Aubergine

1

我已經從我的spring/hibernate web應用程序中刪除了dao層 - 對我來說似乎沒有必要。實際上我無法想象他們現在會包含什麼。但這似乎是somewhatdebatable

爲了覆蓋equals和hashcode與休眠我一般使用數據庫生成的自動ID,這又有點debatable。只要您知道該ID僅在第一次保存到db後才存在,則不存在問題。

業務邏輯位於何處?

在您的域對象/休眠實體 - this小於controversial