2 つの異なる永続化ユニットに関連付けられた 2 つの異なる javax.persistence.Entity モデルを使用できるようにするために、Play と JPA に苦労しています (たとえば、Oracle と MySQL db などの異なる DB に接続できるようにする必要があります)。
この問題は、常にデフォルトの JPA persitenceUnit にバインドされているトランザクションに起因します (jpa.default オプションを参照)。
永続性を手動で定義するために私が見つけた解決策を示す 2 つのコントローラー アクションを次に示します。
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
ご協力ありがとうございました