Java 实体扫描在JPA/hibernate/spring应用程序中不起作用

Java 实体扫描在JPA/hibernate/spring应用程序中不起作用,java,spring,hibernate,jpa,wildfly-10,Java,Spring,Hibernate,Jpa,Wildfly 10,我的applicationContext.xml是: 在applicationContext.xml中,我定义了EntityManagerFactorybean,如下所示 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceXmlLocation" val

我的applicationContext.xml是:

在applicationContext.xml中,我定义了EntityManagerFactorybean,如下所示

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="corePU" />
    <property name="packagesToScan" value="com" />
</bean>
下面是我得到的错误:

21:15:47,463 ERROR [stderr] (default task-4) java.lang.IllegalArgumentException: Unknown entity: com.entity.Address
21:15:47,463 ERROR [stderr] (default task-4)    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1149)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21:15:47,464 ERROR [stderr] (default task-4)    at java.lang.reflect.Method.invoke(Method.java:498)
21:15:47,464 ERROR [stderr] (default task-4)    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
21:15:47,464 ERROR [stderr] (default task-4)    at com.sun.proxy.$Proxy93.persist(Unknown Source)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21:15:47,464 ERROR [stderr] (default task-4)    at java.lang.reflect.Method.invoke(Method.java:498)
21:15:47,465 ERROR [stderr] (default task-4)    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
21:15:47,465 ERROR [stderr] (default task-4)    at com.sun.proxy.$Proxy50.persist(Unknown Source)
21:15:47,465 ERROR [stderr] (default task-4)    at com.manager.manager.getAddress(manager.java:37)
21:15:47,465 ERROR [stderr] (default task-4)    at com.manager.manager$$FastClassBySpringCGLIB$$e766fff.invoke(<generated>)
21:15:47,465 ERROR [stderr] (default task-4)    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
如果不在persistence.xml中使用class标记显式指定每个实体,如何使用实体?

您应该在entityManager/sessionFactory配置中设置packagesToScan属性

例如:

packagesToScan=com.manager

或者,如果您使用的是Spring Boot,则可以使用@EntityScan注释:

Spring Boot<1.4

您应该在entityManager/sessionFactory配置中设置PackageScon属性

例如:

packagesToScan=com.manager

或者,如果您使用的是Spring Boot,则可以使用@EntityScan注释:


Spring Boot<1.4

JPA和Spring是两个不同的东西

总的来说,Spring的问题与JPA无关。它指的是弹簧组件、储物箱等,但在发动机罩下,弹簧当然使用JPA,这有两种可能的配置:

将Spring配置为读取persistence.xml并完全依赖它; 不要使用persistence.xml,只使用Spring配置—另一种配置类型,可以使用LocalContainerEntityManagerFactoryBean属性packagesToScan。请参阅本文,例如:。 检查Spring javadoc对packagesToScan的看法:

设置是否对中的实体类使用基于Spring的扫描 类路径,而不是使用JPA的标准jar文件扫描 其中包含persistence.xml标记。如果是基于弹簧的扫描,则没有 persistence.xml是必需的;您所需要做的就是指定base 要在此处搜索的包

如果要使用persistence.xml,您有几个选项:

编写每个实体类-JPA不支持自动扫描,几乎,请参阅下一个选项; 不要编写每个实体类,而是将实体放在一个jar中,并将jar文件属性设置为指向它——JPA只支持这种自动扫描; 如果您不介意与JPA规范不兼容,即使用JPA本身没有的特定提供程序功能,则可以使用Hibernate自动扫描功能: 休眠自动扫描功能:


JPA和Spring是两个不同的东西

总的来说,Spring的问题与JPA无关。它指的是弹簧组件、储物箱等,但在发动机罩下,弹簧当然使用JPA,这有两种可能的配置:

将Spring配置为读取persistence.xml并完全依赖它; 不要使用persistence.xml,只使用Spring配置—另一种配置类型,可以使用LocalContainerEntityManagerFactoryBean属性packagesToScan。请参阅本文,例如:。 检查Spring javadoc对packagesToScan的看法:

设置是否对中的实体类使用基于Spring的扫描 类路径,而不是使用JPA的标准jar文件扫描 其中包含persistence.xml标记。如果是基于弹簧的扫描,则没有 persistence.xml是必需的;您所需要做的就是指定base 要在此处搜索的包

如果要使用persistence.xml,您有几个选项:

编写每个实体类-JPA不支持自动扫描,几乎,请参阅下一个选项; 不要编写每个实体类,而是将实体放在一个jar中,并将jar文件属性设置为指向它——JPA只支持这种自动扫描; 如果您不介意与JPA规范不兼容,即使用JPA本身没有的特定提供程序功能,则可以使用Hibernate自动扫描功能: 休眠自动扫描功能:


