jpa - DDD、JPA 和非默认构造函数
问题描述
DDD 说您的领域模型需要具有表现力并说出他们需要什么。考虑到这一点,我创建了以下类:
@Entity
public class User{
@Id
@GeneratedValue
private Long id;
private String userName;
private String password;
public User(String userName, String password) {
/**set the values*/
}
/** Validations, getters and business methods*/
通过这个构造函数,我告诉我们构建一个新的 User 对象所需的最小值。
这种方法的问题在于 JPA 需要一个无参数的默认构造函数来通过反射来实例化类。在这种情况下,我必须忘记 DDD 的建议还是有解决方法?
解决方案
在您的特定情况下,您可以将非参数构造函数设为私有。但是很快另一个 JPA 要求将迫使您做出另一个解决方法;
voiceofunreason 给了你正确的答案。正确的方法是在基础设施/持久层中有一个适配器来接收您的域对象,然后将其转换为 JPA 贫血模型,反之亦然。
其他一些更适合没有太多转换的选项:
1 - Spring Data JDBC 正在尝试吸收聚合概念
- https://www.youtube.com/watch?v=GOSW911Ox6s&t=3s;
- https://docs.spring.io/spring-data/jdbc/docs/1.1.7.RELEASE/reference/html/#reference
2 - 将您的聚合作为 json 保存在关系数据库中。Vaughn Vernon 提出了一个实现 -> https://kalele.io/the-ideal-domain-driven-design-aggregate-store/
3 - 面向文档的数据库,例如https://www.mongodb.com/等等......
推荐阅读
- webpack - 在 Webpack 中使用 Babel Loader 时如何设置 Babel 环境变量(BABEL_ENV)?
- python - 高效地将自定义函数应用于 Pandas 中的组
- java - 最佳实践:基于java的微服务日志管理,运行在k8s上
- azure - 在部署时触发 Azure 中的 webhook?
- javascript - 访问对自己类中的类的引用
- php - 如何测试 Callable 参数是否会返回带有反射的字符串?
- erlang - Task.start Elixir 中的奇怪行为
- javascript - 创建设计文档后如何建立云索引?
- mysql - 根据某些其他行标准对排序日期进行编号
- sql-server - SELECT 查询与 SELECTS 的子查询一起工作正常,但是当 DELETE 应用于同一个子查询时,它不起作用