2014-11-04 59 views
9

Tôi không thể hiểu những gì đang xảy ra với dự án Spring MVC đơn giản của tôi với các kho lưu trữ JPA. Bạn có thể vui lòng đưa ra một gợi ý.Mùa xuân: Thiếu JPA Metamodel

miền:

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

khiển

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

}

gốc 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

Tuyên bố của EntityManagerFactory ở đâu? – Xstian

+0

nếu bạn đang "sử dụng JPA" tại sao bạn có công cụ "SessionFactory" trên khắp nơi? –

Trả lời

9

Xstian là đúng. Tôi đã mất tờ khai entityManagerFactory. Đây là một mẫu mà đang làm việc cho tôi ngay bây giờ:

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

và nếu sử dụng entityManagerFactory tại sao bạn có sessionFactory ?! –

0

tôi phải đối mặt với vấn đề này, khi tôi đã sử dụng Hibernate 4 (SessionFactory cho persistence cách, thay vì EntityManagers) với mùa xuân Khởi động. Thêm điều này đã loại bỏ lỗi. Có lẽ giúp ai đó.

<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> 
Các vấn đề liên quan