新建springboot项目时|新建springboot项目时,entityManagerFactory报错的解决
目录
- 新建springboot项目entityManagerFactory报错
- 解决办法
- spring生成EntityManagerFactory三种方式
- 1.LocalEntityManagerFactoryBean
- 2.从JNDI获取EntityManagerFactory
- 3.LocalContainerEntityManagerFactoryBean
新建springboot项目entityManagerFactory报错
文章图片
解决办法
1.查看注解引入是否正确,实体类和jpa的。
2.检查包的引用是否有冲突
spring生成EntityManagerFactory三种方式
1.LocalEntityManagerFactoryBean
只是简单环境中使用。它使用JPA PersistenceProvider自动检测机制( according to JPA's Java SEbootstrapping ),并且大多数情况下,你只能定义一下persistence unit name
例如:
2.从JNDI获取EntityManagerFactory
这个选项是当你应用发布在javaee5的服务器中。你可以参阅自己应用服务器文档,如何发布一个自定义的JPA provider到你的应用服务器中。
例:
当javaee服务器启动时,会自动检测persistence units。实际上,是检测应用包中的META-INF/persistence.xml 文件和web.xml中的persistence-unit-ref,以及定义的environment naming。我理解就是JNDI的name。
一般应用情景是:
在META-INF/persistence.xml中 使用
transactions是使用的javaee容器支持的JTA系统,例如tomcat中,可以这样
如果你的项目准备部署在tomcat上,要支持jta,则需把相关的包放在tomcat/lib包下
1)jndi配置,可以把jndi的配置放置在tomcat/conf/Catalina/域名(如localhost)/项目名.xml
文件的Context节点下,如下:
jndi也可以配置在server.xml,context.xml中
2)jta UserTransaction配置
在server.xml文件GlobalNamingResources节点下配置如下:
然后在 项目名.xml 文件的context节点下加:
SPRING 仅仅做的是是把EntityManagerFactory通过依赖注入到应用的object中。如果要管理事务,则使用JtaTransactionManager。
3.LocalContainerEntityManagerFactoryBean
这个选项中,spring扮演了容器的角色。完全掌管JPA。
LocalContainerEntityManagerFactoryBean会根据persistence.xml创造一个PersistenceUnitInfo实现。
不是所有的JPA provider都需要load-time weaving。hibernate就不需要。呵呵。 这个就不是必须的了。。
Persistence.xml配置:
META-INF/orm.xml
如何处理多个persistence units。spring提供了PersistenceUnitManager统一管理。
org/springframework/orm/jpa/domain/persistence-multi.xml classpath:/my/package/**/custom-persistence.xml classpath*:META-INF/persistence.xml
dataSources中的key是persistence.xml中配置的datasource名字,value-ref是spring管理的数据源。
另外:
EntityManagerFactory是线程安全的,但是EntityManager不是。
public class ProductDaoImpl implements ProductDao {private EntityManagerFactory emf; @PersistenceUnitpublic void setEntityManagerFactory(EntityManagerFactory emf) {this.emf = emf; }public Collection loadProductsByCategory(String category) {EntityManager em = this.emf.createEntityManager(); try {Query query = em.createQuery("from Product as p where p.category = ?1"); query.setParameter(1, category); return query.getResultList(); }finally {if (em != null) {em.close(); }}}}
这样使用有个最大问题就是每次都要创建一个新的entityManager。那么该怎么办?
你可以通过@PersistenceContext获取一个transactional EntityManager("shared EntityManager")。为什么称它为transactional?因为它是一个共享的以及线程安全的当前的transactional EntityManager的一个代理。
public class ProductDaoImpl implements ProductDao {@PersistenceContextprivate EntityManager em; public Collection loadProductsByCategory(String category) {Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); return query.getResultList(); }}
结束了。
【新建springboot项目时|新建springboot项目时,entityManagerFactory报错的解决】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 解决springboot没有启动标识|解决springboot没有启动标识,启动类也没有启动标识的问题
- C语言|推荐一些嵌入式、C/C++的开源库和项目
- SpringBoot|javaweb后台开发SSM框架
- JavaWeb|基于SpringBoot+SSM实现的后台开发框架
- vite创建vue3+ts+ant design vue项目
- Vue|黑马头条移动项目(十)(登录页面的布局)
- VUE|基于Vant组件的Vue移动端黑马头条项目Day01 处理rem适配 字体图标 封装axios
- vue|一个基于vue3+vite+ts的完整项目
- CSS|采用官方最简单的办法搭建vite+vue+ts开发项目框架
- SpringBoot如何通过配置文件(yml|SpringBoot如何通过配置文件(yml,properties)限制文件上传大小