Spring:缺少JPA元模型 [英] Spring: Missing JPA Metamodel
本文介绍了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;
@RepositoryDefinition(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屋!
查看全文