首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JPA认为我正在删除一个分离的对象

JPA认为我正在删除一个分离的对象
EN

Stack Overflow用户
提问于 2010-03-11 21:11:20
回答 7查看 62.1K关注 0票数 43

我有一个DAO,用于使用JPA加载和保存我的域对象。我终于设法让事务处理工作起来了,现在我有了另一个问题。

在我的测试用例中,我调用DAO来加载具有给定id的域对象,检查它是否已加载,然后调用相同的DAO来删除我刚刚加载的对象。当我这样做的时候,我得到了以下结果:

代码语言:javascript
运行
AI代码解释
复制
java.lang.IllegalArgumentException: Removing a detached instance mil.navy.ndms.conops.common.model.impl.jpa.Group#10
 at org.hibernate.ejb.event.EJB3DeleteEventListener.performDetachedEntityDeletionCheck(EJB3DeleteEventListener.java:45)
 at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:108)
 at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
 at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:794)
 at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:772)
 at org.hibernate.ejb.AbstractEntityManagerImpl.remove(AbstractEntityManagerImpl.java:253)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
 at java.lang.reflect.Method.invoke(Method.java:600)
 at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:180)
 at $Proxy27.remove(Unknown Source)
 at mil.navy.ndms.conops.common.dao.impl.jpa.GroupDao.delete(GroupDao.java:499)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
 at java.lang.reflect.Method.invoke(Method.java:600)
 at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 at $Proxy28.delete(Unknown Source)
 at mil.navy.ndms.conops.common.dao.impl.jpa.GroupDaoTest.testGroupDaoSave(GroupDaoTest.java:89)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
 at java.lang.reflect.Method.invoke(Method.java:600)
 at junit.framework.TestCase.runTest(TestCase.java:164)
 at junit.framework.TestCase.runBare(TestCase.java:130)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:120)
 at junit.framework.TestSuite.runTest(TestSuite.java:230)
 at junit.framework.TestSuite.run(TestSuite.java:225)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

现在假设我正在使用相同的DAO实例,并且我没有更改EntityManagers (除非Spring在没有通知我的情况下这样做),这怎么可能是一个分离的对象呢?

我的DAO代码如下所示:

代码语言:javascript
运行
AI代码解释
复制
public class GenericJPADao<INTFC extends IAddressable, VO extends BaseAddressable> implements IWebDao, IDao<INTFC>, IDaoUtil<INTFC>
{
    private static Logger logger = Logger.getLogger (GenericJPADao.class);

    protected Class<?> voClass;

    @PersistenceContext(unitName = "CONOPS_PU")
    protected EntityManagerFactory emf;

    @PersistenceContext(unitName = "CONOPS_PU")
    protected EntityManager em;

    public GenericJPADao()
    {
        super ( );

        ParameterizedType genericSuperclass = 
                        (ParameterizedType) getClass ( ).getGenericSuperclass ( );
        this.voClass = (Class<?>) genericSuperclass.getActualTypeArguments ( )[1];
    }


    ...


    public void delete (INTFC modelObj, EntityManager em)
    {
        em.remove (modelObj);
    }

    @SuppressWarnings("unchecked")
    public INTFC findById (Long id)
    {
        return ((INTFC) em.find (voClass, id));
    }
}

测试用例代码如下所示:

代码语言:javascript
运行
AI代码解释
复制
IGroup loadedGroup = dao.findById (group.getId ( ));
assertNotNull (loadedGroup);
assertEquals (group.getId ( ), loadedGroup.getId ( ));

dao.delete (loadedGroup); // - This generates the above exception

loadedGroup = dao.findById (group.getId ( ));
assertNull(loadedGroup);

有人能告诉我我哪里做错了吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-11 21:30:52

我怀疑您是在事务外部运行您的代码,因此您的finddelete操作发生在单独的持久性上下文中,并且find实际上返回一个分离的实例(所以JPA是对的,您正在删除一个分离的对象)。

将查找/删除序列包装在事务中。

更新:7.3.1. Transaction Persistence Context章节摘录下面的

