8

我们有一个域,其中 90% 的类非常简单,可以在数据库中轻松地 1:1 映射。我很高兴 Hibernate 与 spring-data-jpa 相结合如何为这些类消除了大量的琐事。

然而,该域的其余部分具有挑战性,出于多种原因,我不想直接将其映射到数据库表。

我做了实验来引入由 Hibernate 管理的中间 bean,并将这些 bean 映射到我的域,当所有关系都从具有挑战性的部分到容易的部分时,这很有效。当我有由 Hibernate 管理的“简单”类引用在自定义 Java 代码中映射的“具有挑战性”类而不是直接由休眠管理时,这种方法会失败。

这时我意识到我无法自定义 Hibernate 并插入某种允许我即时进行此类转换的 ObjectFactory。

- 编辑 -

我的问题是什么:在使用 JPA 时,让实体中的数据库关注为零的 DDD 样式域层的最简单方法是什么?在 DDD 中,所有数据库问题都由通常与 DAO 协作的存储库处理。

实体中的零 DB 关注意味着域类中没有 JPA 注释或映射配置。一种方法是让 JPA(或其他持久性技术)管理映射到域实体的 TO。但是,如果我采用这条路线,则我必须拥有所有实体,即使是最简单的实体(想想地址)也必须通过映射层。

我想为琐碎的实体使用像 JPA 这样的“懒惰”的东西,并能够将它们与“手动”管理的其他实体混合使用。目前我不知道允许我从 JPA 托管实体链接到非 JPA 托管实体的聪明解决方案。我总是可以检索 JPA 实体,然后通过第二次调用检索非 JPA 实体,但如果可能的话,我想避免这种情况。

4

2 回答 2

8

您可以结合 JPA 和 jOOQ。JPA/Hibernate 非常适合写入数据:

  • 所有实体列都包含在 INSERT/UPDATE 中,因此您不必在添加新列时更改保存例程
  • 广泛支持隐式/显式乐观/悲观锁定
  • 支持优化的标识符生成器(pooled-lo 优化器)
  • 事务性后写缓存以减少锁争用(即使在 MVCC DB 中)
  • JDBC 获取只是一种配置

SQL 和 jOOQ 非常适合读取数据,尤其是当您想要超越 SQL-92 JPA 方言抽象时。使用本机查询(和类型安全的 jOOQ),您可以利用数据库必须提供的每个功能:

  • 窗口函数
  • 派生表
  • 公用表表达式和递归查询
  • 合并
  • 批量插入/更新

最后,您很可能同时需要 JPA 和本机查询,因此 jOOQ 是一个很好的选择,可以充分利用您当前的数据库,同时为您提供编译时安全保证。

于 2015-02-15T22:40:05.223 回答
0

您可以映射数据库中没有 1:1 表示的类,这只是映射中的更多工作。如果您想要纯 POJO 则使用 Hibernates xml 映射。可以映射大多数复杂的数据库模式,并且对于它们来说已经有很多关于 SO 的问题。为每个类和相应的数据库表/视图/函数发布一个问题,我们会找到答案。

于 2012-11-28T07:53:15.987 回答