【发布时间】:2016-10-09 19:12:22
【问题描述】:
我正在使用 spring-data 在 Java 和 Spring4 中编写一个简单的 CRUD 应用程序,我想看看我是否可以尽可能地保持域的纯净/干净,并且我正在考虑我的一些想法/想法可以实现这一目标。
我用父 pom 和一些子模块构建了项目,如下所示:
parent pom
|- domain
|
|- persistence
| |- api
| |- impl
|
|- service
| |- api
| |- impl
|
|- rest
在持久化 api 模块中,我有与用于持久化/检索域类的方法的接口。例如:
public interface GiftPersistence() {
Gift saveOrUpdateGift(Gift gift);
/* other methods ... */
}
重要的是,这些方法不是存储库方法。此模块中的方法是由服务模块实现调用的方法。
persistence impl 模块具有特定于我正在使用的数据库的接口实现(今天是 mongo,但可以是 oracle 或 ms-sql 或其他任何东西)。这是我拥有数据库供应商特定的存储库接口的地方。
在域模块中,我有我的域类,但我不想在任何以数据库为中心的东西中建模。例如:
public final class Gift {
private String description;
private boolean claimed;
private String claimedBy;
/* getters & setters etc ... */
}
我不想为特定于数据库的事物建模的原因是:
- 持久性与域无关
- 不同的数据库供应商可能使用不同的 id 策略/数据类型,我不想将我的域代码耦合到任何数据库供应商
- 我可能想将域模块导入到另一个项目的 pom 中,而该项目可能不会对数据库做任何事情
我过去参与过一个类似的项目(老实说,这就是我的灵感来源!),但我无法再访问该项目,所以不能不要用它来表达想法。
话虽如此,我隐约记得它对 jackson mixins 做了一些事情(尽管这可能是一个类似的想法/概念,但更接近于 web 关注而不是 db 关注)。
我考虑过的另一种方法是使用方面,但不确定我将如何/在哪里进行。
因此,非常感谢任何关于我如何实现保持我的域不受数据库问题影响的目标的想法或想法。
根据我刚刚发现的新想法进行了编辑
这是一个有趣的想法 - https://github.com/CK35/example-ddd-with-spring-data-jpa
这个想法是域模块将域类建模为接口,具体实现(在我的例子中)在持久性实现模块中。通过这种方式,它们可以使用域关注点进行注释,包括 id 等附加属性。
这感觉像是一个不错的选择,因为它意味着域是干净的(尽管不是具体的实现),并且我们可以有不同的持久化 API 模块实现,其中域类的实现具有通用 jpa 注释或 mongo 注释,或甲骨文...
还有其他想法吗?
【问题讨论】:
-
考虑使用JPA/Spring-Data-JPA?它可以为您处理大多数常见的数据库供应商,如果 JPA 未设置为扫描它们,注释将被安全地忽略(我相信)。
-
感谢@CollinD,但是(如果我理解正确的话),这正是我想要避免的。如果我使用注释,则意味着我需要将 id 的属性添加到域类(这与域无关),并且我还需要通过导入 jpa 类来污染域模块。跨度>
标签: java database spring spring-data