我正在努力使用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
感谢您的帮助
答案 0 :(得分:1)
我也遇到了同样的问题。有太多建议涉及PersistenceUnit
注释或getJPAConfig
。但是他们似乎都没有在游戏框架中工作
我发现了一种在我的项目中运作良好的方法。也许你可以尝试一下。
playframework2 how to open multi-datasource configuration with jpa
gud luk!