Как вывести свойства из JPAs persistence.xml? - PullRequest
22 голосов
/ 14 октября 2010

Я хотел бы поместить некоторую конфигурацию гибернации в файл свойств, чтобы сделать ее редактируемой без сборки и развертывания.

Я попытался решить свою проблему, следуя инструкциям из Создать JPA EntityManager безфайл конфигурации persistence.xml

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

persistence.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 Шов: 2.1.2

РЕДАКТИРОВАТЬ:

JBoss JNDI зачисляет "пу" в качестве единицы постоянства:

persistence.units:ear=app.ear,jar=app.jar,unitName=pu (class: org.hibernate.impl.SessionFactoryImpl)

Ответы [ 4 ]

9 голосов
/ 16 октября 2010

В качестве альтернативы вашему текущему подходу, и поскольку вы используете Hibernate, вы можете использовать Hibernate для настройки JPA, объявив файл hibernate.cfg.xml с помощью свойства hibernate.ejb.cfgfile, например:

<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 просто должен находиться на пути к классам (поэтому он может находиться за пределами упакованного архива).

Ссылки

2 голосов
/ 15 февраля 2012

Только что нашел предполагаемый путь для пользователей 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.
 */
1 голос
/ 11 февраля 2016

Если вы используете Spring для управления и добавления менеджера сущностей, то можно реализовать org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor и передать внешние свойства.Я мог бы успешно вывести все свойства из файла persistence.xml, используя это.

1 голос
/ 19 ноября 2013

Я использовал этот механизм, похоже, он работает для большинства свойств, возникли проблемы с не-jta-data-source.

http://www.eclipse.org/eclipselink/api/2.4/index.html?org/eclipse/persistence/config/PersistenceUnitProperties.html

...