Spring + Hibernate + JPA: как перезагрузить EntityManagerFactory во время выполнения

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

Я пытаюсь перезагрузить мою информацию отображения в EntityManagerFactory (или SessionFactory) во время выполнения весной

EntityManagerFactory определяется следующим образом:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
   <property name="persistenceXmlLocation" value="persistence.xml" />
   <property name="persistenceUnitName" value="JPAService" />
   <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
   <property name="dataSource" ref="dataSource" />
   <property name="jpaDialect">
     <bean class="org.springframework.orm.jpa.vendor.Hibernate.JpaDialect" />
   </property>
   <property name="jpaProperties">
     <props>
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
       <prop key="hibernate.hbm2ddl.auto">none</prop>
       <prop key="hibernate.show_sql">true</prop>
     </props>
   </property>      
</bean>

В моем файле 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="JPAService" transaction-type="RESOURCE_LOCAL">
    <jar-file>WEB-INF/lib/mapping.jar</jar-file>   
  </persistence-unit>
</persistence>


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

Одна вещь, о которой я подумал, - это заменить EntityManagerFacotries/SessionFactory новым, например

Конфигурация гибернации во время выполнения
Динамическая настройка EJB

но я не знаю побочных эффектов

Другой способ - программно изменить (добавить / удалить) отображение EntityManagerFactory/SessionFactory во время выполнения:

JPA: добавление сущностей в EntityManagerFactory программно
Программно загружать классы сущностей с помощью JPA 2.0?

Очень сложный сценарий, когда решение не найдено

Динамическое генерирование класса сущности ORM - НЕ РЕШЕНО

Другой thead упоминает динамический JPA

Как я могу объединить / расширить единицы персистентности из разных JAR-файлов?
JPA 2.0: автоматическое добавление классов сущностей в PersistenceUnit * из разных jar*

Я уже пытался обновить весь контекст приложения с весны так

@RequestMapping(value = { "/path" })
public ModelMap refresh(Model model, Locale locale) throws IOException,
  TemplateException, ExtJSException {

  ((ConfigurableApplicationContext)ApplicationContextProvider.getApplicationContext()).refresh();

  return getMessage("Context was refreshed!!");
}

Но кажется, что этот проект больше не поддерживается...

1 ответ

Я не вижу другого решения, кроме перезагрузки всего контекста.

Все другие практики могут привести к утечкам памяти (например, при подключении) или ко всем видам ClassNotFound и другим вещам, представляющим только то, что произойдет во время передачи, когда вы пытаетесь перенастроить только EntityManager

Одно из решений, которое я могу придумать, - это "изолировать" полное определение bean-компонента уровня данных и заменить сами bean-компоненты, таким образом избегая полной перезагрузки контекста приложения.

Вы можете выполнить это или попытаться создать новый ApplicationContext, добавив компоненты bean уровня данных и заменив существующие, или используя набор интерфейсов (для entitymanager, ds и т. Д.) И заменив их реализацию @ runtime (но для этого потребуется много Работа..)

вам просто нужно убедиться, что вы перезагружаете EntityManager + TX + DS (и, возможно, другие вещи, которые я забыл)

НТН

Другие вопросы по тегам