使用多个persistenceUnit播放框架2 + JPA

时间:2013-05-17 14:43:47

标签: jpa playframework-2.0 persistence.xml

我正在努力使用Play和JPA,以便能够使用与两个不同的持久性单元相关联的两个不同的javax.persistence.Entity模型(需要能够连接到不同的数据库 - 例如Oracle和MySQL分贝)。

问题来自于Transaction,它始终绑定到默认的JPA persitenceUnit(请参阅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();
    }
}

此解决方案似乎并非真正“干净”。我想知道您是否知道更好的方法来避免手动修改所使用的交易。

为此,我在git上创建了一个repo,其中包含一个工作示例应用程序,它显示了我如何配置项目。

https://github.com/cm0s/play2-jpa-multiple-persistenceunit

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题。有太多建议涉及PersistenceUnit注释或getJPAConfig。但是他们似乎都没有在游戏框架中工作 我发现了一种在我的项目中运作良好的方法。也许你可以尝试一下。
playframework2 how to open multi-datasource configuration with jpa
gud luk!