Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 首先合并实体时,为什么要将已删除的实例传递给合并_Java_Jpa_Merge_Entitymanager - Fatal编程技术网

Java 首先合并实体时,为什么要将已删除的实例传递给合并

Java 首先合并实体时,为什么要将已删除的实例传递给合并,java,jpa,merge,entitymanager,Java,Jpa,Merge,Entitymanager,我相信我希望删除的实体是一个托管实体。但是,不管怎样,为什么合并它然后删除它会导致以下错误: 传递给合并的已删除实例 有人在stackoverflow上说,如果合并是托管实体,则应该忽略它。那么,为什么不忽视这一点呢 我希望删除它的方式如下: TrialUser mergedEntity = em.merge(tu); em.remove(mergedEntity); 但这是错误的,但如果我去掉第一行,它似乎工作得很好。但我希望它是另一种方式,因为这与代码的其余部分是一致的 编辑: 这有点像是

我相信我希望删除的实体是一个托管实体。但是,不管怎样,为什么合并它然后删除它会导致以下错误:

传递给合并的已删除实例

有人在stackoverflow上说,如果合并是托管实体,则应该忽略它。那么,为什么不忽视这一点呢

我希望删除它的方式如下:

TrialUser mergedEntity = em.merge(tu);
em.remove(mergedEntity);
但这是错误的,但如果我去掉第一行,它似乎工作得很好。但我希望它是另一种方式,因为这与代码的其余部分是一致的

编辑:


这有点像是瞎猜,因为我无法运行您的代码,而这些类型的问题可能会变得有点复杂。但请放心,合并然后删除应该没问题。我怀疑这可能与您的多对一关联实体有关

在事务提交时,删除将级联到链接的实体

尽管合并对于父实体来说是多余的,但我认为合并是级联到子实体的,子实体已被删除,因此是例外


尝试更改您的级联规则-将其拉回到CascadeType.MERGE(适用于所有三种情况),然后查看是否仍会出现异常。或者更改为CascadeType.DELETE,这将阻止级联必要的合并。

JPA规范说明:

3.2.7.1合并分离实体状态

如果X是已删除的实体实例,则 合并操作(否则事务提交将失败)


这就是为什么不能合并已删除的实体。

在事务中运行某些代码时,在方法末尾提交时,可能会出现此错误。 在带注释的方法或类中使用spring时

@Transactional
发生这种情况是因为您首先删除对象(不提交),然后尝试更新它

此代码将生成异常:

    @Transactional
    myethod(){
      dao.delete(myObject);
      myObject.setProperty("some value");
      dao.save();  
    }

为避免错误,您不应删除并保存在同一事务中。

您是否可以发布完整的JPA会话(从EntityManager的开始到结束,以及实体类的重要部分(即ID属性和任何关系)。它已被编辑。我使用了持久性上下文,因此无需关闭和提交。为了清楚起见,您使用的是事务范围的容器管理的持久性上下文。您使用的值是什么
boolean isManaged=entityManager.contains(mergedEntity)如果将代码放置在合并和删除行的中间,BTW。为了清楚起见,粘贴一个适当的可编译代码(已经加倍了代码> TalalUsRelEnt1 1/代码>)并将代码片段分成两个类是很好的。(管理用
@PersistenceContext
注释的bean和用
@entity
注释的实体bean)。我认为反对票[不是来自我,顺便说一句]可能是因为规范中引用的部分引用了与问题相反的场景。即,您不能删除然后合并。但您可以合并然后删除,这是提问者正在尝试的(事实上,在许多场景中,这是删除对象/行的唯一方法)。如果您在之间调用.flush(),则可以。例如,delete(myObject).flush().save(mynewObject())
    @Transactional
    myethod(){
      dao.delete(myObject);
      myObject.setProperty("some value");
      dao.save();  
    }