0

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

ご協力ありがとうございました

4

1 に答える 1

1

私も同じ問題に遭遇しました。PersistenceUnit注釈やに関するアドバイスが多すぎgetJPAConfigます。しかし、どちらもプレイフレームワークでは機能しないようです。
私のプロジェクトでうまく機能する方法を見つけました。多分あなたはそれを試すことができます。
playframework2 jpaでマルチデータソース設定を開く方法
gud luk!

于 2013-12-09T08:18:15.277 に答える