首页 / 知识
关于Java:从JPA / EJB3持久性上下文分离实体
2023-04-13 10:37:00

Detach an entity from JPA/EJB3 persistence context分离通过EntityManager获取的特定JPA实体Bean的最简单方法是什么。 或者,我是否可以首先通过查询返回分离的对象,使它们本质上充当"只读"对象? 之所以这样做,是因为我想修改Bean中的数据-仅在我的应用程序中,而从未将其持久化到数据库中。 在我的程序中,我最终不得不在EntityManager上调用flush(),该操作将保留从连接的实体到底层数据库的所有更改,但是我想排除特定的对象。 (可能为时已晚,但对其他人可能有用) 我现在正在使用JPA开发我的第一个系统。不幸的是,当这个系统几乎完成时,我面临着这个问题。 简单的说。使用Hibernate,或等待JPA 2.0。
在Hibernate中,您可以使用'session.evict(object)'从会话中删除一个对象。在JPA 2.0中,
不管您使用哪种JPA实现,都只需使用 如果需要从EntityManager分离对象,并且将Hibernate用作基础ORM层,则可以访问Hibernate Session对象,并使用上面Mauricio Kanada提到的Session.evict(Object)方法。
当然,如果您切换到另一个ORM提供程序,则可能会中断,但是我认为这最好是尝试制作深层副本。 不幸的是,在当前的JPA实现AFAIR中,无法从实体管理器断开一个对象的连接。 EntityManager.clear()将断开所有JPA对象的连接,因此,如果您确实计划保持其他连接,那么在所有情况下这都不是一个合适的解决方案。 因此,最好的选择是克隆对象,并将克隆传递给更改对象的代码。由于默认克隆机制会以适当的方式处理原始和不可变的对象字段,因此您无需编写大量的管道代码(除了深克隆可能具有的任何聚合结构之外)。
如果使用
使用查询提示
使用 据我所知,唯一的直接方法是: 要处理类似的情况,我创建了一个DTO对象,该对象扩展了持久实体对象,如下所示:
最后,标量查询将检索所需的非托管属性:
在JPA 1.0(使用EclipseLink测试)中,您可以在事务外部检索实体。例如,使用容器管理的事务,您可以执行以下操作:
由于我正在使用SEAM和JPA 1.0,并且我的系统具有需要记录所有字段更改的功能,因此,如果需要记录实体的相同字段,则创建了一个值对象或数据传输对象。新pojo的构造函数为:
这很麻烦,但是您也可以序列化和反序列化对象。 如果bean中没有太多属性,则可以创建一个新实例,然后从持久化bean中手动设置其所有属性。 可以将其实现为副本构造函数,例如:
然后:
我认为有一种方法可以通过以下方式从EntityManager中逐出单个实体
这将从缓存中删除特定实体。 如果到达这里是因为您实际上想跨远程边界传递实体,则只需输入一些代码来愚弄hibernazi。
可克隆将无法正常工作,因为它实际上复制了PersistantBag。 并无需使用可序列化和字节数组流以及管道流。创建线程以避免死锁会杀死整个概念。 我认为如果实体的主键没有更改,您也可以使用EntityManager.refresh(Object o)方法。此方法将恢复实体的原始状态。 |
最新内容
相关内容
python的调用绑定方法和非绑定方法
python的调用绑定方法和非绑定方法,代码,方法,实例,第一,培训,时计,奇数,偶数,参数,定义,在Python中,如果用实例去调用方法,这种限制就被称为PyPython网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tcPython 之模块重载的五种方法
Python 之模块重载的五种方法,环境,培训,方法,模块,文件夹,例子,下面,内容,语句,请看,python环境准备新建一个foo文件夹,其下包含一个bar.py文Python文件读取相关方法
Python文件读取相关方法,数据,位置,文件,中行,培训,方法,字节,内容,结果,字符串,我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而Python类和对象
Python类和对象,代码,培训,对象,实例,定义,关键字,函数,问题,顶层,全名,刚接触python中的类和对象,我也和大多数小伙伴一样迷茫,不知道它和我所Python 多线程死锁问题的巧妙解决
Python 多线程死锁问题的巧妙解决方法,异常,持有,代码,情况,信息,管理,数据,包装,策略,预期,死锁死锁的原理非常简单,用一句话就可以描述完。列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_Python面向对象的基本概念
Python面向对象的基本概念,概念,信息,位置,新增,培训,属性,鸟类,定义,对象,方法,python使用类(class)和对象(object),进行面向对象(object-oriPython上下文管理器
Python上下文管理器,包装,通用,代码,培训,函数,示例,上下文,语法,抑制,文件,本节严格意义上并非新的重定向方式,而是利用Pyhton上下文管理器优Python 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在使用Python执行系统命令方法
使用Python执行系统命令方法,系统,信息,培训,标准,命令,方法,模块,操作,终端,中文,Python是一款操作简单的编程语言,内置丰富的库,能够很容易的Python 事件对象
Python 事件对象,通信,培训,线程,事件,对象,内部,标志,信号,机制,以上,一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机