2012-06-03 7 views
12

Я создал весенние данные JPA образец проекта. Для этого я использовал затмения. Существует два проекта, один из которых - проект объекта домена, который имеет только аннотированные классы сущностей. Другим проектом является фактический проект jpa-данных весны, и он имеет зависимость от одного проекта. Фактически он получает классы сущностей домена проекта через зависимость от maven.Данные весны JPA java.lang.IllegalArgumentException: не объект

Проект 1: HRM-домен

Entity Класс:

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/главная/Java - содержит репозиторий пружинную

SRC/основные/ресурсы - содержит прикладной контекст

SRC/тест/Java - содержит модульные тесты

и зависимость для проекта 1 (HRM -области)

Моя проблема в том, когда я запускаю этот проект я получаю ошибку следующим образом:

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

Мне интересно об этой проблеме, потому что, когда я помещал объект домена (Employee.java) в свой весенний проект, он сам, а не отдельный банк, работает отлично. Эта проблема возникает только в отдельном банке. Если у кого-нибудь есть опыт в подобном сценарии, пожалуйста, помогите мне.

+0

Это невидимый образец, но у Employee есть конструктор? – Dewfy

+2

, пожалуйста, предоставьте содержимое 'persistence.xml'. Название единицы сохранения «jpa.sample» в объекте entityManagerFactory является правильным? – elias

+0

У меня тоже такая же проблема, не могли бы вы выяснить, в чем проблема? Мой проект имеет аннотированные классы в отдельном проекте maven jpa-facet (на который ссылается проект, основанный на maven spring) – higuaro

ответ

1

Вы не просматриваете пакет com.hrm.ws.data.domain для bean-компонентов, аннотированных с @Entity, поэтому весенний контейнер не знает ваших сущностей и, следовательно, создает исключение. Добавьте следующие строки в файл конфигурации 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 (что, конечно, ссылается на проект, основанный на весне)? Я делаю то, что вы сказали, но я продолжаю получать ту же ошибку, что и @Hasitha. Что еще может быть? – higuaro

+0

Проект maven с сущностями должен определять собственный контекст и проверять пакеты, в которых существуют аннотированные объекты. Другой проект (потребитель одного с объектами, который я предполагаю, является основным проектом?) Должен ссылаться на другой контекст, импортируя файл весны xml. Вот пример того, как это сделать: http://www.mkyong.com/spring3/spring-3-javaconfig-import-example/. Тем не менее, трудно сказать, что происходит на самом деле, не видя кода. – threejeez

6

У меня также была та же проблема. Шахта заключалась в том, что я не поставлял свойство packagesToScan в фасоне entityManagerFactory, поэтому Spring не смог загрузить объекты. Ознакомьтесь с объявлением bean-объявления emf в вашей конфигурации xml весны. Ниже приводится заявление 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

У меня нет конфигурационного файла весны xml, так как я исключительно использую аннотации для моей конфигурации боба. Есть ли способ сделать это, используя аннотации с hibernate 5.2.2? – nzhenry

0

Используйте один из следующих варианта: -

  1. контекст: компонент-сканирования базовый пакет = «Ваше базовое имя пакета» весной.XML-файл

  2. установить packagesToScan свойство на использовании persistence.xml EntityManagerFactory

  3. и список всех субъектов там.