@ComponentScan不扫描实体,因为组件不是实体。在SpringBoot之外,应该有一个参数为EntityManagerFactory提供这个参数,afaik:您的意思是持久性单元中的标记是必需的@正如@Maciej Marczuk aready所指出的,FlorianSchaetzNo有一个参数用于扫描包。不需要显式地给出每个类。否则您可以使用Spring Boot,它可以自动扫描。@FlorianSchaetz一个bean已经在applicationContext中定义好了。我已经编辑了这个问题,您能检查一下吗?谢谢如果我是你,我会去掉persistence.xml,只使用Spring在那里配置JPA,然后你的属性就可以工作了。或者更好的方法是使用Spring Boot,这使它更简单。@ComponentScan不扫描实体,因为组件不是实体。在SpringBoot之外,应该有一个参数为EntityManagerFactory提供这个参数,afaik:您的意思是持久性单元中的标记是必需的@正如@Maciej Marczuk aready所指出的,FlorianSchaetzNo有一个参数用于扫描包。不需要显式地给出每个类。否则,您可以使用Spring Boot,它可以自动扫描。@FlorianSchaetz bean已经在applicationContext中定义,我已经编辑了这个问题
请检查一下好吗?谢谢如果我是你,我会去掉persistence.xml,只使用Spring在那里配置JPA,然后你的属性就可以工作了。或者更好的是,使用Spring Boot,这样会更简单。谢谢,但是我已经定义了实体管理器工厂的一个bean我已经编辑了这个问题你能看一下吗?你确定你的模型包com.model.entity在你的类路径中吗?try.war\WEB-INF\classes\com\model\entity这是我提取war文件时包的权限谢谢,但是我已经定义了实体管理器工厂的一个bean,我已经编辑了这个问题,你能看一下吗?你确定你的模型包com.model.entity在你的类路径中吗?try.war\WEB-INF\classes\com\model\entity这是我提取war文件时包的权限谢谢:我可以用什么配置Spring使用persistence.xml?我已经添加了这个属性,但它仍然不起作用,我无法理解我缺少了什么:我已经编辑了我的问题以添加persistence.xml。你能看一下吗?@MDaniyal请提供更多引用jpa的applicationContext.xml,如果有什么。这是上下文文件谢谢:我可以使用什么配置Spring使用persistence.xml?我添加了这个属性它仍然不工作,我无法理解我缺少什么:我已经编辑了我的问题以添加persistence.xml。你能看一下吗?@MDaniyal请,提供更多引用jpa的applicationContext.xml(如果有的话)。这是上下文文件
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="corePU" />
    <property name="packagesToScan" value="com" />
</bean>
<persistence-unit name="corePU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>java:/exampleDatasource</jta-data-source>
    <!--<class>com.entity.Address</class>-->

    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <!--<shared-cache-mode>NONE</shared-cache-mode>-->
    <properties>
        <property name="hibernate.hbm2ddl.auto" value="validate" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.show_sql" value="false"/>
        <property name="hibernate.format_sql" value="false"/>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
        <property name="org.hibernate.envers.audit_table_prefix" value="z_"/>
        <property name="hibernate.cache.use_second_level_cache" value="false" />
        <property name="hibernate.generate_statistics" value="false"/>
        <property name="hibernate.cache.use_query_cache" value="false"/>
        <property name="hibernate.archive.autodetection" value="class, hbm" />

    </properties>
</persistence-unit>
21:15:47,463 ERROR [stderr] (default task-4) java.lang.IllegalArgumentException: Unknown entity: com.entity.Address
21:15:47,463 ERROR [stderr] (default task-4)    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1149)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21:15:47,464 ERROR [stderr] (default task-4)    at java.lang.reflect.Method.invoke(Method.java:498)
21:15:47,464 ERROR [stderr] (default task-4)    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
21:15:47,464 ERROR [stderr] (default task-4)    at com.sun.proxy.$Proxy93.persist(Unknown Source)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
21:15:47,464 ERROR [stderr] (default task-4)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21:15:47,464 ERROR [stderr] (default task-4)    at java.lang.reflect.Method.invoke(Method.java:498)
21:15:47,465 ERROR [stderr] (default task-4)    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
21:15:47,465 ERROR [stderr] (default task-4)    at com.sun.proxy.$Proxy50.persist(Unknown Source)
21:15:47,465 ERROR [stderr] (default task-4)    at com.manager.manager.getAddress(manager.java:37)
21:15:47,465 ERROR [stderr] (default task-4)    at com.manager.manager$$FastClassBySpringCGLIB$$e766fff.invoke(<generated>)
21:15:47,465 ERROR [stderr] (default task-4)    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
<persistence-unit name="unitName" transaction-type="RESOURCE_LOCAL">
  <!-- This is required to be spec compliant, Hibernate however supports
       auto-detection even in JSE.
  <class>com.entity.User</class>
  <class>com.entity.Address</class>
  ...
   -->

  <properties>
    <!-- Scan for annotated classes and Hibernate mapping XML files -->
    <property name="hibernate.archive.autodetection" value="class, hbm"/>
    ...
  </properties>
</persistence-unit>