2014-11-04 10 views
9

Ich kann nicht verstehen, was mit meinem einfachen Spring MVC-Projekt mit JPA-Repositorys falsch läuft. Könnten Sie bitte einen Hinweis geben.Spring: Missing JPA Metamodell

Domain:

package com.test.app; 

@Entity 
@Table(name = "foo_table") 
public class FooDomain { 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    private Integer id; 

    @Column(name = "text", nullable = false) 
    private String text; 

    // getters & setters here... 

}

Repository

package com.test.app; 

@RepositoryDefinition(domainClass=FooDomain.class, idClass=Long.class) 
public interface FooRepository extends CrudRepository<FooDomain, Long> {} 

-Controller

@Controller 
public class HomeController { 

    @Autowired 
    private FooRepository fooRepository; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, Model model) { 
     model.addAttribute("rowsNumber", fooRepository.count()); 
     return "home"; 
    } 
}

wurzel context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns & xsi here...> 
    <context:annotation-config /> 

    <!-- Defining folders containing bean components (@Component, @Service) --> 
    <context:component-scan base-package="ru.lexikos.app" /> 

    <import resource="hibernate.xml" /> 

    <import resource="repositories.xml" /> 

    <context:component-scan base-package="com.test.app" /> 
</beans> 

hibernate.xml

<?xml xmlns & xsi here...> 

    <context:property-placeholder location="classpath:db-connection.properties" /> 

    <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.user}" /> 
     <property name="password" value="${jdbc.pass}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      </props> 
     </property> 
    </bean> 

</beans> 

repositories.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns & xsi here...> 

    <jpa:repositories base-package="com.test.app"/> 

</beans> 

Exception

ERROR: org.springframework.web.context.ContextLoader - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMapppingContext': Invocation of init method failed; nested exception is ja 
va.lang.IllegalArgumentException: At least one JPA metamodel must be present! 
Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present! 
+4

Wo ist die Deklaration von EntityManagerFactory? – Xstian

+0

Wenn Sie "JPA" verwenden, warum haben Sie "SessionFactory" Zeug überall? –

Antwort

9

Xstian ist richtig. Ich habe die EntityManagerFactory-Deklaration verloren. Hier ist ein Beispiel, das für mich arbeitet jetzt:

hibernate.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" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     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.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 

    <context:property-placeholder location="classpath:db-connection.properties" /> 

    <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.user}" /> 
     <property name="password" value="${jdbc.pass}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true"/> 
     <property name="generateDdl" value="true"/> 
     <property name="database" value="MYSQL"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <!-- spring based scanning for entity classes>--> 
     <property name="packagesToScan" value="com.test.app"/> 
    </bean> 

    <!-- Enables the Hibernate @Transactional programming model --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <jpa:repositories base-package="com.test.app"/> 

</beans> 
+0

und wenn Sie entityManagerFactory verwenden, warum haben Sie sessionFactory ?! –

0

ich dieses Problem konfrontiert, als ich mit Hibernate 4 (Session für die Persistenz Art und Weise, statt EntityManagers) mit Feder Boot. Durch das Hinzufügen wurde der Fehler behoben. Vielleicht hilft jemand.

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.6.0.Final</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hibernate</groupId> 
       <artifactId>ejb3-persistence</artifactId> 
       </exclusion> 
       <exclusion> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-annotations</artifactId> 
     </exclusion> 
    </exclusions>    
</dependency>