我首先解释一下我的目标: 我必须更新一个非常复杂的实体,并且更改的实体来自外部源,因此它是一个非托管实体,并且它上面的任何merge()都会失败。
我的想法是简单地执行删除后跟一个插入:
@Transactional
public class MyClass{
....
public void updateEntity(Entity newEntity){ //altered entity, newly created
Entity oldEntity = dao.findById(newEntity.getId()); //retrieves managed entity object
dao.delete(oldEntity); //deletes it
dao.insert(newEntity); //calls EntityManager.persist()
无论如何,insert()会抛出以下内容:
Detached entity passed to persist
为了解决这个问题,我必须使ID无效,以便hibernate将其识别为新实体,无论如何我想保留旧ID以跟踪更新。
ID当前是自动生成的,因此看起来hibernate会将任何具有ID!= null的实体识别为基础表中已存在的条目,因此将抛出该异常。 有没有办法防止这种情况?