Spring:缺少JPA元模型 [英] Spring: Missing JPA Metamodel

查看:177
本文介绍了Spring:缺少JPA元模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法理解我使用JPA存储库的简单Spring MVC项目出了什么问题。

域名

  package com.test.app; 
$ b $ @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在这里...

}



存储库

  package com.test.app; 

@RepositoryDe​​finition(domainClass = FooDomain.class,idClass = Long.class)
public interface FooRepository扩展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());
返回家;
}

}

root-context.xml

 <?xml version =1.0encoding =UTF- 8\" >?; 
< beans xmlns& xsi在这里...>
< context:annotation-config />

<! - 定义包含bean组件的文件夹(@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在这里...> 

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

< bean id =dataSourceclass =org.apache.tomcat.dbcp.dbcp.BasicDataSource>
< property name =driverClassNamevalue =$ {jdbc.driverClassName}/>
< property name =urlvalue =$ {jdbc.url}/>
< property name =usernamevalue =$ {jdbc.user}/>
< property name =passwordvalue =$ {jdbc.pass}/>
< / bean>

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

< / beans>

repositories.xml

 <?xml version =1.0encoding =UTF-8?> 
< beans xmlns& xsi在这里...>

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

< / beans>

例外

 错误:org.springframework.web.context.ContextLoader  - 上下文初始化失败
org.springframework.beans.factory.BeanCreationException:创建名为'jpaMapppingContext'的bean时出错:调用初始化方法失败;嵌套异常是ja
va.lang.IllegalArgumentException:必须存在至少一个JPA元模型!
导致:java.lang.IllegalArgumentException:必须存在至少一个JPA元模型!


解决方案

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 =dataSourceclass =org.apache.tomcat.dbcp.dbcp.BasicDataSource>
< property name =driverClassNamevalue =$ {jdbc.driverClassName}/>
< property name =urlvalue =$ {jdbc.url}/>
< property name =usernamevalue =$ {jdbc.user}/>
< property name =passwordvalue =$ {jdbc.pass}/>
< / bean>

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

< bean id =jpaVendorAdapterclass =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
< property name =showSqlvalue =true/>
< property name =generateDdlvalue =true/>
< property name =databasevalue =MYSQL/>
< / bean>

< bean id =entityManagerFactoryclass =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
< property name =dataSourceref =dataSource/>
< property name =jpaVendorAdapterref =jpaVendorAdapter/>
<! - 基于弹簧的实体类扫描> - >
< property name =packagesToScanvalue =com.test.app/>
< / bean>

<! - 启用Hibernate @Transactional编程模型 - >
< tx:注解驱动的事务管理器=transactionManager/>

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

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

< / beans>


I cannot understand what is going wrong with my simple Spring MVC project with JPA repositories. Could you please give a hint.

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

}

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>

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!

解决方案

Xstian is right. I've lost entityManagerFactory declaration. Here is a sample that is working for me now:

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>

这篇关于Spring:缺少JPA元模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