2015-10-16 5 views
8

Я пишу приложение javaEE, используя спящий режим. Приложение будет работать в нескольких средах (dev, qa, prod и т. Д.). & будет иметь отдельные dbs, связанные с каждым из них. Я хотел бы установить свойства hibernate, такие как jdbc-url, имя пользователя, пароль и т. Д. Отдельно для каждой из этих сред.Hibernate JTA: проверьте параметры подключения DB для среды

Мой текущий persistence.xml выглядит следующим образом:

<persistence-unit name="PU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <validation-mode>CALLBACK</validation-mode> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 

      <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/> 
      <property name="hibernate.event.merge.entity_copy_observer" value="allow"/> 

      <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/> 
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@host/schema"/> 

      <property name="hibernate.connection.username" value="abc"/> 
      <property name="hibernate.connection.password" value="***"/>  

     </properties> 
    </persistence-unit> 

Я использую единицы сохранения следующим образом в моем Java код:

@PersistenceContext(unitName = "PU") 
private EntityManager em; 

Есть ли способ, что я могу придать свойства Hibernate, которые хранятся в отдельных файлах свойств, в EntityManager для разных сред?

Обратите внимание, что я использую JTA и, следовательно, не могу использовать EntityManagerFactory. Также я не & не хочу использовать весну.

+0

, когда вы имеете в виду различные сред, вы не делаете включать сервер приложений? поскольку свойства datasource/db будут совместно использоваться сервером приложений, поэтому производственный сервер будет иметь свойства производственной базы данных, а сервер разработки будет иметь свойства разработки. – AntJavaDev

+0

Да. Приложение также будет иметь разные виртуальные машины в разных средах. –

+0

, тогда вы должны сделать hibernate conf опираться на источник данных сервера conf, f.e. если у вас есть сервер tomcat, вы должны определить 3 разных контекста базы данных. – AntJavaDev

ответ

1

Поскольку вы не хотите использовать внешнюю библиотеку, такую ​​как Spring, чтобы загружать блоки персистентности, почему бы не использовать вашу систему сборки для этого. Если вы используете maven, вы можете использовать сочетание maven filtering и profiles для фильтрации на основе файла свойств или если вы используете какой-либо другой инструмент сборки, вы можете добавить задачу (или ее эквивалент) для копирования содержимого файла из разных файлов в фактический файл в зависимости от некоторой внешней переменной системы/окружающей среды.

0

С помощью Spring Profile вы можете инициировать компоненты менеджера объектов в зависимости от активного профиля, который будет ссылаться на persistence.xml, например dev-persistence.xml, test-persisitence.xml, prod-persistence.xml вашей среды. И вы можете установить активный профиль с помощью web.xml. В основном web.xml не изменится настолько, что вы можете сохранить web.xml в своем репозитории с активным активным профилем весны, установленным для этого окружения.

5

На самом деле идея BAAAAAAD включает в себя информацию об окружающей среде в вашем приложении WAR/EAR (либо путем включения нескольких конфигураций, либо путем создания разных пакетов для другой среды). Например, в контейнере должна храниться другая база данных.

В вашем случае, ваш persistence.xml должен выглядеть следующим образом:

<persistence> 
    <persistence-unit name="PU"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>jdbc/fooAppDs</jta-data-source> 
     <properties> 
     ... ... 
     </properties> 
    </persistence-unit> 
</persistence> 

и, конечно, вы должны иметь соответствующий ресурс-реф для jdbc/fooAppDs.

Таким образом, вы можете развернуть приложение в любой среде. Вам просто нужно создать правильный источник данных в вашем контейнере и назначить его jdbc/fooAppDs.


Другой подход, я считаю, будет работать, но я не буду рекомендовать, является создание hibernate.cfg.xml в пути к классам. Возможно, вы захотите иметь локальную локальную файловую систему и добавить это в путь к классам, вместо того, чтобы помещать файл в JAR/WAR/EAR.

1

Мы использовали файлы свойств для каждой среды, такие как DEV, QA, PROD, UAT и т. Д. В разных файлах и копировали один из них во время сборки.

Ant сборки

<property environment="env" /> 
       <!-- ***** COMMAND LINE ARGUMENTS DEMOED HERE --> 
       <property name="build_type" value= "${env.build_type}"/> 

<copy todir="deploy"> 
    <fileset dir="src_dir"/> 
    <globmapper from=${env.build_type}".persistence.xml" to="persistence.xml"/> 
</copy> 

Run построить как этот

ant -Denv.build_type=PROD 

Это скопирует PROD.persistence.xml в persistence.xml

ant -Denv.build_type=DEV 

Это скопирует DEV.persistence. xml to persistence.xml

0

вы можете настроить свой файл пружинно-config.xml следующим

  1. MYSQL
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/kaya_db" /> 
    <property name="username" value="root" /> 
    <property name="password" value="nxtlife" /> 
</bean> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="packagesToScan" value="com.nxtlife.model" /> 
    <property name="hibernateProperties"> 

     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory"> 
</bean> 

2.Similar для других баз данных, как Oracle, Postgre с другим именем источника данных , sessionfactory и transactionmanager. 3. Наконец, вы можете получить объект сеанса завода с использованием следующих SessionFactory имени

@Modifier("sessionfactoryname") 
@Autowired 
private SessionFactory obj; 

аналогичного для различных баз данных

+0

Как я уже упоминал в вопросе, я не использую и не хочу использовать весну. –

+0

О, у меня, JPA, похоже, нет SessionFactory. Ясно, что повторное чтение вопроса поможет –

+0

вы можете использовать EntityManager в jpa и установить имя единицы. –