当前位置: 首页 > 知识库问答 >
问题:

实体管理器管理的实体在堆内存中有2个对象吗?

危彬彬
2023-03-14

在我的DAO类中,假设我有实体管理器'em'是由实体管理器工厂制作的,之后的代码如下所示:-

CarEntity carEntity = new CarEntity;//line 1
carEntity.setName("XYZ");           //line 2

当我执行上面的代码行时,在堆内存中创建了一个对象,并在其中存储了其实例变量“xyz”的值。

em.getTransaction().begin();
em.persist(carEntity);         //line 3

在第3行之后,如我们所知,carEntity对象进入托管状态。它将不会转到数据库,直到我刷新或提交事务。

那么实体管理器如何知道一个实体已经进入托管状态呢?执行第3行后,是否为CarEntity创建了一个新对象?或者它在堆中的内存位置是否有任何改变,表明它的状态从“新状态”改变为“托管状态”?

在AFAIK中,处于托管状态的实体在持久上下文(也是堆的一个区域)中被分配内存。这是否意味着内存再次分配给堆中的托管实体。

共有1个答案

鲁淇
2023-03-14

向列表中添加实体时会发生什么情况?列表只是有一个对实体的引用。对于持久性上下文也是一样的。它保持对托管实体的引用。它知道一个实体是受管理的,因为该实体在其受管理实体的集合中。

 类似资料:
  • 我正在使用Spring的事务支持和JPA(Hibernate)来持久化我的实体。一切正常,但我在处理一个请求中的部分更新时陷入困境: 对于每个用户(HTTP)请求,我必须将一个日志条目写入数据库表,即使“主”业务实体的更新失败(例如,由于验证错误)。因此,我的第一个/主要事务get被回滚,但第二个(写日志)应该提交。这似乎可以使用正确的传播级别来写入日志条目: 然而,我的问题是,我在第二个事务中注

  • 我试图使用spring boot将EntityManager注释注入到我的DAO中,但是得到一个< code > InvalidDataAccessApiUsageException 消息,说没有可用的事务EntityManager。我的印象是,只要Spring Boot从< code>application.yml中获得了我的数据源信息,并且我用< code>@PersitenceContext

  • 我有一个用例,我想我需要两个实体管理器,它们访问相同的持久性单元。所以本质上,我希望在同一个数据库上有两个持久性上下文。这是否可以通过PersistenceContext注释实现? 我想写以下内容,但不知道如何告诉JPA注入两个不同的manager实例。 我想我可以切换到应用程序管理的事务,然后我可以使用工厂创建另一个事务。但是我不想自己管理事务,如果不是绝对必要的话。

  • 但问题是这将只锁定一行,而我想在计算总行数时锁定整个表(实体)。 请指教。

  • 我有一个在Eclipse中定义的非常基本的JavaEE应用程序(一个EJB,一个带有PrimeFaces的网页,一个JPA实体)。它有四个项目,一个用于EAR,一个用于EJB,一个用于JPA,一个用于Web部件。问题是,我试图在JPA项目的persistence.xml中配置HiberNate作为持久化框架,但它并没有像我预期的那样完全工作。在我的EJB(@Statless)中,我可以通过两种方式

  • 有什么能帮上忙的吗?有人能解释一下为什么没有对对象进行更改时行不更新吗?:)谢谢!