web-dev-qa-db-fra.com

Données de printemps JPA Java.lang.IllegalArgumentException: pas une entité

J'ai créé un exemple de projet JPA de données de printemps. J'ai utilisé des éclipses pour cela. Il y a deux projets, l'un est un projet d'objet de domaine qui n'a que des classes d'entités annotées. Un autre projet est un projet jpa de données de printemps réel et il a une dépendance pour celui-ci. En réalité, il obtient les classes d'entité de projet de domaine via la dépendance maven.

Projet 1: hrm-domain

Classe d'entité:

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;
    }

Projet 2: hrm-ws-service

persistance-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>

La configuration de mes paquets est donc la suivante: 

src/main/Java - contient le référentiel Spring

src/main/resources - contient le contexte d'application

src/test/Java - contient des tests unitaires

Et dépendance pour le projet 1 (hrm-domain) 

Mon problème est que lorsque je lance ce projet, j'obtiens une erreur comme suit: 

... 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

Je me pose des questions sur ce problème, car lorsque je mets un objet de domaine (Employee.Java) dans mon projet de printemps, il se comporte plutôt bien dans un bocal séparé et fonctionne correctement. Ce problème ne survient que s'il se présente comme un pot séparé. Si quelqu'un a une expérience de ce genre de scénario, aidez-moi s'il vous plaît. 

13
Hasitha

J'ai aussi eu le même problème. Le mien était que je n'avais pas fourni la propriété packagesToScan dans le bean entityManagerFactory, donc Spring ne pouvait pas charger les entités. Consultez la déclaration de bean emf dans votre configuration de printemps xml. Ce qui suit est une déclaration EMF J'espère que cela pourrait vous aider à éliminer l'erreur:

<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>
6
higuaro

Vous n'analysez pas le package com.hrm.ws.data.domain à la recherche de beans annotés avec @Entity. Le conteneur Spring n'a donc aucune connaissance de vos entités et génère par conséquent une exception. Ajoutez les lignes suivantes à votre fichier de configuration persistance-context.xml:

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

Vous devrez également modifier votre élément racine xml comme suit pour que les éléments de contexte soient reconnus:

<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">

Et, si vous ne l'avez pas déjà fait, ajoutez la dépendance spring-context à votre fichier pom.

1
threejeez

Utilisez l'une des options suivantes: -

  1. contexte: composant-scan base-package = "Votre nom de package de base" dans le fichier spring.xml

  2. définir la propriété packagesToScan sur le entityManagerFactory 

  3. utilisez persistence.xml et listez toutes les entités présentes.

0
Mahender Yadav