2011-03-01 31 views
0

私はJPAを初めて使い、自分自身を教えようと私は小さなWebアプリケーションをセットアップしてGlassfish 3.1に配備しています。persistence.xmlのデータベース設定が使用されていません

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 
    <persistence-unit name="foo" transaction-type="JTA"> 
     <jta-data-source>jdbc/foo</jta-data-source> 
     <class>my.app.Foo</class> 
    </persistence-unit> 
</persistence> 

しかし、これまで私が理解し、すべて私のデータベース接続設定を配置することも可能であると考えられる:私はこのような、persistence.xmlでJNDIデータソースを参照するとき

JPAが正常に動作しますpersistence.xmlのプロパティに追加します。これは良い習慣ではないかもしれませんが、私はちょうど実験しているとき、おそらく単体テストのときに便利かもしれないようです。

しかし、私が見つけた例に従えば、persistence.xmlは無視されているようで、デフォルトのコンテナ管理のDataSourceであるjndi/__ defaultが使用されています。これは実行されていないDerbyインスタンスです。

私は一時的なインメモリ・ダービーのインスタンスに、このファイルを試してみた:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="foo" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>my.app.Foo</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:NxtMv;create=true"/> 
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/> 
      <property name="javax.persistence.jdbc.user" value=""/> 
      <property name="javax.persistence.jdbc.password" value=""/> 
      <property name="eclipselink.ddl-generation" value="create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

は私も(JNDIを介してアクセスしたときに働く)PostgreSQLサーバのためにこれを試してみました:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="foo" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>my.app.Foo</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/foo"/> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="myuser"/> 
      <property name="javax.persistence.jdbc.password" value="secret"/> 
      <property name="eclipselink.ddl-generation" value="create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

私の無数の試行と再試行の間に蓄積されたこれらのファイルには、おそらく無関係ないくつかの欠点があります。

私はここで何が欠けていますか?

答えて

1

transaction-type="JTA"で手動で設定したデータソースを使用することはできません。

JPA仕様は言う:

JTA の取引型JTAデータソースを設け、いずれかれることJTAデータソース要素 で指定またはコンテナによって提供されるように想定しています。

代わりにtransaction-type="RESOURCE_LOCAL"を使用してください(使用すると、コンテナ管理のトランザクションでどのように動作するかはわかりませんが)。

+0

私はこれを試しましたが、あなたは正しいです。これは、「トランザクション・タイプJTAの永続ユニットのみをコンテナ管理のエンティティ・マネージャとして使用できます」というエラーが発生します。私が展開しようとするとき。 RESOURCE_LOCALを使用して引き続き展開できるシナリオは何ですか? –

+0

@Coder:JTAデータソースなしでcontrainer-managedトランザクションを使用することはできません。つまり、手動で設定されたデータソースを使用するには、(Persistence.createEntitiyManagerFactory()によって取得された永続コンテキストで)トランザクションを手動で管理する必要があります。 EJBの柔軟性に欠けているようです。 – axtavt

+0

@Coder Doe:コンテナ管理のトランザクションを使用している場合、JTAデータソースを使用する以外に選択肢はありません。私はこれがすぐにいつでも変わるとは思わない! JTAを直接サポートするサーバーは、Glassfish、JBoss、Websphereです。非JTAサーバー:Tomcat – ChuongPham

関連する問題