我知道有很多关于这个着名的分离实体传递给持久错误的讨论。我遇到了那个错误。我well linked我的实体,但那不是问题:我将实体链接到已经存在的实体。我尝试了merge()
而不是persist()
,这很好地执行了交易。我询问了merge()
方法,并且我学习了here和there主要观点:它复制了传递对象的状态。右。
我的问题是,而不是
em.persist(e); e.anything();
使用
是个坏主意 e = em.merge(e); e.anything();
如果我很好理解,merge()
会返回状态合并到的托管实例,这应该意味着用返回的实体覆盖给定实体可以访问持久实体,不是吗?
我看到那个“解决方案”无处可去,所以我问。 Mea culpa如果是重复的问题:)
答案 0 :(得分:1)
使用
是个不错的主意e = em.merge(e); e.anything();
这是否是一个坏主意取决于您的应用程序和合并前您正在做什么以及您在anything()
中正在做什么。
在某些情况下,merge
将修复'分离实体'错误。在其他情况下,它会在破坏您的应用程序时满足实体经理的要求。
要回答针对您具体案例的问题,您必须问自己:e
来自哪里?它包含什么?它与其他实体有关系吗?如果这些关系是双向的?等...