【问题标题】:Spring: Missing JPA MetamodelSpring:缺少 JPA 元模型
【发布时间】:2016-08-24 15:06:16
【问题描述】:

我无法理解带有 JPA 存储库的简单 Spring MVC 项目出了什么问题。能不能给个提示。

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

}

存储库

package com.test.app;

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

控制器

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

}

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

例外

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!

【问题讨论】:

  • EntityManagerFactory 的声明在哪里?
  • 如果你“使用 JPA”,为什么到处都有“SessionFactory”的东西?

标签: java spring hibernate


【解决方案1】:

Xstian 是对的。我丢失了 entityManagerFactory 声明。这是一个现在对我有用的示例:

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>

【讨论】:

  • 如果使用 entityManagerFactory 为什么你有 sessionFactory?!
【解决方案2】:

当我在 Spring Boot 中使用 Hibernate 4(用于持久化方式的 SessionFactory,而不是 EntityManagers)时,我遇到了这个问题。添加这个消除了错误。也许对某人有帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2018-07-21
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多