我有一个spring Boot 项目,它使用jpa与hibernate和spring数据来访问数据库。我有一个多对多的Map之间的产品和他们的位置(货架上)。产品实体具有货架的集合,反之亦然。我最初不需要将位置返回给客户端,所以我将@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)添加到产品实体中的位置字段。现在我需要发送它,所以我删除了write_only,并注意到我的端点变慢了(从75毫秒到450毫秒的加载时间)。考虑到优化的解决方案,我决定尝试用jooq提出类似的请求,它的速度快得多(~ 90 ms)。我使用了jooq和转换器的多集功能来获取一个新产品dto,它有一个位置集合。我发现这种方式做得很完美,我没有得到的问题,我与jpa的产品有地点,每个地点有产品和产品的地点无限。
下面是我使用的示例:jooq多路集和转换器
问题是,我不能100%确定在这个特定的端点上使用jooq,而在我的应用程序的其余部分继续使用jpa是可以的。我担心jooq获取的数据并不总是与jpa处理的数据一致,因为某些原因我不完全理解,但我认为这与刷新模式有关,从hibernate进行的更改不会自动发送到数据库。
下面是我找到的一篇关于如何在同一个应用程序jooq with hibernate中使用jooq和jpa的文章:解决方案是通过调用em.createNativeQuery来生成jooq查询
但这阻止了我使用强大的jooq转换器将查询结果直接Map到dto,即使是多集嵌套集合。
是否真的有必要对所有请求使用实体管理器来保持数据一致性?我想了解足够的jpa,这样这些问题的答案就会变得清晰。例如,在没有任何准备的情况下,在同一个应用程序中使用jdbc模板和jpa是否存在问题?
1条答案
按热度按时间2nbm6dog1#
问题是,我不能100%确定在这个特定的端点上使用jooq,而在我的应用程序的其余部分继续使用jpa是可以的。
完全没关系。
解决方案是通过调用
em.createNativeQuery()
来进行jooq查询没有必要使用
em.createNativeQuery()
。如果你真的想重用Hibernate正在使用的
Connection
/Transaction
,你可以使用Session.doWork()
或Session.doReturningWork()
。(您需要将EntityManager
转换为Session
。)但即使这样也是不必要的。关系数据库是指在分布式系统中同时为许多不同的客户端提供服务。您不应该通过一种特定的技术来强制访问数据库。
是否真的有必要对所有请求使用实体管理器来保持数据一致性?
不绝对不行。这将违背关系数据库所涉及的一切。* 当然 * Hibernate永远不会强迫你这么做。
例如,在没有任何准备的情况下,在同一个应用程序中使用jdbc模板和jpa是否存在问题?
绝对不是完全没问题。
只有一件事你需要小心:如果您在 * 单个工作单元 * 中一起使用JPA和直接JDBC,则需要确保工作发生在单个事务中。
我不是Spring用户,但我相信Spring会为您处理这个细节。