springboot中entityManagerFactory报错的解决方法(springboot,开发技术)

时间:2024-05-05 02:01:03 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

新建springboot项目entityManagerFactory报错

springboot中entityManagerFactory报错的解决方法

解决办法

1.查看注解引入是否正确,实体类和jpa的。

2.检查包的引用是否有冲突

spring生成EntityManagerFactory三种方式

1.LocalEntityManagerFactoryBean

只是简单环境中使用。它使用JPA PersistenceProvider自动检测机制( according to JPA's Java SE bootstrapping ),并且大多数情况下,你只能定义一下persistence unit name

例如:

<beans><beanid="myEmf"class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><propertyname="persistenceUnitName"value="myPersistenceUnit"/></bean></beans>

2.从JNDI获取EntityManagerFactory

这个选项是当你应用发布在javaee5的服务器中。你可以参阅自己应用服务器文档,如何发布一个自定义的JPA provider到你的应用服务器中。

例:

<beans><jee:jndi-lookupid="myEmf"jndi-name="persistence/myPersistenceUnit"/></beans>

当javaee服务器启动时,会自动检测persistence units。实际上,是检测应用包中的META-INF/persistence.xml 文件和web.xml中的persistence-unit-ref,以及定义的environment naming。我理解就是JNDI的name。

一般应用情景是:

在META-INF/persistence.xml中 使用<jta-data-source>java:/ MySqlDS</jta-data-source> 获取容器发布的Datesource。

transactions是使用的javaee容器支持的JTA系统,例如tomcat中,可以这样

如果你的项目准备部署在tomcat上,要支持jta,则需把相关的包放在tomcat/lib包下

1)jndi配置,可以把jndi的配置放置在 tomcat/conf/Catalina/域名(如localhost)/项目名.xml

文件的Context节点下,如下:

<Resourcename=""auth="Container"type="javax.sql.DataSource"username=""password=""driveClassName="oracle.jdbc.driver.OracleDriver"url=""maxActive="45"maxIdle="25"/>

jndi也可以配置在server.xml,context.xml中

2)jta UserTransaction配置

在server.xml文件GlobalNamingResources节点下配置如下:

<!--ResourceconfigurationforUserTransactionuseJOTM--><Resourcename="UserTransaction"auth="Container"type="javax.transaction.UserTransaction"factory="org.objectweb.jotm.UserTransactionFactory"jotm.timeout="60"/>

然后在 项目名.xml 文件的context节点下加:

<ResourceLinkname="UserTransaction"global="UserTransaction"type="javax.transaction.UserTransaction"/>

SPRING 仅仅做的是是把EntityManagerFactory通过依赖注入到应用的object中。如果要管理事务,则使用JtaTransactionManager。

3.LocalContainerEntityManagerFactoryBean

这个选项中,spring扮演了容器的角色。完全掌管JPA。

LocalContainerEntityManagerFactoryBean会根据persistence.xml创造一个PersistenceUnitInfo实现。

<beans><beanid="myEmf"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><propertyname="dataSource"ref="someDataSource"/><propertyname="loadTimeWeaver"><beanclass="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/></property></bean></beans>

不是所有的JPA provider都需要load-time weaving。hibernate就不需要。呵呵。 <property name="loadTimeWeaver">这个就不是必须的了。。

Persistence.xml配置:

<persistencexmlns="http://java.sun.com/xml/ns/persistence"version="1.0"><persistence-unitname="myUnit"transaction-type="RESOURCE_LOCAL"><mapping-file>META-INF/orm.xml</mapping-file><exclude-unlisted-classes/></persistence-unit></persistence>

如何处理多个persistence units。spring提供了PersistenceUnitManager统一管理。

<beanid="pum"class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"><propertyname="persistenceXmlLocations"><list><value>org/springframework/orm/jpa/domain/persistence-multi.xml</value><value>classpath:/my/package/**/custom-persistence.xml</value><value>classpath*:META-INF/persistence.xml</value></list></property><propertyname="dataSources"><map><entrykey="localDataSource"value-ref="local-db"/><entrykey="remoteDataSource"value-ref="remote-db"/></map></property><!--ifnodatasourceisspecified,usethisone--><propertyname="defaultDataSource"ref="remoteDataSource"/></bean><beanid="emf"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><propertyname="persistenceUnitManager"ref="pum"/><propertyname="persistenceUnitName"value="myCustomUnit"/></bean>

dataSources中的key是persistence.xml中配置的datasource名字,value-ref是spring管理的数据源。

另外:

EntityManagerFactory是线程安全的,但是EntityManager不是。

publicclassProductDaoImplimplementsProductDao{privateEntityManagerFactoryemf;@PersistenceUnitpublicvoidsetEntityManagerFactory(EntityManagerFactoryemf){this.emf=emf;}publicCollectionloadProductsByCategory(Stringcategory){EntityManagerem=this.emf.createEntityManager();try{Queryquery=em.createQuery("fromProductaspwherep.category=?1");query.setParameter(1,category);returnquery.getResultList();}finally{if(em!=null){em.close();}}}}

这样使用有个最大问题就是每次都要创建一个新的entityManager。那么该怎么办?

你可以通过@PersistenceContext获取一个transactional EntityManager("shared EntityManager")。为什么称它为transactional?因为它是一个共享的以及线程安全的当前的transactional EntityManager的一个代理。

publicclassProductDaoImplimplementsProductDao{@PersistenceContextprivateEntityManagerem;publicCollectionloadProductsByCategory(Stringcategory){Queryquery=em.createQuery("fromProductaspwherep.category=:category");query.setParameter("category",category);returnquery.getResultList();}}

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:springboot中entityManagerFactory报错的解决方法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:SAP怎么根据TR号码查询TO号码下一篇:

11 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18