Я использую Гибернация 5.3.7.Финал в качестве поставщика постоянства на Weblogic 12.2.1.3.
Моя проблема в том, что когда я развертываю свое приложение, которое содержит блок сохранения состояния, фабрика диспетчера сущностей дважды инициализируется Weblogic.
Сначала в приложении подготовить этап, а затем снова в приложении активировать фазу. В результате вся моя схема БД инициализируется дважды (hibernate.hbm2ddl.auto = Создайте).
Я прикрепил соответствующие части цепочек вызовов методов обеих фаз.
Первый (этап подготовки):
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()
следует ли повторно инициализировать фабрику менеджеров сущностей после активации единицы сохранения состояния.
Я много искал, но пока не нашел никаких настроек, чтобы как-то точно настроить это поведение при начальной загрузке.
Кто-нибудь знает, как избежать инициализации дублирующейся схемы БД?
(У меня довольно большая схема и 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>
Я очень ценю любые мысли или комментарии!
Столкнулся с точно такой же проблемой. Единственная рекомендация, которую я могу придумать, - не использовать CDI в модуле, поскольку код, похоже, предполагает, что он будет повторно инициализировать блок сохранения состояния только в том случае, если для модуля включен CDI.
s
public void reInitEntityManagerFactoryPerhaps() throws EnvironmentException {
BeanManager bm = null;
if (this.appCtx != null) {
bm = this.getBeanManager(this.getCDIArchiveID(this.persistenceArchiveId));
}
if (this.isDataSourceReInitializationNeeded()) {
this.close();
this.initializeEntityManagerFactory(true, bm);
} else if (!this.isKodoPersistenceUnit() && bm != null) {
this.close();
this.initializeEntityManagerFactory(true, bm);
}
}
Я установил точку останова в wlfullclient и произвел удаленную отладку. Этот код взят из EJBModule внутри weblogic.
Спасибо за ваш ответ! Не могли бы вы сказать мне, откуда вам удалось получить исходные файлы, связанные с Weblogic (BasePersistenceUnitInfo.java и т. д.)? Я бы тоже их проверил.