Как «параметризовать» экземпляр базы данных JPA в persistence.xml? - PullRequest
5 голосов
/ 08 июня 2010

У меня есть веб-приложение на Java, использующее JPA. Экземпляр базы данных указывается в файле persistence.xml с помощью тега jta-data-source.

Я хотел бы развернуть вторую копию веб-приложения на том же сервере (Glassfish), но указал на другой экземпляр базы данных.

Каков наилучший способ достичь этого? Я думаю, в идеале, я бы хотел разместить файл переопределения persistence.xml вне войны (где-нибудь на пути к классам?). Я не совсем уверен, где его поместить или как определить так, чтобы он не совпадал с моим другим экземпляром. Я вижу, как мы размещаем несколько экземпляров таким образом (SaaS), и я бы хотел, чтобы конфигурация находилась вне развернутой войны, чтобы она не стала проблемой обслуживания. Совместное использование экземпляра базы данных между клиентами не вариант по соображениям безопасности.

Я уверен, что это не единственная проблема для нашей группы. Какие лучшие практики или решения используют другие для решения этой проблемы?

Ответы [ 6 ]

2 голосов
/ 23 августа 2010

Обновление:

http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html

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

//inject entity manager
@Inject("mySpecialEntityManager")
EntityManager em;

//then mark the actual factory method in the factory bean with    
@Produces("mySpecialEntityManager")

но тогда как управлять областью действия это проблема


2.2.2. Бутстрапирование

Спецификация JPA определяет процедуру начальной загрузки для доступа к EntityManagerFactory и EntityManager. Класс начальной загрузки - javax.persistence.Persistence, например,

Map configOverrides = new HashMap ();

configOverrides.put ("hibernate.hbm2ddl.auto", "create-drop");

EntityManagerFactory programmaticEmf =

Persistence.createEntityManagerFactory("manager1", configOverrides);

Первая версия эквивалентна второй с пустой картой. Версия карты - это набор переопределений, которые будут иметь приоритет над любыми свойствами, определенными в ваших файлах persistence.xml. Все свойства, определенные в разделе 2.2.1 «Упаковка», могут быть переданы методу createEntityManagerFactory, и есть несколько дополнительных:

*

  javax.persistence.provider to define the provider class used
*

  javax.persistence.transactionType to define the transaction type used (either JTA or RESOURCE_LOCAL)
*

  javax.persistence.jtaDataSource to define the JTA datasource name in JNDI
*

  javax.persistence.nonJtaDataSource to define the non JTA datasource name in JNDI
*

  javax.persistence.lock.timeout pessimistic lock timeout in milliseconds (Integer or String)
*

  javax.persistence.query.timeout query timeout in milliseconds (Integer or String)
*

  javax.persistence.sharedCache.mode corresponds to the share-cache-mode element defined in Section 2.2.1, “Packaging”.
1 голос
/ 22 февраля 2012

Как насчет сохранения файла persistence.xml в папке META-INF каталога classes и последующего указания этой папки в пути к классам?

1 голос
/ 08 июня 2010

Полагаю, вы уже изменяете копию в других вещах? (например, имя файла уха)

Если вы используете программное обеспечение для сборки, такое как ant или maven, вы можете использовать заполнитель внутри файла persistence.xml и создать другую «копию», просто используя разные параметры сборки.

например. с Maven

mvn clean install -DmyDatabaseName = db / somedb

1 голос
/ 08 июня 2010

Я бы упаковал две версии веб-приложения и объявил бы конкретный источник данных в элементе jta-data-source их persistence.xml (я не думаю, что вы можете вывести этот файл на экстернализ, как ожидается, он будет в WEB-INF/classes/META-INF/persistence.xml)

0 голосов
/ 11 октября 2012

Вот что я смог сделать в среде Java SE:

Создать файл .jar без файла persistence.xml.Я создал manifest.mf файл вручную, а в Class-Path: я поставил "."в дополнение к другим нужным мне записям.

В каталоге, в который вы устанавливаете программное обеспечение, создайте каталог META-INF и поместите туда persistence.xml.Это должно быть подобрано автоматически.

Например

  /my/install/dir/
                 META-INF/persistence.xml
                 foo.jar
0 голосов
/ 27 июля 2012

С помощью Spring вы можете переопределить параметры файла persistance.xml при запуске приложения и загрузить эти параметры из файла внешних свойств.

http://www.summa -tech.com / блог / 2009/04/20/6-советы-для-управления-свойства-файлов-с-весна /

Взгляните на ответ @ darren по адресу: Spring + Hibernate + JPA

...