2009-11-01 15 views
12

Ich versuche Frühling mit Hibernate Annotations zu kombinieren, und ich die folgende Fehlermeldung erhalten:Spring + Hibernate = Unbekannte Entität

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

Hier ist mein Setup ...

Meine Entity:

package entities; 

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

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

}

Ich ermögliche Anmerkungen im Frühjahr:

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

erhalte ich die Fehlermeldung, wenn ich meine Foo.addBar Methode aus einer Flex-Anwendung durch BlazeDS nennen.

Ich würde wirklich gerne zusätzliche Konfiguration vermeiden und es scheint, das sollte alles funktionieren.

Ich verwende Spring 3.0.0.RC1, Hibernate Annotationen 3.4.0, Tomcat 6.0.20 und Java 1.6.0_15.

Irgendwelche Ideen? Vielen Dank.

+0

Sieht aus wie eine Abbildung Ausnahme, aber sie haben eindeutig 'Bar' abgebildet, würde ich für irgendwelche Fehler überprüfen und dann sehen, ob Ihre Hibernate Gläser kompatibel sind (mit der Kompatibilitätsmatrix) und kompatibel mit Feder 3. –

+0

I‘ m erfolgreich Spring 3.0.0.RC1 mit Hibernate: Core 3.3.2.GA, Anmerkungen 3.4.0.GA. Also arbeiten sie definitiv zusammen. –

+1

James, wenn du mir die relevanten Teile deines Projekts per E-Mail schicken willst, schaue ich mir das gerne an und vergleiche es mit meinem eigenen Arbeitsprojekt, das, wie ich schon sagte, ähnlich klingt. Meine E-Mail-Adresse ist concat ('willie', '.', 'Wheeler') bei diesem Google-E-Mail-Dienst ... :-) –

Antwort

31

Verwenden Sie import @javax.persistence.Entity und nicht org.hibernate.annotations.Entity für Ihre Entity Annotation.

+1

OMG! Du schaukelst. Das war es total. Ich fühle mich so lahm, dass ich das nicht verstanden habe. Und noch lamer, dass ich die Importe nicht einmal in den obigen Code aufgenommen habe, weil ich das nicht für das Problem hielt. –

+2

Ehrfürchtig. 300 Rufpunkte! –

1

Stellen Sie sicher, dass Sie die richtigen Namespaces Ihre Spring-app Kontext XML hinzugefügt haben:

<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

Ich habe diese schon. Trotzdem danke. –

1

Das einzige, was ich an, dass irgendwie ist Ihre annotatedClasses ist denken kann Definition die die betreffende Stelle fehlt. Können Sie Ihre annotiertenClasses-Def, einschließlich Paketnamen, noch einmal überprüfen?

Bin ich der Meinung, dass dieser Fehler beim Start auftritt? Können Sie etwas mehr von dem Kontext um die Fehlermeldung einbeziehen? Zum Beispiel war ich in der Lage etwas Ähnliches zu reproduzieren, was Sie durch das Entfernen einer der Klassen von meiner annotatedClasses Definition berichten:

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) 

[schnipp]

EDIT: eine andere Frage/Idee. Haben Sie die entsprechenden Anmerkungen JAR (entweder persistence.jar für JPA oder Hibernate Annotations JAR) auf Ihrem Laufzeitklassenpfad?

ANDERE EDIT: Ein mehr. Welche JVM-Version verwendest du?

+0

Danke Willie, dass er mir dabei geholfen hat. Ich habe die Frage mit mehr Versionsnummern aktualisiert. Ich habe die Hibernate Annotations JARs in meinem WEB-INF/lib. –

5

Ich habe das gleiche Problem festgestellt und keine gute Antwort auf diese

fanden Was für mich gearbeitet wurde, um meine Entitätsklassen in der Beharrlichkeit zu erklären.XML-Datei

(beide unter Ressourcen und unter Test):

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

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

    </persistence-unit> 
</persistence> 
2

Die oben erwähnte Ausnahme occours auch wenn die annotatedClasses Eigenschaft verwendet, um die session zu konfigurieren ist nicht auf den richtigen Stellen, in der Verpackung zeigt.

Es ist auch ratsam, die Eigenschaft packagesToScan anstelle von announcedClasses zu verwenden, da das gesamte Paket nach Entities gescannt wird. Explizite Erwähnung von Entitäten mit vollständig qualifizierten Klassennamen wird so vermieden.

<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

Ich denke, das Schreiben ausdrücklich das Paket von entites sicher ist. Ich habe diesen Fehler und lösen mit EntityScan Annotation.

@EntityScan(basePackages = "your.entities.pakage") 
Verwandte Themen