2012-06-03 43 views
12

我创建了spring数据JPA示例项目。我用这个eclips。有两个项目,一个是只有注释实体类的域对象项目。其他项目是实际的spring data jpa项目,它对项目之一有依赖性。实际上,它通过Maven依赖关系获取域项目实体类。Spring数据JPA java.lang.IllegalArgumentException:不是实体

项目1:人力资源管理域

实体类:

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

项目2:HRM-WS服务

持久性-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> 

所以安装我的软件包如下:

的src/main/java的 - 包含了春季库

的src /主/资源 - 包括应用程序上下文

的src/test/java下 - 包括单元测试

和依赖的项目1项(HRM -domain)

我的问题是,当我运行这个项目我得到的错误如下:

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

我很想知道这个问题,因为当我把Spring对象(Employee.java)放到我的Spring项目中时,它自我分离的jar工作正常。这个问题只发生它作为一个单独的罐子。如果有任何人有这方面的经验,请给我一个帮助。

+0

它从样本中看不见,但是员工是否有构造函数?请提供 – Dewfy

+2

,提供'persistence.xml'的内容。 bean entityManagerFactory中的持久化单元名称'jpa.sample'是否正确? – elias

+0

我也有同样的问题,你能找出问题所在吗?我的项目在一个单独的maven jpa-facet项目中引入了注释类(从基于maven spring的项目中引用) – higuaro

回答

1

您没有扫描@Entity注释的bean的com.hrm.ws.data.domain包,所以spring容器不知道您的实体,因此产生一个异常。添加以下行到您的持久性-context.xml的配置文件:

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

你还需要改变你的根XML元素如下所以它的上下文元素被认可:

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

而且,如果你还没有添加spring-context依赖到你的pom文件。

+0

我也有同样的问题,如果实体注释类在另一个maven项目(当然是从基于spring的项目引用的)?我做出你所说的话,但我一直得到@Hasitha所做的同样的错误...还有什么可以的? – higuaro

+0

与实体的maven项目应该定义它自己的上下文并扫描注释实体存在的包。另一个项目(包含实体的消费者,我假设它是一个主项目?)应该通过导入spring xml文件来引用其他上下文。以下是如何执行此操作的示例:http://www.mkyong.com/spring3/spring-3-javaconfig-import-example/。也就是说,如果没有看到代码,很难说出实际发生的事情。 – threejeez

6

我也有同样的问题。我是因为我没有提供entityManagerFactory bean中的packagesToScan属性,所以Spring无法加载实体。在spring配置xml中查看emf bean声明。以下是EMF声明,我希望它可以帮助你摆脱错误:下列选项

<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

我没有spring xml配置文件,因为我专门为我的bean配置使用注解。有没有办法做到这一点使用注释与休眠5.2.2? – nzhenry

0

使用一个: -

  1. 方面:组件扫描 基础包= “你的基础包名称”在春天。上的entityManagerFactory

  2. 使用的persistence.xml,并列出所有实体存在的xml文件

  3. 设置packagesToScan属性。

相关问题