EntityManagerFactory 和 SessionFactory 的区别? [复制]

Posted

技术标签:

【中文标题】EntityManagerFactory 和 SessionFactory 的区别? [复制]【英文标题】:Difference between EntityManagerFactory and SessionFactory? [duplicate] 【发布时间】:2013-02-20 18:45:50 【问题描述】:

我是 Hibernate 和 JPA 的新手。现在我正在使用 EntityManagerFactory 实例创建 EntityManager 然后我使用

将此 EntityManager 展开到会话中
entityManager = entityManagerFactory.createEntityManager();
session = entityManager.unwrap(Session.class);

通过使用 EntityManagerFacotry,我们无需创建 Hibernateconfig.xml,我们可以使用 Persistence.xml。但是我的问题是当我使用 Peristenece.xml 时,我无法通过休眠映射文件映射实体类

可以使用 Hibernate Mapping 文件来映射使用 EntityManagerFactory 的实体类吗?

【问题讨论】:

为什么要使用 XML 映射?使用注释。 你会明白的。参考下面的链接。 ***.com/questions/5640778/… 我的要求是我需要使用没有注释的单个类来动态映射不同的表。它只能使用使用 session.save(entityName,object) 的 Hibernate 映射文件。但我无法使用EntityManagerFactory..但它在 sessionFactory 中工作 【参考方案1】:

在您仍然想使用休眠会话的同时使用 jpa 有点奇怪。但是对于您的问题,是的,您可以这样做。这是关于此的另一个问题:How to load a Hibernate 'xxx.hbm.cfg' file in a JPA 2.0 project?。还有一个标签,可以导入hbm.xml文件。

【讨论】:

我们需要为那个类使用@Entity注解吗? 实际上,如果您导入 hbm.xml,则不需要使用 @Entity 注释域类。既然你提到了这一点,我也强烈建议你只用实体注释类并删除 hbm.xml 文件,因为它更方便,可以更好地进行进一步的工作。 我的要求是我需要使用没有注释的单个类来动态映射不同的表。使用注释是不可能的。 什么是动态的?你的意思是表关系会因为某些原因在课堂上发生变化? 我有 5 个表。表名应该不同,但所有表的 Schema 应该是通用的。但我只需要使用一个类来动态映射所有表。【参考方案2】:

简短的回答是肯定的,您可以将 hibernate.cfg.xml 与 JPA 一起使用。只需在创建映射时假装您直接使用休眠即可。但是,你为什么要使用 Session?你不使用 EntityManager#persist() 吗?或#createQuery()? (顺便说一句,EntityManager 是 JPA,Session 是 Hibernate)

【讨论】:

我在persistence.xml 中配置了hibernate-cfg.xml,在hibernate-cfg.xml 中配置了hibernate-hbm.xml。但我尝试部署这段代码时遇到了Hibernate 映射异常。

以上是关于EntityManagerFactory 和 SessionFactory 的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

找不到名为“entityManagerFactory”的bean

带有 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系

在类路径资源中定义名称为“entityManagerFactory”的 bean 创建错误

错误 - NoSuchBeanDefinitionException:没有名为“entityManagerFactory”的bean可用

JPA - 关闭 EntityManagerFactory 引发异常

弹簧靴 |在类路径资源中定义名称为“entityManagerFactory”的 bean 创建错误