2013-02-06 80 views
0

好吧。我在這裏有點困惑...實體對象vs值對象 - 休眠和彈出

可以說我有一個叫User的班。

class User { 
    // all variables 
    // all getters and setters 
    } 

現在,我使用JSR 303的驗證和放@NotNull@Range,等這裏的變量。

我用它作爲Form/Command對象。意思是,當提交表單時,這些值將被驗證,並且BindingResult會給我提供錯誤。

  1. 這是否應該在Hibernate的實體對象中使用? (如果是這樣,我需要添加其他休眠註釋,如@Entity,@Id,@Column,等等在驗證註釋之上)
  2. 當我們從數據庫加載數據時,這些驗證是否也啓動了? (如果是的話,如果數據已經存在,並且不確認驗證是什麼?)
  3. 我們通常在哪裏寫業務驗證,例如國家是否存在於數據庫中,xyz值是否存在於不同的數據庫中桌子等?

的問題在這裏出現的還有: - 用戶的形式可能沒有存在於用戶類 的所有字段 - 數據庫表的用戶可以有更多的字段或超過用戶類 領域少 - 形式可以有場不同的對象,例如用戶和訂單。

我們如何處理這些?

試圖環繞它

+0

不,您不應該將您的實體對象暴露給表示層。您可以爲業務和表示層使用Spring驗證框架。你有不同於數據庫約束的驗證嗎? – user2033853

+0

@ user2033853那麼你是說我應該有兩個對象用於前端和另一個用於域/實體?我們如何命名它們?任何參考? –

+0

你可以看一下域驅動設計:http://en.wikipedia.org/wiki/Domain-driven_design – user2033853

回答

1
  1. 沒有我的腦海裏,你不應該混的實體對象和值對象。實體對象用於數據庫映射,值對象用於表示層。
  2. 爲了驗證對象annoted,你需要使用一個Validator(通常與DataBinder使用。Spring validation
  3. 它是DB的約束或後端驗證?

對於你最後的問題,這是你的表示層和持久層有2個不同的對象的原因之一。這種方式值對象可以匹配用戶(表單)顯示或輸入的內容。

+1

這是對「價值對象」的虛假使用,你必須考慮DTO。 –

+0

@NathanHughes任何提及你的建議? –

+0

@Kevin:http://en.wikipedia.org/wiki/Value_object。你也可以看到埃文斯的書籍域驅動設計。 –