假设我有一个EntityManager
对象em
,我有以下伪代码:
@PersistenceContext(unitName = "myPU")
private EntityManager em;
public void runQuery()
{
for(int i=0; i<100; i++)
{ Query q = em.createNativeQuery(someQuery);
List list = q.getResultList();
//process result
...
...
}
}
entityManager如何管理底层数据库连接?以上代码只有1个连接会话或100个会话吗?
我要问的是,对于每个连接会话,我需要在运行查询之前创建临时表。我想做的是这样的事情:
for(int i=0; i<100; i++)
{ //first check if temp table does not exist
createTemptTable;
// then run the query
Query q = em.createNativeQuery(someQuery);
List list = q.getResultList();
//process result
...
...
}
但我怎么能确定它会在同一会话中创建表并运行查询?
答案 0 :(得分:1)
注入的EntityManager与数据库有一个连接,该连接取自容器管理的连接池。因此,上述代码中的所有查询都将在与数据库相同的连接上运行。
答案 1 :(得分:1)
在Java EE中,在SessionBean中,持久性上下文由Java EE容器管理。注入的EntityManager通常是保存真实JPA EntityManager的代理。在每个JTA事务边界中,代理将释放其JPA EntityManager并获取一个新的(或至少clear()它)。在事务之外,容器可以为每个操作获取一个新的EntityManager,或者可以保存一个(这在规范中没有很好地定义,但是假设它是每个请求的新实体)。
受JTA管理的JPA EntityManager将在JTA事务期间使用相同的JDBC /数据库连接。因此,只要您的方法处于JTA事务中,您的代码就会具有相同的连接。通常,SessionBean方法默认是事务性的,因此每个方法都应该在自己的事务中,除非您对它进行了不同的配置。
请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Runtime#Java_Enterprise_Edition