2012-01-24 40 views
8

我對我的DAO類使用Spring MVC和Hibernatedaosupport。這裏困惑從哪裏開始事務,無論它應該在服務層還是DAO層?在DAO,服務層架構中使用Spring MVC與Hibernate的正確方法是什麼

我的觀點與服務層交互。 DAO被注入服務。

在DAO服務層體系結構中使用Spring MVC與Hibernate的正確方法是什麼?

+0

ü可以解釋我說清楚... –

+0

@JustinThomas這就像有幫助的,但不同的。 –

回答

20

恕我直言,交易應該去服務層。通常,一個業務事務包含多個查詢和更新。如果僅在DAO層上放置@Transactional,則每個查詢和更新都將在單獨的事務中運行,這有效地破壞了事務的目的。

但是如果服務是@Transactional,則每個數據庫交互都會加入一個在web層進入服務層時啓動的主事務。請注意,在這種情況下,如果Web層運行多個服務方法,它們中的每一個都將在單獨的事務中運行(同一個問題將向上移動一級)。但是將@Transactional放置在Web層中可能會引入意想不到的副作用,例如N + 1問題,否則將會發生此問題。因此,儘量保持一個業務事務在一個從Web層調用的服務方法中。

+0

grr打我吧.... + 1 – hvgotcodes

+0

同樣,dagnabbit! –

+0

Tomasz總是打我... +1 – aweigold

0

很明顯是DAO層。任何連接到數據訪問層的應該在DAO層中,並且(最好)用@Repository註釋並且你的服務(用@Service註釋)應該有一個DAO實例的句柄。

一個服務可以調用多個DAO,但不是相反。 DAOs 應該是原子性的。

如果你開始交易,那麼它應該是在我看來,支持我以前的發言,我提的DAO應該是原子性的服務層。

+0

但如果我開始在DAO層交易,我得到兩個會話打開異常或沒有會話綁定... becoz在服務層如果我打電話兩種方法這兩種方法正在使用不同的會話正確.. 那麼如何解決這個問題.. –

+1

爲什麼?這需要嵌套事務處理任何通過多個DAO的事務。 –

+0

負面ghostrider,@tomasz答案是正確的...... – hvgotcodes

相關問題