也许我只是给你一小段代码而过度简化了这一点(如果是这种情况,我会发布更多的代码),但我认为,最初,更少更好:EntityManager尝试插入实体而不被提示
我有一个资产类型的实体,它有一个位置类型的字段,它也是一个实体。当我设置资产的位置时,我还必须设置其子项的位置。
Location location = asset.getLocation();
em.merge(location);
em.flush();
childAsset.setLocation(asset.getLocation());
em.flush();
当我运行的flush(),我得到以下异常:
内部异常:java.sql.SQLIntegrityConstraintViolationException:ORA-00001:唯一约束(SWRADMIN.LOCATION_PK)违反
我的问题是...为什么这个位置对象甚至试图被持续?我所做的只是在一个实体中设置一个变量。
这工作很好,但我们只是切换到使用Eclipselink和Java EE 6,这个问题弹出。
解决方案?:我用“分离”的想法从下面并提出了以下变化:
Location location = asset.getLocation();
em.detach(childAsset);
childAsset.setLocation(asset.getLocation());
em.merge();
em.flush();
和它的工作!我很困惑,为什么,但是......你会认为自动同步会做同样的事情。
所以,我做了一个em.detach(childAsset),然后childAsset.setLocation(位置),然后em.merge(childAsset),它的工作!我的问题是...为什么?这不是同步开始时应该做的吗? – wsaxton
看着你原来的代码,em.merge(location)然后em.flush()会在数据库中持久化'location',然后在childAsset中设置它,然后再刷新'SQLIntegrityConstraintViolationException',因为'location'已经存在于数据库中。修改答案,参考编辑部分。 –