【发布时间】:2017-04-06 12:39:20
【问题描述】:
我正在尝试使用 spring data jpa 部署 Spring boot 并休眠到 Oracle Weblogic 12c (12.2.1),具有以下依赖项并低于异常。
- JDK 8
- Weblogic 12.2.1
- Spring Boot 1.4.1 版
- Spring 数据 jpa 版本 1.10.3
- Spring orm 4.3.3
- 休眠核心,休眠实体管理器 5.0.11
我将实体管理器工厂 Bean 定义为
@Bean(name = "entitiesManagerFactory")
@Primary
public EntityManagerFactory entitiesManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPersistenceUnitName("DemoEntityPU");
emf.setMappingResources("META-INF/orm.xml");
emf.setDataSource(dataSource());
emf.setPersistenceProvider(hibernatePersistenceProvider());
emf.setJpaVendorAdapter(hibernateJpaVendorAdapter());
emf.setPackagesToScan("com.demo.entities.entity");
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto","validate");
properties.setProperty("hibernate.default_schema", "demoSchema");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
properties.setProperty("hibernate.show_sql", "false");
properties.setProperty("hibernate.generate_statistics", "false");
properties.setProperty("hibernate.format_sql", "true");
properties.setProperty("hibernate.use_sql_comments", "false");
properties.setProperty("hibernate.jdbc.batch_size", "100");
properties.setProperty("hibernate.order_inserts", "true");
properties.setProperty("hibernate.order_updates", "true");
properties.setProperty("hibernate.connection.useUnicode", "true");
properties.setProperty("hibernate.connection.charSet", "UTF-16");
properties.setProperty("hibernate.connection.characterEncoding", "UTF-16");
properties.setProperty("jadira.usertype.autoRegisterUserTypes", "true");
properties.setProperty("jadira.usertype.javaZone", "UTC");
properties.setProperty("jadira.usertype.databaseZone", "UTC");
emf.setJpaProperties(properties);
emf.afterPropertiesSet();
return emf.getObject();
}
例外
Caused by: java.lang.Throwable: Substituted for missing class Exception [EclipseLink-7244] (Eclipse Persistence Services - 2.6.3.v20160526-8f41838) - org.eclipse.persistence.exceptions.ValidationException
Exception Description: An incompatible mapping has been encountered between [class com.demo.entities.entity.PhysicalServers] and [class com.demo.entities.entity.Deployment]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer.
at org.eclipse.persistence.exceptions.ValidationException.invalidMapping(ValidationException.java:1296)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToManyAccessor.process(ManyToManyAccessor.java:158)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processNonOwningRelationshipAccessors(MetadataProject.java:1581)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1870)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:577)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:607)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1948)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactoryImpl(PersistenceProvider.java:347)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:313)
at weblogic.persistence.BasePersistenceUnitInfo.initializeEntityManagerFactory(BasePersistenceUnitInfo.java:613)
at weblogic.persistence.BasePersistenceUnitInfo.init(BasePersistenceUnitInfo.java:201)
at weblogic.persistence.BaseJPAIntegrationProvider.createPersistenceUnitInfo(BaseJPAIntegrationProvider.java:54)
at weblogic.persistence.AbstractPersistenceUnitRegistry.storeDescriptors(AbstractPersistenceUnitRegistry.java:422)
at weblogic.persistence.AbstractPersistenceUnitRegistry.loadPersistenceDescriptors(AbstractPersistenceUnitRegistry.java:128)
我的代码在 tomcat 上运行良好,但是当移动到 weblogic 时,部署时会引发异常。
我不知道为什么涉及eclipselink,即使我在weblogic.xml中定义
<wls:prefer-application-packages>
<wls:package-name>org.slf4j</wls:package-name>
<wls:package-name>com.fasterxml.classmate.*</wls:package-name>
<wls:package-name>com.fasterxml.jackson.*</wls:package-name>
<wls:package-name>javax.validation.*</wls:package-name>
<wls:package-name>javax.validation.bootstrap.*</wls:package-name>
<wls:package-name>javax.validation.constraints.*</wls:package-name>
<wls:package-name>javax.validation.groups.*</wls:package-name>
<wls:package-name>javax.validation.metadata.*</wls:package-name>
<wls:package-name>javax.validation.spi.*</wls:package-name>
<wls:package-name>javax.persistence.*</wls:package-name>
<wls:package-name>javax.persistence.criteria.*</wls:package-name>
<wls:package-name>javax.persistence.metamodel.*</wls:package-name>
<wls:package-name>javax.persistence.spi.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
<wls:package-name>org.apache.xmlbeans.*</wls:package-name>
<wls:package-name>org.springframework.*</wls:package-name>
<wls:package-name>org.hibernate.*</wls:package-name>
<wls:package-name>org.hibernate.validator.*</wls:package-name>
<wls:package-name>org.hibernate.jpa.*</wls:package-name>
<wls:package-name>org.hibernate.ejb.*</wls:package-name>
<wls:package-name>org.hibernate.annotations.*</wls:package-name>
<wls:package-name>org.joda.*</wls:package-name>
<wls:package-name>antlr.*</wls:package-name>
</wls:prefer-application-packages>
但引发异常并且 weblogic 使用 eclipselink 并忽略我的持久提供程序 bean。
任何帮助或线索将不胜感激。
【问题讨论】:
-
你有persistence.xml吗?它内部是否定义了提供程序?如果没有定义提供程序,WebLogic 将在部署期间使用它附带的默认提供程序加载它 - EclipseLink。这发生在容器管理的持久性单元上,但它不知道什么是容器或本地,直到它加载它们并且应用程序请求一个。
-
@Chris:是的,情况确实如此,我们首先从 persistent.xml 开始,然后移至注释,但没有删除该文件。谢谢你拯救了我的一天。
标签: hibernate spring-data eclipselink weblogic12c hibernate-entitymanager