gpt4 book ai didi

java - Hibernate EntityManager,它应该用作单例吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:23 27 4
gpt4 key购买 nike

我没有使用 Spring,所以我在类中创建了一个 EntityManager 实例。

我使用 Hibernate-Eclipse 逆向工程来自动生成类。这些类都有一个 EntityManager 的实例。

我不是 100% 确定 Hibernate 是如何与 EntityManager 一起工作的,所以我想知道创建这么多这个类 (EntityManager) 的实例是否可以,例如,事务会不会有问题?

我是否应该创建一个单独的类来为所有其他类分发 EntityManager 的静态实例?还是没关系?

编辑:我看到有一个叫做@PersistenceContext 的东西,它似乎没有将我的 persistence.xml 作为 bean 加载到实例变量中,这个功能需要 spring 吗? (我得到空指针异常,因为它从未被注入(inject))

我尝试使用@persistencecontext 的代码片段

@PersistenceContext(unitName = "manager1")
private EntityManager entityManager;

我的持久化.xml

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>

<properties>

<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="mypassword"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/ptbrowserdb"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
</persistence>

最佳答案

请参阅本文:JPA Architecture它解释得很好。

一般来说,每个事务需要一个实体管理器。并且这个 Entity Manager 不能同时在两个事务中使用。

澄清:我的意思是,不要为不同的工作单元使用单个实体管理器。典型的一个工作单元中的一个事务,如果你有一个工作单元的不同事务,那么你可以使用相同的实体管理器

如果您使用 Spring,那么当您使用 @PersistenceContext 注释注入(inject) EntityManager 时,Spring 会为您执行此处理。默认情况下,Spring 将注入(inject)的 EntityManager(通过代理)“绑定(bind)”到当前事务。 (并且事务“绑定(bind)”到线程。)

@见Spring Reference 13.5.2 Implementing DAOs based on plain JPA - 它在代码示例之后包含一个有趣的段落。

关于java - Hibernate EntityManager,它应该用作单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9370819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com