我知道這是一個常見問題,但我還沒有找到另一個解決我的疑惑。永久模型到域模型映射而不暴露域對象屬性
通常,如果項目很小,我會在表示域對象的同一個對象中使用持久性註釋。這允許從數據庫加載實體並使所有設置器保持私密,確保任何實例始終處於有效狀態。就像:
@Entity
class SomeEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
// ... other attributes
protected SomeEntity() {}
/* Public getters */
public Long getId() { ... }
public String getAttribute1() { ... }
public String getAttribute2() { ... }
/* Expose some behaviour */
public void updateAttributes(String attribute1, String attribute2) {
/* do some validations before updating */
}
}
我的問題出現,如果我想hava不同的持久性模型。然後我會碰到這樣的:
/* SomeEntity without persistent info */
class SomeEntity {
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
// ... other attributes
protected SomeEntity() {}
/* Public getters */
public Long getId() { ... }
public String getAttribute1() { ... }
public String getAttribute2() { ... }
/* Expose some behaviour */
public void updateAttributes(String attribute1, String attribute2) {
/* do some validations before updating */
}
}
和DAO:
@Entity
class SomeEntityDAO {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
public SomeEntityDAO() {}
/* All getters and setters */
}
我的問題是,我怎麼能映射到SomeEntityDAO不SomeEntity暴露SomeEntity的屬性?
如果我創建了一個構造函數,例如:public SomeEntity(String attribute1, String attribute2, ...) {}
,那麼任何人都可以創建SomeEntity的無效實例。如果我在SomeEntity中公開所有setter,則會發生同樣的情況。
我也不認爲是一個有效的解決方案使用updateAttributes()
構建對象,因爲這將執行一些驗證我不想在此時執行(我們相信存在於數據庫中的數據)。
我在考慮讓所有的setter受到保護,所以DAO可以擴展實體並有權訪問setters ......但我不確定這是否是一個好選擇。
哪種解決此問題的最佳或常用方法?
你想要一個ORM,它允許沒有setter或有私人setter的實體類? –
我指的是域模型類而不暴露公共設置者。只公開行爲方法。吸氣者很好。 ORM類可以有getter和getters。 –