2011-12-29 3 views
4

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

<?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 с новым, как так

Hibernate configuration on runtime
Dynamic Configure an EJB

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

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

JPA: adding entities to EntityManagerFactory programmatically
Programmatically loading Entity classes with JPA 2.0?

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

Dynamic ORM entity class generation - NOT SOLVED

другой THEAD mentiones динамичную-JPA

How can I merge/extend persistence units from different JARs?
JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automatically

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

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

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

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

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

+0

Каков класс, возвращаемый ApplicationContextProvider.getApplicationContext()? – Saish

+0

@Saish Я использую такой код [ApplicationContextProvider] (http://blog.imaginea.com/making-a-spring-bean-applicationcontext-aware/) –

+0

Это хорошо и хорошо, но не то, что я пытался определить. Если вы вызываете ApplicationContextProvider.getApplicationContext(). GetClass(). GetName(), что это возвращает? – Saish

ответ

0

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

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

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

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

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

HTH

Смежные вопросы