JPA 只创建一次查询
JPA create query only once
首先,抱歉,如果我问的是显而易见的问题,或者这个问题本质上是愚蠢的。
更多的学术问题需要知道我是否可以创建一个跨 EntityManager
或独立于 EntityManager
的 JPA 查询(命名或其他)。基本上,准备一次运行总是。我知道我们只能从实体管理器对象的 createXXXQuery
方法中获取一个 Query 实例,但是还有其他方法吗?
这就是我想要做的,
public class MyRepo {
@PersistenceContext
private EntityManager em;
private Query aQueryIntentedtoBePreparedOnlyOnce;
@PostConstruct
public void prepareMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce = em.createQuery("...."); // Query with positional params
}
public void executeMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce.getResultList();
}
}
这是第一次完美执行。但是,它第二次说 "Entity Manager Closed." 我明白这是因为 EM 是事务范围的。
这个 EM 是容器管理的(JTA - Spring),所以我不能跨事务扩展它。而且,使用会话 bean 不是一种选择。那么,有没有办法只创建一次此查询?
PS : 命名查询和查询缓存从何而来?对于命名查询,我似乎仍然每次都做 createNamedQuery
。什么是查询缓存计划,有什么好的文档吗?
还有一个问题,为什么只在 EM 或 Connection(JDBC) 上创建查询?为了准备查询,我不需要知道我正在与哪个数据库通话吗?就是这样一个人永远不会在没有适当连接的情况下执行一个?
每个查询对象都绑定到一个特定的 EntityManager,不能在另一个中重复使用,就像每个 EntityManager 都绑定到一个 JDBC 连接一样。
命名查询是一种缓存已编译查询和有关它们的有用元数据的方法。通常,当您使用 em.createQuery
时,它每次都会解析它。它可能会在缓存中保留一些关于它的信息,因为它很可能再次遇到相同的查询,但这不是必需的。
通过调用 createStatement
(返回 Statement
)、prepareStatement
(返回继承前一个的 PreparedStatement
)或 prepareCall
创建查询(在 JDBC 连接上返回继承前两个的 CallableStatement
。这些 Statement 对象没有切换到另一个连接的接口。根据驱动程序的不同,它们可能缓存在 Java 应用程序或服务器上。语句可以在同一连接上重复使用任意多次,但不能在其他连接上重复使用。
首先,抱歉,如果我问的是显而易见的问题,或者这个问题本质上是愚蠢的。
更多的学术问题需要知道我是否可以创建一个跨 EntityManager
或独立于 EntityManager
的 JPA 查询(命名或其他)。基本上,准备一次运行总是。我知道我们只能从实体管理器对象的 createXXXQuery
方法中获取一个 Query 实例,但是还有其他方法吗?
这就是我想要做的,
public class MyRepo {
@PersistenceContext
private EntityManager em;
private Query aQueryIntentedtoBePreparedOnlyOnce;
@PostConstruct
public void prepareMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce = em.createQuery("...."); // Query with positional params
}
public void executeMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce.getResultList();
}
}
这是第一次完美执行。但是,它第二次说 "Entity Manager Closed." 我明白这是因为 EM 是事务范围的。
这个 EM 是容器管理的(JTA - Spring),所以我不能跨事务扩展它。而且,使用会话 bean 不是一种选择。那么,有没有办法只创建一次此查询?
PS : 命名查询和查询缓存从何而来?对于命名查询,我似乎仍然每次都做 createNamedQuery
。什么是查询缓存计划,有什么好的文档吗?
还有一个问题,为什么只在 EM 或 Connection(JDBC) 上创建查询?为了准备查询,我不需要知道我正在与哪个数据库通话吗?就是这样一个人永远不会在没有适当连接的情况下执行一个?
每个查询对象都绑定到一个特定的 EntityManager,不能在另一个中重复使用,就像每个 EntityManager 都绑定到一个 JDBC 连接一样。
命名查询是一种缓存已编译查询和有关它们的有用元数据的方法。通常,当您使用 em.createQuery
时,它每次都会解析它。它可能会在缓存中保留一些关于它的信息,因为它很可能再次遇到相同的查询,但这不是必需的。
通过调用 createStatement
(返回 Statement
)、prepareStatement
(返回继承前一个的 PreparedStatement
)或 prepareCall
创建查询(在 JDBC 连接上返回继承前两个的 CallableStatement
。这些 Statement 对象没有切换到另一个连接的接口。根据驱动程序的不同,它们可能缓存在 Java 应用程序或服务器上。语句可以在同一连接上重复使用任意多次,但不能在其他连接上重复使用。