Spring + Hibernate + JPA: как перезагрузить EntityManagerFactory во время выполнения - PullRequest
4 голосов
/ 29 декабря 2011

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

Я пытаюсь добиться перезагрузки моей информации о карте в 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>


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

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

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

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

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

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

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

Генерация динамического класса сущностей ORM - НЕ РЕШЕНА

В другой статье упоминается dynamic-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 Ответ

0 голосов
/ 04 мая 2014

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

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

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

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

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

НТН

...