【发布时间】:2017-10-11 08:49:52
【问题描述】:
我知道这是一个常见问题,但我还没有找到另一个可以解决我疑惑的问题。
通常,如果项目很小,我会在表示域对象的同一对象中添加持久性注释。这允许从数据库加载实体并保持所有设置器私有,确保任何实例始终处于有效状态。比如:
@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 */
}
}
如果我想拥有不同的持久模型,就会出现我的问题。然后我会有类似的东西:
/* 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 */
}
我的问题是,如何在不暴露 SomeEntity 属性的情况下将 SomeEntityDAO 映射到 SomeEntity?
如果我创建一个类似 public SomeEntity(String attribute1, String attribute2, ...) {} 的构造函数,那么任何人都可以创建 SomeEntity 的无效实例。如果我在 SomeEntity 中公开所有设置器,也会发生同样的情况。
我也不认为使用updateAttributes() 构建对象是一个有效的解决方案,因为这将执行一些我此时不想执行的验证(我们信任数据库中持久化的数据)。
我正在考虑保护所有设置器,因此 DAO 可以扩展实体并可以访问设置器...但我不确定这是否是一个好的选择。
解决此问题的最佳或常用方法是什么?
【问题讨论】:
-
您想要一个允许没有设置器或具有私有设置器的实体类的 ORM?
-
我的意思是域模型类没有暴露公共设置器。只公开行为方法。吸气剂很好。并且 ORM 类可以有 getter 和 getter。
标签: java oop domain-driven-design persistence ddd-repositories