如果在活动事务之外将EntityManager与事务持久性上下文模型一起使用,则每次方法调用都会创建一个新的持久性上下文,执行方法操作,并结束持久性上下文。例如,考虑在事务外部使用EntityManager.find方法。EntityManager将创建一个临时持久化上下文,执行查找操作,结束持久化上下文,并将分离的结果对象返回给您。具有相同id的第二次调用将返回第二个分离的对象。

票数 68
EN

Stack Overflow用户

发布于 2012-03-01 08:31:52

代码语言:javascript
运行
AI代码解释
复制
public void remove(Object obj){
    em.remove(em.merge(obj));
}

上面的代码类似于zawhtut提出的代码。

票数 35
EN

Stack Overflow用户

发布于 2010-11-25 05:10:03

+1到Pascal Thivent的帖子,只是一个后续。

代码语言:javascript
运行
AI代码解释
复制
    @Transactional
    public void remove(long purchaseId){
        Purchase attached = jpaTemplate.find(Purchase.class,purchaseId);
        jpaTemplate.remove(attached);
    }
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2428706

复制
相关文章
谈SaaS下如何迅速部署应用软件
如今,许多公司借助软件即服务(Software as a Service,SaaS)来迅速部署软件,只需要较少的前期投资和极少的IT人员资源。使用按需模式(on-demand model)的应用软件越来越多,他们正在充分加以利用。
全栈程序员站长
2022/07/04
1.2K0
Netty 在 Dubbo 中是如何应用的?
众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。
Java技术栈
2019/11/29
9510
Netty 在 Dubbo 中是如何应用的?
众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。
IT大咖说
2020/02/26
2.2K0
应用软件开发的工程化
应用软件的功能需求、非功能需求和工程化问题是应用软件开发中不可或缺的部分。功能需求是软件必须实现的功能,非功能需求是软件必须满足的属性,工程化问题是软件开发过程中遇到的技术问题。
行者深蓝
2023/11/09
5850
相似的像素保持在同一组中的梯度的函数的应用。
Week_05_Lec_03_Code.m I = imread('circuit.tif'); rotI = imrotate(I, 33, 'crop'); BW = edge(rotI, 'canny'); [H, T, R] = hough(BW); imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal,
裴来凡
2022/05/28
6130
相似的像素保持在同一组中的梯度的函数的应用。
在seaborn中设置和选择颜色梯度
seaborn在matplotlib的基础上进行开发,当然也继承了matplotlib的颜色梯度设置, 同时也自定义了一系列独特的颜色梯度。在seaborn中,通过color_palette函数来设置颜色, 用法如下
生信修炼手册
2020/11/02
3.9K0
在seaborn中设置和选择颜色梯度
应用软件开发的工程化-Go
在 Linux(Ubuntu/Fedora)和 MacOS 下的 Go 开发环境设置步骤如下:
行者深蓝
2023/11/18
2560
应用软件开发的工程化-JavaScript
在 Linux(Ubuntu/Fedora)和 MacOS 下的 JavaScript 开发环境设置步骤:
行者深蓝
2023/11/18
2840
新型应用软件型NAS方案Infortress
Infortress是应用软件型NAS解决方案,官方网站为 https://hardstones.com 用户只需要在自己的电脑上安装一个应用软件就能给自己的电脑增加NAS功能,不影响电脑正常使用的同时还能帮助用户将手机相册,通讯录备份到自己的电脑上,并能像访问网盘一样远程访问。除了备份这个核心功能,它还支持密码和笔记管理。它还有一些特色功能,如隐身模式,用户无需注册就能使用。还支持访问用户电脑硬盘上的所有文件,可以一定程度上满足远程办公(远程获取办公和学习文档)的需求。它的端口穿透功能够用其自带的内网穿透服务将电脑上的TCP服务开放到互联网访问,帮助用户实现远程RDP等,开发者可以用这个功能将内网电脑上的HTTP服务开放到互联网访问。更牛的是,它还支持双活双备,2台电脑同时备份,保持同步。
用户11460993
2025/01/25
3050
新型应用软件型NAS方案Infortress
Linux Mint 17下LibreOffice应用软件的使用
Linux Mint中默认安装了一部分应用软件,方便用户使用。本章节中先说Mint中默认安装的办公软件:LibreOffice。
用户8704835
2021/06/08
5K0
腾讯云微搭低代码平台如何连接其他应用/软件?
腾讯云微搭低代码是一个低代码开发平台,用户可通过拖拽式开发去搭建 PC Web、H5 和小程序应用,轻松高效的搭建自己需要的应用。 腾讯微搭支持打通企业内部数据,轻松实现企业微信管理、消息推送、用户权限等能力,实现企业内部系统管理。
阿那个沫
2022/11/03
2.3K0
腾讯云微搭低代码平台如何连接其他应用/软件?
应用软件开发的工程化-Python
在 Linux(Ubuntu/Fedora)和 MacOS 下的 Python 开发环境设置步骤
行者深蓝
2023/11/18
2860
Netty-在-Dubbo-中如何应用
链接:http://thinkinjava.cn/2018/03/%E7%9C%8B-Netty-%E5%9C%A8-Dubbo-%E4%B8%AD%E5%A6%82%E4%BD%95%E5%BA%94%E7%94%A8/
用户5224393
2019/08/13
1.2K0
Netty-在-Dubbo-中如何应用
理解梯度下降在机器学习模型优化中的应用
本文介绍了梯度下降算法的起源、批量梯度下降、随机梯度下降和小批量梯度下降,以及它们在机器学习中的重要性。通过这些算法,可以优化模型权系数,从而提高模型的性能。
chaibubble
2018/01/02
1.8K0
理解梯度下降在机器学习模型优化中的应用
让数据先“活”起来,如何实现数据在企业中的最大价值
📷数据是一种宝贵的资源,知道数据十分宝贵的人很多但如何运用数据让其发生效用的人并不多,今天借着机会,和唐建法老师请教关于数据如何发生效用的事情,让数据也能为企业带来效益,同时作为一个数据库架构师、DBA,我也想听到更新、更有价值的知识,数据到底是什么、Data as service 数据即服务 、数据流转的最终目的是什么,我想寻求真实的答案。
AustinDatabases
2025/03/24
1240
让数据先“活”起来,如何实现数据在企业中的最大价值
应用软件开发的工程化-Rust
在 Linux(Ubuntu/Fedora)和 MacOS 下的Rust 开发环境设置步骤:
行者深蓝
2023/11/18
4090
应用软件开发的工程化-C 语言
C 语言在 Linux(Ubuntu/Fedora)和 MacOS 下的开发环境设置步骤:
行者深蓝
2023/11/18
2570
梯度是如何计算的
引言 深度学习模型的训练本质上是一个优化问题,而常采用的优化算法是梯度下降法(SGD)。对于SGD算法,最重要的就是如何计算梯度。此时,估计跟多人会告诉你:采用BP(backpropagation)算
机器学习算法工程师
2018/03/06
2.6K0
梯度是如何计算的
在SaaS应用中,AI的“雪球”如何越滚越大?
从Shopify可防止欺诈的机器学习到Salesforce的Einstein,在过去的数年间,SaaS巨头们或投入巨资以进行AI的开发,或收购AI创业公司,以试图率先在竞争中取得优势。 借助于云计算,
BestSDK
2018/03/02
1K0
在SaaS应用中,AI的“雪球”如何越滚越大?
脑组织中的梯度
近年来,研究脑组织空间变化或梯度的新方法和应用兴起,补充了在识别和绘制离散脑区和宏观功能社区方面取得的进展。在人类和非人灵长类动物死后细胞结构的早期分析中已经强调了这一点,最近的神经影像学和网络神经科学研究在绘制人类和非人类大脑的空间梯度方面取得了重大进展。
悦影科技
2022/06/20
5660

相似问题

在rails中生成自动递增号

13

如何自动递增票据号

20

如何在“组按”查询中使用自动递增号生成假列

25

CQ中自动递增唯一号生成策略

40

生成帐户号递增1

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档