2017-03-01 75 views
0

私はJPAモードでHibernateを使って純粋なJavaアプリケーションを開発しています。persistence.xmlで複数の設定をサポートする方法は?

  • がクラスタグを使用して
  • リストのすべての使用entites
  • は、すべての上のスキーマの自動作成などの他のオプションを定義するデータベースへのアクセスの資格情報が含まれています。ファイルのpersistence.xmlは、単一の永続性ユニットが含まれていますアプリケーションの開始

私たちはアプリケーションをリリースしました。テストモード、開発モード、本番モードの設定が必要です。彼らは明らかに異なるデータベースアクセスの資格情報と自動更新オプションを持っています。

私は考えることができる唯一の可能性が私の唯一の欠点を持っている:

  1. は、複数のpersistence.xmlをお持ちですか?エンティティクラスがパーシスタンスユニットの中で宣言されているので、悪い考えです。私は3つのpersistence.xmlファイルでそれらを維持する必要があります
  2. 1つのpersistence.xmlに複数の永続ユニットがありますか?私はすべてのエンティティクラスタグをそれぞれにコピーしなければならないので、また悪い考えです。

どうすればいいですか?

答えて

0

あなたがアプリケーションの環境を検出する方法を持っていれば、さまざまなプロパティで起動できます。代わりに、呼び出し元の :プロパティは、環境に応じて、入力されます

Persistence.createEntityManagerFactory("our.unit"); 

使用

Map<String, Object> props = new TreeMap<>(); 
Persistence.createEntityManagerFactory("our.unit",props); 

もちろん、CDIを使用している場合を除きます。

+0

素晴らしいです。私はあなたが2番目のパラメータを渡すことができないことを知りませんでした。試してみます。ありがとう! – Wombat

+0

@Wombat運がいいですか? – coladict

+0

あなたのソリューションは機能しており、現在のソリューションとして使用しています。しかし、弱点があります: "hibernate.hbm2ddl.auto"を渡すことは機能しません(JPAの標準パラメータではないためです)。このパラメータを "単一の" persistence.xmlに保存すると、そのパラメータを無効にするのを忘れる恐れがあり、本番データベースが消去されます。したがって、私は複数の永続性を持つことをお勧めします。xmlは、そこにすべてのentitesをリストアップしなければならないので、それは動作しません。そうでなければ、EntityManagerFactoryによって見つけられません。 – Wombat

0

両方のパーシスタンスユニットで同じエンティティを使用する場合は、というタグをそれぞれコピーする必要があるのはなぜですか?あなただけを使用しなかった理由

例えば

<exclude-unlisted-classes>false</exclude-unlisted-classes>

:たとえば

ため
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
    version="2.1"> 

    <persistence-unit name="persistenceUnit_1"> 
     <provider> xxx </provider> 
     <jta-data-source> xxxx </jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      //Properties of first persistence unit 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="persistenceUnit_2"> 
     <provider> xxx </provider> 
     <jta-data-source> xxxx </jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      //Properties of second persistence unit 
     </properties> 
    </persistence-unit> 

</persistence> 

と名前でそれを使用する必要があり、この場合

+0

persistence.xmlにすべてのクラスをリストしていない場合、Hibernateはエンティティがマップされていないことを教えてくれます。すべてのエンティティは、ソースが含まれている別のプロジェクトに配置されています。残念ながら、あなたのソリューションは私のためには機能しません。 – Wombat

+1

'exclude-unlisted-classes'はエンティティが' persistence.xml'と同じクラスパスレベルにある限り動作します。もう一つの解決策は、 'jar'でそれらを分離し、' myentities.jar 'を' persistence.xml'に追加することです。これは、クラスを個別にリストするのと同様に、アプリケーションの全範囲でファイルを探すようにHibernateに強制します。 – coladict

関連する問題