0

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

问题来自始终绑定到默认 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 上创建了一个带有工作示例应用程序的存储库,该示例应用程序显示了我如何配置项目。

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

谢谢您的帮助

4

1 回答 1

1

i met the same problem, too. too many advices are about PersistenceUnit annotation or getJPAConfig. but both them seem not work in play framework.
i found out a method which works well in my projects. maybe you can try it.
playframework2 how to open multi-datasource configuration with jpa
gud luk!

于 2013-12-09T08:18:15.277 回答