JPA/Hibernate可以与其他持久性框架(如jOOQ)结合使用

gda*_*nov 7 java orm hibernate jpa jooq

我们有一个域,其中90%的类非常简单,并且可以在数据库中轻松地以1:1进行映射.我非常高兴Hibernate如何结合spring-data-jpa为这些类消除了大量的杂务.

然而,域的其余部分具有挑战性,并且出于多种原因我不想直接将其映射到DB表.

我做了实验来介绍由Hibernate管理的中间bean,并将这些bean映射到我的域,当所有关系从挑战到简单部分时,这都很有效.当我拥有Hibernate管理的"简单"类时,这种方法失败,它引用了在自定义Java代码中映射的"挑战"类,而不是直接管理hibernate.

这是当我意识到我找不到自定义Hibernate和插入某种ObjectFactory的方法时,它允许我在运行中进行这样的转换.

- 编辑 -

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

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

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

Vla*_*cea 8

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

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

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

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

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


Fir*_*iro 0

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