2012-06-03 33 views
12

He creado el proyecto de muestra JPA de datos de primavera. Usé eclips para esto. Hay dos proyectos, uno es el proyecto de objeto de dominio que solo tiene clases de entidad anotadas. Otro proyecto es el proyecto real jpa de primavera y tiene una dependencia para el proyecto. En realidad, obtiene clases de entidad de proyecto de dominio a través de la dependencia de maven.Datos de primavera JPA java.lang.IllegalArgumentException: No es una entidad

Proyecto 1: gestión de recursos humanos en el dominio

Entidad clase:

package com.hrm.ws.data.domain; 

import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Inheritance; 
import javax.persistence.InheritanceType; 
import javax.persistence.Table; 



@Entity(name = "Employee") 
@Table(name = "employee") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Employee { 

    protected long id; 

    protected String firstName; 

    protected String lastName; 

    /** 
    * Gets the value of the id property. 
    * 
    */ 
    @Id 
    @Column(name = "id", scale = 0) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getId() { 
     return id; 
    } 

Proyecto 2: HRM-ws-servicio

persistencia-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd 
          http://www.springframework.org/schema/data/jpa 
          http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 


     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name="driverClassName" value="${jdbc.driverClassName}"/> 
      <property name="url" value="${jdbc.url}"/> 
      <property name="username" value="${jdbc.username}"/> 
      <property name="password" value="${jdbc.password}"/> 
     </bean> 

     <jpa:repositories base-package="com.hrm.ws.data.repository" /> 


     <bean id="employeeDao" class="com.hrm.ws.data.repository.EmployeeRepositoryImpl"/>  


     <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 

       <property name="entityManagerFactory" ref="entityManagerFactory" /> 
       <property name="jpaDialect"> 
       <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
       </property> 

     </bean> 

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 

       <property name="dataSource" ref="dataSource" /> 

       <property name="jpaVendorAdapter"> 
       <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
        <property name="generateDdl" value="${jdbc.generateDdl}" /> 
        <property name="showSql" value="${jdbc.showSql}"/> 
       </bean> 
       </property> 
       <property name="persistenceUnitName" value="jpa.sample" /> 

     </bean> 

</beans> 

Así que la la configuración para mis paquetes es la siguiente:

src/main/java - contiene el repositorio de primavera

src/main/resources - contiene contexto de aplicación

src/test/java - contiene las pruebas unitarias

y la dependencia para el proyecto 1 (HRM -domain)

Mi problema es cuando corro este proyecto que estoy recibiendo el error de la siguiente manera:

... 38 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an entity: class com.hrm.ws.data.domain.Employee 
    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:1429) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) 
    ... 40 more 


**Caused by: java.lang.IllegalArgumentException: Not an entity: class** com.hrm.ws.data.domain.Employee 
    at org.hibernate.ejb.metamodel.MetamodelImpl.entity(MetamodelImpl.java:160) 
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:52) 
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:61) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:145) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:83) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:66) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:146) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:120) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:39) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 
    ... 48 more 

Me pregunto acerca de este problema, porque cuando pongo el objeto de dominio (Employee.java) en mi proyecto de primavera, el archivo jar bastante separado funciona bien. Este problema solo ocurre, se da como un jar separado. Si alguien tiene experiencia sobre un escenario como ese, por favor, dame una ayuda.

+0

Es invisible de la muestra, pero ¿el empleado tiene un constructor? – Dewfy

+2

por favor, proporcione el contenido de 'persistence.xml'. El nombre de la unidad de persistencia 'jpa.sample', en el bean entityManagerFactory, ¿es correcto? – elias

+0

También tengo el mismo problema, ¿podría averiguar cuál era el problema? Mi proyecto tiene las clases anotadas en un proyecto maven jpa-facet separado (al que se hace referencia desde el proyecto basado en maven spring) – higuaro

Respuesta

1

No está escaneando el paquete com.hrm.ws.data.domain para beans anotados con @Entity por lo que el contenedor de primavera no tiene conocimiento de sus entidades y por lo tanto produce una excepción. Añadir las siguientes líneas a su archivo de configuración persistencia-context.xml:

<context:annotation-config /> 
<context:component-scan base-package="com.hrm.ws.data.domain" /> 

También tendrá que cambiar su elemento XML raíz de la siguiente manera por lo que se reconocen los elementos de contexto:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd 
          http://www.springframework.org/schema/data/jpa 
          http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

Y , si aún no lo has hecho, agrega la dependencia del contexto de primavera a tu archivo pom.

+0

También tengo el mismo problema, ¿qué pasa si las clases anotadas por la entidad están en otro proyecto maven (que, por supuesto, se hace referencia desde el proyecto de primavera)? Hago lo que dijiste pero sigo recibiendo el mismo error que @Hasitha ... ¿Qué más podría ser? – higuaro

+0

El proyecto maven con las entidades debe definir un contexto propio y analizar los paquetes donde existen las entidades anotadas. El otro proyecto (consumidor de uno con las entidades, que asumo es un proyecto principal?) Debe hacer referencia al otro contexto al importar el archivo xml de primavera. Aquí hay un ejemplo de cómo hacer esto: http://www.mkyong.com/spring3/spring-3-javaconfig-import-example/. Dicho esto, es difícil saber qué está sucediendo realmente sin ver el código. – threejeez

6

También tuve el mismo problema. La mía era que no proporcioné la propiedad packagesToScan en el bean entityManagerFactory, por lo que Spring no pudo cargar las entidades. Consulte la declaración de beans emf en su configuración de primavera xml. La siguiente es una declaración EMF espero que podría ayudar a deshacerse del error:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="packagesToScan" value="com.hrm.ws.data.domain" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
</bean> 
+0

No tengo un archivo de configuración spring xml ya que estoy usando anotaciones exclusivamente para la configuración de mi bean. ¿Hay alguna manera de hacerlo usando anotaciones con hibernate 5.2.2? – nzhenry

0

Utilice una de las siguientes opciones: -

  1. contexto: componente de exploración base paquete = "El nombre de su paquete base" en la primavera.archivo XML

  2. establecer la propiedad packagesToScan en el EntityManagerFactory

  3. uso persistence.xml y la lista de todas las entidades allí.

Cuestiones relacionadas