Java SpringDataJPA-多个持久化单元作为JUnit工作,但不在Tomcat中

Java SpringDataJPA-多个持久化单元作为JUnit工作,但不在Tomcat中,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我几乎准备好回到我舒适的JDBC模板使用上了,但是我想看看社区是否有什么见解。我在基于Spring的应用程序中添加了第二组JPA framework对象:新的实体管理器、持久化单元等。现有的实体管理器使用ObjectDB进行持久化,我想将slick Spring数据JPA API用于CRUD存储库(Hibernate作为impl),但这一直给我带来麻烦。我以为我已经在本地解决了所有问题b/c我有一个通过bean创建的JUnit,但一旦我将这些bean放到applicationContext中,我

我几乎准备好回到我舒适的JDBC模板使用上了,但是我想看看社区是否有什么见解。我在基于Spring的应用程序中添加了第二组JPA framework对象:新的实体管理器、持久化单元等。现有的实体管理器使用ObjectDB进行持久化,我想将slick Spring数据JPA API用于CRUD存储库(Hibernate作为impl),但这一直给我带来麻烦。我以为我已经在本地解决了所有问题b/c我有一个通过bean创建的JUnit,但一旦我将这些bean放到applicationContext中,我就遇到了一个我不知道如何修复的回归

公司名称已从com.xxx中删除的JUnit和应用程序上下文XML片段

<context:annotation-config />
<context:component-scan base-package="com"/>
<jpa:repositories base-package="com.dms.server.mode" entity-manager-factory-ref="emf"/>
<!-- TxMgr #1 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
</bean>
<!-- EMF #1 -->
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource">
    <property name="persistenceUnitName" value="hibernate-pu" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hibernate.xml"/>
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>


<bean id="sharedModeManager" class="com.dms.server.mode.DefaultSharedModeManager"/>
<bean id="changeRecordCommandFactory" class="com.dms.server.ChangeRecordCommandFactory"/>

<bean id="createModeCommand" class="com.dms.server.mode.CreateModeCommand">
    <property name="apsConnection" ref="ApsConnection" />
</bean>

<!-- TxMgr #2 -->
<bean id="EnvDMSTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="EnvDMSEntityManagerFactory"/>
</bean>
<!-- EMF #2 -->
<bean id="EnvDMSEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="envService"/>
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
    <property name="persistenceProviderClass" value="com.objectdb.jpa.Provider"/>
</bean>
但是在Tomcat中失败了

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeManager': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
... 33 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1454)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:249)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:550)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
... 41 more
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.hibernate.ejb.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:171)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:84)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:67)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:150)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:44)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 51 more
原因:org.springframework.beans.factory.BeanCreationException:创建名为“SharedModelManager”的bean时出错:注入资源依赖项失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“SharedModelRepository”的bean时出错:FactoryBean在创建对象时引发异常;嵌套异常为java.lang.IllegalArgumentException:不是托管类型:class com.api.dms.SharedMode
位于org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
位于org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
... 33多
原因:org.springframework.beans.factory.BeanCreationException:创建名为“SharedModelRepository”的bean时出错:FactoryBean在创建对象时引发异常;嵌套异常为java.lang.IllegalArgumentException:不是托管类型:class com.api.dms.SharedMode
位于org.springframework.beans.factory.support.FactoryBeanRegistrySupport.dogetObject fromFactoryBean(FactoryBeanRegistrySupport.java:149)
位于org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1454)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:249)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
位于org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442)
位于org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416)
位于org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:550)
位于org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
位于org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
位于org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
... 41多
原因:java.lang.IllegalArgumentException:不是托管类型:class com.api.dms.SharedMode
位于org.hibernate.ejb.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:171)
位于org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation。(JpaMetamodelEntityInformation.java:68)
位于org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65)
位于org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146)
位于org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetPository(JpaRepositoryFactory.java:84)
位于org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetPository(JpaRepositoryFactory.java:67)
位于org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:150)
位于org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)
位于org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:44)
位于org.springframework.beans.factory.support.FactoryBeanRegistrySupport.dogetObject fromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 还有51个
Java类

@Repository
@PersistenceContext(unitName="hibernate-pu")
public interface SharedModeRepository extends CrudRepository<SharedMode, SharedModeKey> {
Iterable<SharedMode> findByName(String name);
Iterable<SharedMode> findByCurrent(boolean current);
SharedMode findBySharedModeKeyIdAndCurrent(int id, boolean current);
}

@PersistenceContext(name="hibernate-pu")
@Entity(name="shared_mode")
@XmlRootElement(name="sharedMode")
public class SharedMode implements Comparable<SharedMode>, ModeLike, Serializable {
    private static final long serialVersionUID = -3202319961514321359L;
    @EmbeddedId
    @XmlElement
    private SharedModeKey sharedModeKey = new SharedModeKey();
    @Column
    private String name;
    @Column
    private boolean current;
    ...
}
@存储库
@PersistenceContext(unitName=“hibernate pu”)
公共接口SharedModelRepository扩展了Crudepository{
Iterable findByName(字符串名称);
Iterable findByCurrent(布尔电流);
SharedMode findBySharedModeKeyIdAndCurrent(整数id,布尔当前值);
}
@PersistenceContext(name=“hibernate pu”)
@实体(名称=“共享模式”)
@XmlRootElement(name=“sharedMode”)
公共类SharedMode实现了可比较的、类似模型的、可序列化的{
私有静态最终长serialVersionUID=-3202319961514321359
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
</entity-mappings>
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" version="2.0">
<entity class="com.awareness.server.environment.SampleIndicationHistory" access="FIELD">
    <table name="SAMPLE_IND_HISTORY"/>
    <attributes>
        <id name="deviceId"/>
        <basic name="tOldest"/>
        <basic name="tNewest"/>
        <element-collection name="timestamps"/>
        <element-collection name="indexes"/>
    </attributes>
</entity>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/com/junit-context.xml"})
// Functioning JUnit
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeManager': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
... 33 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sharedModeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1454)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:249)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:550)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
... 41 more
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.api.dms.SharedMode
at org.hibernate.ejb.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:171)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:84)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:67)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:150)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:44)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 51 more
@Repository
@PersistenceContext(unitName="hibernate-pu")
public interface SharedModeRepository extends CrudRepository<SharedMode, SharedModeKey> {
Iterable<SharedMode> findByName(String name);
Iterable<SharedMode> findByCurrent(boolean current);
SharedMode findBySharedModeKeyIdAndCurrent(int id, boolean current);
}

@PersistenceContext(name="hibernate-pu")
@Entity(name="shared_mode")
@XmlRootElement(name="sharedMode")
public class SharedMode implements Comparable<SharedMode>, ModeLike, Serializable {
    private static final long serialVersionUID = -3202319961514321359L;
    @EmbeddedId
    @XmlElement
    private SharedModeKey sharedModeKey = new SharedModeKey();
    @Column
    private String name;
    @Column
    private boolean current;
    ...
}