我们有一个域,其中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实体,但是如果可能的话,我希望避免这种情况。
你可以combine JPA and jOOQ。 JPA / Hibernate非常适合编写数据:
SQL和jOOQ非常适合读取数据,尤其是当您想要超越SQL-92 JPA Dialect抽象时。使用本机查询(以及类型安全的jOOQ),您可以利用数据库提供的所有功能:
最后,您很可能需要JPA和本机查询,因此jOOQ是获取当前数据库的最佳选择,同时为您提供编译时安全保障。
有关更多详细信息,请查看this free chapter from High-Performance Java Persistence。
你可以映射数据库中没有1:1表示的类,它只是映射中的更多工作。如果你想要纯POJO,那么使用Hibernates xml映射。可以映射最复杂的数据库模式,并且已经有很多关于它们的问题。为每个类和相应的数据库表/视图/函数发布一个问题,我们将找到答案。