いくつかの休止状態の構成をプロパティファイルに入れて、ビルドおよびデプロイせずに編集できるようにしたいと思います。
persistence.xml構成ファイルなしでJPA EntityManagerを作成する の指示に従って問題を解決しようとしました。
app.properties:
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=validate
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.default_schema=myschema
永続性.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<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="pu">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/appDatasource</jta-data-source>
<properties>
<property name="jboss.entity.manager.factory.jndi.name" value="Java:/appEntityManagerFactory"/>
</properties>
</persistence-unit>
</persistence>
初期化コードで、アプリケーションは次のシーケンスを実行します(プロパティを検索します)。
Properties props = new Properties();
InputStream is = ClassLoader.getSystemResourceAsStream( "app.properties" );
props.load( is );
Persistence.createEntityManagerFactory( "pu", props );
しかし、エラーメッセージで失敗します:
INFO [SessionFactoryImpl] building session factory
INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
ERROR [STDERR] javax.persistence.PersistenceException: [PersistenceUnit: pu] Unable to build EntityManagerFactory
誰かが私の構成で何が間違っている可能性があるか考えていますか?
バージョン:JBoss 4.3 Seam:2.1.2
編集:
JBoss JNDIは、永続性ユニットとして「pu」を登録します。
persistence.units:ear=app.ear,jar=app.jar,unitName=pu (class: org.hibernate.impl.SessionFactoryImpl)
現在のアプローチの代替として、Hibernateを使用しているため、次のようにhibernate.cfg.xml
プロパティを使用してhibernate.ejb.cfgfile
ファイルを宣言することにより、Hibernateを使用してJPAを構成できます。
<persistence>
<persistence-unit name="manager1" transaction-type="JTA">
<jta-data-source>Java:/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>
私の理解では、hibernate.cfg.xml
はクラスパス上にあるはずです(したがって、パッケージ化されたアーカイブの外にある可能性があります)。
EclipseLinkユーザーのための疑惑の方法を見つけました。 "eclipselink.persistencexml"があり、デフォルト値は
public static final String ECLIPSELINK_PERSISTENCE_XML_DEFAULT = "META-INF/persistence.xml";
しかし、ドキュメントにはオーバーライドできると書かれていますが、オーバーライドすることはできません...
/**
* The <code>"eclipselink.persistencexml"</code> property specifies the full
* resource name to look for the persistence XML files in. If not specified
* the default value defined by {@link #ECLIPSELINK_PERSISTENCE_XML_DEFAULT}
* will be used.
* <p>
* IMPORTANT: For now this property is used for the canonical model
* generator but it can later be used as a system property for customizing
* weaving and application bootstrap usage.
* <p>
* This property is only used by EclipseLink when it is locating the
* configuration file. When used within an EJB/Spring container in container
* managed mode the locating and reading of this file is done by the
* container and will not use this configuration.
*/
Springを使用してエンティティマネージャーを管理および注入している場合は、org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessorを実装して、外部プロパティを渡すことができます。これを使用して、persistence.xmlからすべてのプロパティを正常に外部化できました。
私はこのメカニズムを使用しましたが、ほとんどのプロパティで機能しているようで、jta-data-source以外に問題がありました。