【发布时间】:2016-11-02 17:16:02
【问题描述】:
使用 jpa 原生查询时
事务传播是我们正在使用的正确 JPA 的唯一功能吗?
在我看来,我就像使用普通的旧 jdbc pluc jpa 事务传播
所以没有持久化上下文的概念?
你能验证我的想法,并指出我的一些官方文档吗?
编辑:
使用返回实体的 SQL 查询需要注意的一点是 生成的实体实例由持久性管理 上下文,就像 JP QL 查询的结果一样。
我正在阅读 PRO JPA 这本书,并且根据我的理解
当我们使用 jpa 本机查询来获取一组标量值时(与我们使用 jdbc 的方式非常相似),实际上并没有托管实体和持久性上下文的概念。
当我们通过本机查询检索实体时,事情当然会发生变化。
【问题讨论】:
-
不确定您的确切意思。 JPA 规范将是您应该参考的内容,但是通过 EntityManager 上下文执行本机查询会为您提供与 JPQL 查询相同的东西 - 您可以访问原始数据或让 JPA 构建您的托管实体。如果您打算使用它来管理 JDBC 连接和执行 SQL 的语句,那么您将错过 JPA 的主要优势。
-
那么在 jpa 中使用原生查询,我们不是完全绕过了持久化上下文吗?
-
据我了解,我们确实...您能帮我理清这些想法吗?
-
正如书中所述,本机查询不会绕过上下文。如果你读入原始数据,这就是你得到的。但是,如果您有一个本机查询并告诉 JPA 从中构建一个实体 (em.createNativeQuery(sqlstring, entity.class)),它将返回托管实体 - 它跟踪任何更改并将这些更改与数据库。就像 JPQL 查询一样。您的问题非常广泛 - 为什么不专注于您具体要寻找和要做的事情?