【问题标题】:Play Framework JPA EntityManager Best PracticePlay Framework JPA EntityManager 最佳实践
【发布时间】:2014-03-26 18:52:14
【问题描述】:

这是一个与最佳做法相关的问题。我正在使用带有 JPA 的 Play Framework 2.2.1 来实现 ORM 持久性。 Play 提供了很多“帮助”方法和类,特别是我发现的是 JPA.em() 方法。但是,当我尝试在公共静态方法中使用此方法获取 EntityManager 对象时,出现以下错误:

RuntimeException: No EntityManager bound to this thread. Try to annotate your action method with @play.db.jpa.Transactional

由于我是从静态方法调用 JPA.em(),我想上述错误是有道理的。我的问题是,创建 EntityManager 对象的最佳实践是什么?通过在静态方法中执行类似这样的操作来创建 em 对象是否是一项昂贵的操作,该静态方法将在应用程序的整个生命周期中被多次调用:

EntityManager em = Persistence.createEntityManagerFactory("DefaultDS").createEntityManager();

或者我应该创建一个对 EntityManagerFactory 的公共静态引用并在静态方法中执行类似的操作:

EntityManager em = staticEntityFactory.createEntityManager();

或者我应该在实体中创建一个 em 对象并让每个实体都像这样维护对 em 对象的引用?

@Entity
public class myEntity {
   private static EntityManager em = Persistence.createEntityManagerFactory("DefaultDS").createEntityManager();
}

我们将不胜感激有关处理此问题的最佳方法的一些指导,谢谢!

【问题讨论】:

    标签: hibernate jpa orm playframework playframework-2.0


    【解决方案1】:

    我还在努力了解 Play 的各个方面,因此我无法真正指导您了解最佳做法 但我认为正如您提到的错误,您必须将 @Transactionnal 添加到您的控制器方法中,从您的实体调用静态 JPA 方法并在您的实体的这些静态方法中使用 JPA.em() 方法。

    类似:

    @Entity
    public class Account {
        ....
        public static Account getAccount(Long id) {
            return JPA.em().find(Account.class, id);
        }
    }
    

    在你的控制器中:

    public class AccountService extends Controller{
    
    @Transactional(readOnly = true)
    public static Result getAccount(Long id){
        Account account = Account.getAccount(id);
    
        return ok(Json.toJson(account));
    }
    }
    

    【讨论】:

    • 是的,你完全正确。通过使用 @Transactional 注释控制器,它为实体方法和静态方法修复了它。谢谢你的好榜样!希望这对其他人也有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2011-06-25
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多