播放框架2+;具有多个persistenceUnit的JPA

播放框架2+;具有多个persistenceUnit的JPA,jpa,playframework-2.0,persistence.xml,Jpa,Playframework 2.0,Persistence.xml,为了能够使用两个不同的javax.persistence.Entity模型关联到两个不同的持久化单元(需要能够连接到不同的数据库,例如Oracle和MySQL数据库),我正在努力使用Play和JPA 问题来自始终绑定到默认JPA单元的事务(请参阅JPA.default选项) 下面是两个控制器操作,它们显示了我找到的手动定义持久性的解决方案: 包装控制器 import models.Company; import models.User; import play.db.jpa.JPA; impor

为了能够使用两个不同的javax.persistence.Entity模型关联到两个不同的持久化单元(需要能够连接到不同的数据库,例如Oracle和MySQL数据库),我正在努力使用Play和JPA

问题来自始终绑定到默认JPA单元的事务(请参阅JPA.default选项)

下面是两个控制器操作,它们显示了我找到的手动定义持久性的解决方案: 包装控制器

import models.Company;
import models.User;
import play.db.jpa.JPA;
import play.db.jpa.Transactional;
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {
    //This method run with the otherPersistenceUnit
    @Transactional(value="other")
    public static Result test1() {
        JPA.em().persist(new Company("MyCompany"));

        //Transaction is run with the "defaultPersistenceUnit"
        JPA.withTransaction(new play.libs.F.Callback0() {
            @Override
            public void invoke() throws Throwable {
                JPA.em().persist(new User("Bobby"));
            }
        }); 
        return ok();
    }


    //This action run with the otherPersistenceUnit
    @Transactional
    public static Result test2() {
        JPA.em().persist(new User("Ryan"));

        try {
            JPA.withTransaction("other", false, new play.libs.F.Function0<Void>() {
                public Void apply() throws Throwable {
                    JPA.em().persist(new Company("YourCompany"));
                    return null;
                }
            });
        } catch (Throwable throwable) {
            throw new RuntimeException(throwable);
        }
        return ok();
    }
}
导入模型。公司;
导入模型。用户;
导入play.db.jpa.jpa;
导入play.db.jpa.Transactional;
导入play.mvc.Controller;
导入play.mvc.Result;
公共类应用程序扩展控制器{
//此方法与otherPersistenceUnit一起运行
@交易(value=“其他”)
公共静态结果test1(){
JPA.em().persist(新公司(“MyCompany”);
//事务使用“defaultPersistenceUnit”运行
JPA.withTransaction(new play.libs.F.Callback0(){
@凌驾
public void invoke()抛出可丢弃的{
JPA.em().persist(新用户(“Bobby”);
}
}); 
返回ok();
}
//此操作与otherPersistenceUnit一起运行
@交易的
公共静态结果test2(){
JPA.em().persist(新用户(“Ryan”);
试一试{
JPA.withTransaction(“其他”,false,new play.libs.F.Function0(){
public Void apply()可丢弃{
JPA.em().persist(新公司(“贵公司”);
返回null;
}
});
}捕捉(可抛可抛){
抛出新的RuntimeException(throwable);
}
返回ok();
}
}
这个解决方案似乎不是真正的“干净”。我想知道您是否知道避免手动修改所用事务的更好方法

为此,我使用一个示例应用程序在git上创建了一个repo,该示例应用程序显示了我是如何配置项目的


谢谢你的帮助

我也遇到了同样的问题。关于
PersistenceUnit
注释或
getJPAConfig
的建议太多了。但这两种方法似乎都不适用于游戏框架。
我找到了一种在我的项目中效果很好的方法。也许你可以试试。


古德鲁

您是对的,我还发现了一个使用JPA.em(“dbSource”)的解决方案。然而,解决方案并不完美。默认的Play JPA Helper实现不能同时打开多个entityManager。我必须添加一些复杂的代码才能切换entityManager的源代码。