2012-06-03 6 views
12

Ich habe Federdaten JPA Beispielprojekt erstellt. Ich habe Eclips dafür benutzt. Es gibt zwei Projekte, eines ist das Domänenobjektprojekt, das nur Entitätsklassen kommentiert hat. Anderes Projekt ist das eigentliche Frühjahrsdatenprojekt jpa und es hat eine Abhängigkeit für das Projekt. Tatsächlich erhält es Domain-Projekt-Entity-Klassen über Maven-Abhängigkeit.Spring Daten JPA java.lang.IllegalArgumentException: Keine Entität

Projekt 1: HRM-Domäne

Entity Klasse:

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

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

So ist die Setup für meine Pakete ist wie folgt:

src/main/java - enthält die Feder Repository

src/main/resources - enthält Kontext Anwendung

src/test/java - Unit-Tests

und Abhängigkeit für das Projekt 1 (HRM enthält -Domäne)

Mein Problem ist, wenn ich laufe dieses Projekt, das ich Störung erhalte wie folgt:

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

Ich wundere mich über dieses Problem, weil, wenn ich Domain-Objekt (Employee.java) in meinem Frühjahrsprojekt selbst es eher separaten Glas setzen, funktioniert es gut. Dieses Problem tritt nur als separates Krug auf. Wenn jemand Erfahrung mit einem solchen Szenario hat, bitte hilf mir.

+0

Es ist unsichtbar aus Beispiel, aber haben Mitarbeiter einen Konstruktor? – Dewfy

+2

Bitte geben Sie den Inhalt der 'persistence.xml' an. Der Name der Persistenzeinheit "jpa.sample" in der Bean entityManagerFactory ist korrekt? – elias

+0

Ich habe auch das gleiche Problem, könnten Sie herausfinden, was das Problem war? Mein Projekt hat die annotierten Klassen in einem getrennten maven jpa-facet-Projekt (das aus dem maven spring-basierten Projekt referenziert wird). – higuaro

Antwort

1

Sie scannen das com.hrm.ws.data.domain-Paket für mit @Entity annotierte Beans nicht, sodass der Spring-Container keine Kenntnis von Ihren Entitäten hat und daher eine Ausnahme erzeugt. Fügen Sie die folgenden Zeilen zu Ihrer persistance-context.xml Konfigurationsdatei:

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

Sie werden auch Ihr Root-XML-Element ändern müssen, wie so folgt die Kontextelemente erkannt:

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

Und Falls noch nicht geschehen, fügen Sie die Spring-Kontextabhängigkeit zu Ihrer Pom-Datei hinzu.

+0

Ich habe auch das gleiche Problem, was passiert, wenn die Einheit mit Anmerkungen Klassen in einem anderen sind Maven-Projekt (das wird natürlich aus dem Frühjahrsprojekt bezogen)? Ich mache das, was du gesagt hast, aber ich bekomme immer den gleichen Fehler wie @Hasitha ... Was könnte es sonst noch sein? – higuaro

+0

Das Maven-Projekt mit den Entitäten sollte einen eigenen Kontext definieren und die Pakete scannen, in denen die annotierten Entitäten vorhanden sind. Das andere Projekt (Konsument desjenigen mit den Entitäten, von denen ich annehme, dass es ein Hauptprojekt ist?) Sollte auf den anderen Kontext verweisen, indem er die Spring-XML-Datei importiert. Hier ein Beispiel, wie man das macht: http://www.mkyong.com/spring3/spring-3-javaconfig-import-example/. Das heißt, es ist schwer zu sagen, was eigentlich vor sich geht, ohne den Code zu sehen. – threejeez

6

Ich hatte auch das gleiche Problem. Meines war, dass ich die packagesToScan Eigenschaft in der entityManagerFactory Bohne nicht lieferte, also konnte Frühling die Wesen nicht laden. Überprüfen Sie die Bean-Deklaration emf in Ihrer Frühlingskonfiguration xml. Das Folgende ist eine EMF Erklärung ich hoffe, es könnte Ihnen helfen, den Fehler loszuwerden:

<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

Ich habe keine Spring-XML-Konfigurationsdatei, da ich ausschließlich Anmerkungen für meine Bean-Konfiguration verwende. Gibt es eine Möglichkeit, dies mithilfe von Anmerkungen mit Hibernate 5.2.2 zu tun? – nzhenry

0

Verwenden Sie eine der folgenden Option: -

  1. Kontext: component-scan Basis-Paket = "Ihr Basispaketname" im Frühjahr.XML-Datei

  2. gesetzt packagesToScan Eigenschaft auf der EntityManagerFactory

  3. Verwendung persistence.xml und Liste alle dort Einheiten.

Verwandte Themen