2012-06-03 17 views
12

Ho creato il progetto di esempio JPA di dati primaverili. Ho usato eclip per questo. Ci sono due progetti, uno è un progetto di oggetto di dominio che ha solo classi di entità annotate. Altro progetto è il progetto jpa di dati primaverili effettivi e ha una dipendenza per il progetto. In realtà ottiene le classi di entità del progetto di dominio tramite la dipendenza da Maven.Dati primari JPA java.lang.IllegalArgumentException: Non un'entità

Progetto 1: HRM-dominio

Entity classe:

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

Progetto 2: HRM-WS-service

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

Così il l'installazione per i miei pacchetti è la seguente:

src/main/java - contiene il repository primavera

src/main/risorse - contiene contesto applicativo

src/test/java - contiene i test di unità

e dipendenza per il progetto 1 (HRM -domain)

il mio problema è quando faccio funzionare questo progetto sto errore ottenendo come segue:

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

Mi chiedo a proposito di questo problema, perché quando inserisco l'oggetto dominio (Employee.java) nel mio progetto di primavera, piuttosto che un vaso separato funziona correttamente. Questo problema accade solo come un vaso separato. Se qualcuno ha esperienza su uno scenario del genere, per favore mi dia un aiuto.

+0

È invisibile dal campione, ma il dipendente ha un costruttore? – Dewfy

+2

per favore, fornire il contenuto di 'persistence.xml'. Il nome dell'unità di persistenza 'jpa.sample', nell'entità beanManagerFactory, è corretto? – elias

+0

Ho anche lo stesso problema, potresti capire quale fosse il problema? Il mio progetto ha le classi annotate in un progetto maven jpa-facet separato (a cui fa riferimento il progetto basato su spring maven) – higuaro

risposta

1

Non si sta analizzando il pacchetto com.hrm.ws.data.domain per i bean annotati con @Entity, in modo che il contenitore spring non sia a conoscenza delle proprie entità e pertanto produca un'eccezione. Aggiungere le seguenti righe al file di configurazione persistance-context.xml:

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

Avrete anche bisogno di cambiare il vostro elemento XML radice come segue in modo che gli elementi di contesto sono riconosciuti:

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

E , se non lo hai già fatto, aggiungi la dipendenza del contesto molla al tuo file pom.

+0

Ho anche lo stesso problema, cosa succede se le classi annotate entità sono in un altro progetto maven (che ovviamente fa riferimento al progetto basato sulla primavera)? Faccio quello che hai detto, ma continuo a ricevere lo stesso errore di @Hasitha ... Cos'altro potrebbe essere? – higuaro

+0

Il progetto maven con le entità deve definire un proprio contesto ed eseguire la scansione dei pacchetti in cui sono presenti le entità annotate. L'altro progetto (il consumatore di quello con le entità, che sto assumendo è un progetto principale?) Dovrebbe fare riferimento all'altro contesto importando il file xml primaverile. Ecco un esempio su come farlo: http://www.mkyong.com/spring3/spring-3-javaconfig-import-example/. Detto questo, è difficile dire cosa sta realmente accadendo senza vedere il codice. – threejeez

6

Ho anche avuto lo stesso problema. Il mio era che non ho fornito la proprietà packagesToScan nel bean entityManagerFactory, quindi Spring non poteva caricare le Entità. Controlla la dichiarazione del bean emf nel tuo xml di configurazione di primavera. La seguente è una dichiarazione di EMF Spero che ti potrebbe aiutare a sbarazzarsi l'errore:

<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

Non ho un file di configurazione xml primaverile poiché utilizzo esclusivamente annotazioni per la configurazione del mio bean. C'è un modo per farlo usando le annotazioni con ibernazione 5.2.2? – nzhenry

0

utilizzare una delle seguenti opzioni: -

  1. context: component-scan base-package = "Il nome del pacchetto base" in primavera.file xml

  2. impostare la proprietà packagesToScan sul EntityManagerFactory

  3. uso persistence.xml e lista tutte le entità lì.

Problemi correlati