Play JPA EntityManager如何工作?

时间:2015-08-25 12:36:47

标签: playframework playframework-2.0

我正在学习Play Framework,最近我尝试将JPA与Play集成,构建了一个简单的CRUD,但我有几个问题。 以下是我们在JPA中遵循的一些持久性操作的步骤。

@Transactional(readOnly = true)
public Result getPersons() {
    CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
    CriteriaQuery<User> cq = cb.createQuery(User.class);
    Root<User> root = cq.from(User.class);
    CriteriaQuery<User> all = cq.select(root);
    TypedQuery<User> allQuery = JPA.em().createQuery(all);
    JsonNode jsonNodes = toJson(allQuery.getResultList());
    return ok(jsonNodes);
}

请考虑以下代码段

 if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
             // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                      // landscape
        }

如上面的代码片段所示,我刚刚使用了JPA.em(),仅此而已。 我的问题是这是否会处理上述所有7个步骤,例如从connectionFactory获取连接,开始事务,提交和关闭连接等。

是这么简单,只是JPA.em()?请解释这是如何工作的?需要更多编码才能关闭连接,这样它就不会跨越数据源中配置的最大连接数,因为连接没有像上面的代码片段那样正确关闭。

1 个答案:

答案 0 :(得分:6)

您在示例中指定了更多JPA.em()。您还可以使用指定事务的@Transactional注释:使用它来启动事务,并使用块的结尾提交事务。另外,您可以在应用的application.confconf/META-INF/persistence.xml中配置JPA。因此,Play拥有它所需的一切:

  1. 创建EntityManager Factory:在启动时通过Play Framework完成
  2. 创建EntityManager:由Play框架处理
  3. 开始交易:通过@Transactional注释或JPA.em()处理.withTransaction
  4. 持久数据:通过持久性(myEntity)或合并(myEntity)完成
  5. 提交事务:通过@Transactional注释或JPA.em()处理.withTransaction
  6. 关闭EntityManager:由Play框架处理
  7. 关闭EntityManagerFactory:在关机期间由Play Framework完成