从域类中抽象db id的策略

时间:2016-10-09 19:12:22

标签: java database spring spring-data

我正在使用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 ... */
}

重要的是,这些方法是存储库方法。此模块中的方法是由服务模块实现调用的方法。

持久性impl模块有一个特定于我使用的数据库的接口实现(它今天是mongo,但可能是oracle或ms-sql,或其他任何东西)。这是我拥有特定于数据库供应商的存储库接口的地方。

在域模块中,我有我的域类,但我不想在任何以数据库为中心的模型中建模。例如:

public final class Gift {

    private String description;

    private boolean claimed;

    private String claimedBy;

    /* getters & setters etc ... */
}

我不想为数据库特定事物建模的原因是:

  • 持久性不是域的关注
  • 不同的数据库供应商可能使用不同的ID策略/数据类型,我不想将我的域代码耦合到任何数据库供应商
  • 我可能想将域模块导入到另一个项目的pom中,该项目可能无法对数据库执行任何操作

我过去曾参与过一个类似的项目(说实话,那是我从中得到了这个想法的!),但我不知道。我们不再能够访问该项目,因此无法用它来创造想法 话虽如此,我依旧记得它与杰克逊mixins做了一些事情(虽然这可能是一个类似的想法/概念,但更接近网络关注而不是数据库关注)。 我所考虑的另一种方法是使用方面,但不确定我是如何/在哪里进行的。

因此,非常感谢任何有关如何实现保持域名清理数据库问题的目标的想法或想法。

我刚刚找到新想法编辑
这是一个有趣的想法 - https://github.com/CK35/example-ddd-with-spring-data-jpa
我们的想法是域模块将域类建模为接口,具体实现(在我的例子中)是persistence-impl模块。通过这种方式,可以使用域关注来注释它们,包括其他属性,例如id 这感觉就像一个不错的选择,因为它意味着域是干净的(尽管不是具体实现),并且我们可以有persistence-api模块的不同实现,其中域类的实现具有通用jpa注释或mongo注释,或者oracle ......

还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

如果你想要你可以使用一个界面,虽然你可能会发现你只有一个这个界面的实现,从而破坏了界面的整个目的。注释本身就是很多接口。因此,带注释的类将大致相同。

我不确定为什么你认为拥有一个ID字段意味着该类将依赖于数据库。 spring的整个设计意图是不使它与你想要的任何持久性技术接口,因此你可以使用hibernate或其他任何持久性。如果你确实使用了hibernate,你可以在xml中配置你的持久化类,所以你不会在你的域对象中看到任何持久性的东西......除了ID当然,虽然我不认为这是一个问题,如果它是一个很大的问题,你可以从一个具有私有id字段的基类扩展,但你可能不喜欢它。

当您使用持久性问题注释域对象时,对于不想了解持久性的其他客户端代码不会有任何问题。如果他们使用反射或疯狂的东西来阅读注释,他们将只能看到它。

恕我直言将所有服务,daos,entites以及所有这些内容整合到接口中,然后只有一个实现是矫枉过正,虽然我知道有些人会不同意。但我相信这仍然是代码味道,因为在当天结束时你只有一个实现的接口。假设您稍后将有多个实现,它将花费10秒钟将其更改为具有1个实现的接口,并在eclipse中进行重构。只需将实现代码复制到某处,提取界面,将当前类更改为提取的界面,然后将复制代码放回项目中,顶部为InterfaceImp extends Foo。完成。不需要在开始时过度使用它来维护一些ghost接口。