Я использую Hibernate 5.3.7.Final в качестве поставщика постоянных данных для Weblogic 12.2.1.3.
Моя проблема заключается в том, что при развертывании приложения, котороесодержит модуль персистентности, фабрика менеджера сущностей дважды инициализируется Weblogic.
Сначала в приложении фаза подготовки , а затем снова в приложении фаза активации .В результате вся моя схема БД инициализируется дважды ( hibernate.hbm2ddl.auto = create ).
Я прикрепил соответствующие части цепочек вызовов методов обоихфаза.
Первая (подготовительная фаза):
HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map) line: 141
BasePersistenceUnitInfo.initializeEntityManagerFactory(boolean, BeanManager) line: 614
BasePersistenceUnitInfo.init() line: 202
BaseJPAIntegrationProvider.createPersistenceUnitInfo(PersistenceUnitBean, Object, GenericClassLoader, String, URL, URL, String, ApplicationContextInternal) line: 54
ModulePersistenceUnitRegistry(AbstractPersistenceUnitRegistry).storeDescriptors(Map, Map) line: 422
ModulePersistenceUnitRegistry(AbstractPersistenceUnitRegistry).loadPersistenceDescriptors(boolean) line: 128
ModulePersistenceUnitRegistry.<init>(GenericClassLoader, ApplicationContextInternal, Module, boolean) line: 56
WebAppInternalModuleExtension$PersistenceExtension.setupPersistenceUnitRegistry() line: 197
WebAppInternalModuleExtension$PersistenceExtension.access$300(WebAppInternalModuleExtension$PersistenceExtension) line: 118
WebAppInternalModuleExtension.prePrepare() line: 56
ExtensibleModuleWrapper$PrepareStateChange.next(ExtensibleModuleWrapper$DrivenObject) line: 293
ExtensibleModuleWrapper$PrepareStateChange.next(Object) line: 285
StateMachineDriver<StateMachine>.nextState(StateChange<StateMachine>, StateMachine[]) line: 45
ExtensibleModuleWrapper.prepare() line: 109
Вторая (активирующая фаза):
HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map) line: 141
BasePersistenceUnitInfo.initializeEntityManagerFactory(boolean, BeanManager) line: 614
BasePersistenceUnitInfo.reInitEntityManagerFactoryPerhaps() line: 785
BasePersistenceUnitInfo.activate(Context) line: 750
WebAppInternalModuleExtension$PersistenceExtension.activatePersistenceUnit() line: 160
WebAppInternalModuleExtension$PersistenceExtension.access$700(WebAppInternalModuleExtension$PersistenceExtension) line: 118
WebAppInternalModuleExtension.postActivate() line: 81
ExtensibleModuleWrapper$ActivateStateChange.next(ExtensibleModuleWrapper$DrivenObject) line: 321
ExtensibleModuleWrapper$ActivateStateChange.next(Object) line: 313
StateMachineDriver<StateMachine>.nextState(StateChange<StateMachine>, StateMachine[]) line: 45
ExtensibleModuleWrapper.activate() line: 121
Я думаю, что Weblogic принимает решение в методе
BasePersistenceUnitInfo.reInitEntityManagerFactoryPerhaps()
повторную инициализацию фабрики диспетчера сущностей после активации модуля персистентности.
Я много искал,но пока не нашел никаких настроек, чтобы как-то точно настроить это поведение при начальной загрузке.
У кого-нибудь есть идеи, как избежать инициализации дублирующейся схемы БД?
(IУ меня довольно большая схема и import.sql, поэтому этот процесс занимает много времени.)
Вот мой файл persistence.xml для справки:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="abPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/abDS</jta-data-source>
<jar-file>ab.jar</jar-file>
<jar-file>lib/cd.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.default_schema" value="${hibernate.default_schema}" />
<property name="hibernate.cache.second_level_cache" value="false" />
<property name="hibernate.jdbc.batch_size" value="50" />
<property name="hibernate.order_inserts" value="true" />
<property name="hibernate.order_updates" value="true" />
<property name="hibernate.jdbc.batch_versioned_data" value="true" />
<property name="hibernate.search.autoregister_listeners" value="false" />
<property name="hibernate.current_session_context_class" value="jta" />
<property name="hibernate.transaction.coordinator_class" value="jta" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform" />
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
</persistence>
Я очень ценю любые мысли или комментарии!