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 (и, возможно, другие вещи, которые я забыл)
НТН