2009-11-01 22 views
12

Estoy tratando de combinar la primavera con Hibernate utilizando anotaciones y estoy consiguiendo el error siguiente:Primavera + Hibernate = entidad desconocida

org.springframework.orm.hibernate3.HibernateSystemException : Unknown entity: entities.Bar; nested exception is org.hibernate.MappingException: Unknown entity: entities.Bar 

Aquí está mi configuración ...

Mi Entidad:

package entities; 

@Entity  
public class Bar implements Serializable 
{ 
    ... 
} 

Mi Bean:

package blah; 

@Repository 
@Service("fooService") 
@RemotingDestination(channels = { "my-amf" }) 
public class Foo 
{ 
    protected HibernateTemplate template; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) 
    { 
    template = new HibernateTemplate(sessionFactory); 
    } 

    @RemotingInclude 
    public void addBar(String name) throws DataAccessException 
    { 
    Bar bar = new Bar(); 
    bar.setName(name); 
    template.save(bar); 
    } 

}

estoy permitiendo anotaciones en la primavera:

<context:annotation-config /> 
<context:component-scan base-package="blah" /> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:~/blahdb/blahdb" /> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>entities.Bar</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

me sale el error cuando llamo mi método Foo.addBar de una aplicación Flex a través BlazeDS.

Me gustaría evitar la configuración adicional y parece que esto debería funcionar.

Estoy usando Spring 3.0.0.RC1, Hibernate Annotations 3.4.0, Tomcat 6.0.20 y Java 1.6.0_15.

¿Alguna idea? Gracias.

+0

Parece una excepción mapeo pero tiene claramente 'bar' sean asignadas, me gustaría comprobar si hay errores tipográficos y luego ver si sus tarros de hibernación son compatibles (con la matriz de compatibilidad) y compatible con la primavera 3. –

+0

I' m utilizando con éxito Spring 3.0.0.RC1 con Hibernate: Core 3.3.2.GA, Annotations 3.4.0.GA. Definitivamente trabajan juntos. –

+1

James, si quiere enviarme un correo electrónico con las partes relevantes de su proyecto, me complace echarle un vistazo y compararlo con mi propio proyecto de trabajo, que como digo suena similar. Mi dirección de correo electrónico es concat ('willie', '.', 'Wheeler') en ese servicio de correo electrónico de Google ... :-) –

Respuesta

31

Pruebe usar import @javax.persistence.Entity y no org.hibernate.annotations.Entity para su anotación Entity.

+1

¡OMG! Tu rock Eso fue totalmente eso. Me siento tan mal por no captar eso. E incluso más que no incluí las importaciones en el código anterior porque no pensé que ese sería el problema. –

+2

Impresionante. 300 puntos de reputación! –

1

Asegúrese de que ha agregado los espacios de nombres propios de su contexto Primavera aplicación XML:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd> 
+0

Ya tengo esos. Gracias sin embargo. –

1

Lo único que ocurre es que de alguna manera su definición annotatedClasses no se encuentra la entidad en cuestión. ¿Se puede verificar dos veces la definición anotada de las clases, incluidos los nombres de los paquetes?

¿Estoy en lo cierto al pensar que este error viene en el arranque? ¿Puedes incluir un poco más del contexto alrededor del mensaje de error? Por ejemplo, yo era capaz de reproducir algo similar a lo que está informando mediante la eliminación de una de las clases de mi definición annotatedClasses:

2009-11-01 10:05:55.593::WARN: Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invo 
cation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.springinpractice.ch06.model.Message.forum references an unknown entity: com.springinpractice.ch06.model. 
Forum: 
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.springinpractice.ch06.model.Message.forum references an unknown entity: com.springinpractice.ch06.model.Forum 
     at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81) 
     at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456) 

[snip]

EDIT: Otra pregunta/idea. ¿Tiene el JAR de anotaciones adecuado (ya sea persistence.jar para JPA o el JAR de anotaciones de Hibernate) en su classpath en tiempo de ejecución?

OTRA EDICIÓN: Una más. ¿Qué versión de JVM está ejecutando?

+0

Gracias Willie por ayudarme con esto. He actualizado la pregunta con más números de versión. Tengo los archivos JAR de anotaciones de Hibernate en mi WEB-INF/lib. –

5

que he encontrado el mismo problema y no encontrar ninguna buena respuesta para esta

Lo que funcionó para mí fue hablar de mis clases de entidad en la persistencia.archivo

(Tanto en los recursos y bajo prueba) xml:

<persistence ...> 
    <persistence-unit ...> 

     <class>com.company.maenad.core.model.News</class> 
     <class>com.company.maenad.core.model.AdExtraInfo</class> 

    </persistence-unit> 
</persistence> 
2

la excepción mencionada anteriormente también occours si la propiedad annotatedClasses utilizado para configurar el sessionFactory no están apuntando hacia las entidades adecuadas en el paquete.

También es aconsejable utilizar los paquetes de propiedadToScan en lugar de clases anotadas, ya que escanea todo el paquete para Entidades, por lo que se evita la mención explícita de Entidades con nombres de clase totalmente calificados.

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
<property name="dataSource" ref="dataSource"></property> 
<property name="packagesToScan" value="com.code.entity"></property> 
<property name="hibernateProperties"> 
<props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
    <prop key="hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
</props> 
</property> 

1

Creo escrito de forma explícita el paquete de ENTIDADES es seguro. Obtuve este error y lo resuelvo usando la anotación de EntityScan.

@EntityScan(basePackages = "your.entities.pakage") 
Cuestiones relacionadas