2012-12-02 29 views
0

我想删除一个实体,如果它因为约束而无法删除,我想标记它以进行逻辑删除。Jpa在删除失败后保存实体

这是我的代码:

@Transactional 
    public void removeEntity(EntityDto e) { 

    Entity entity = entityRepository.findOne(e.getId()); 

    try { 
     entityRepository.delete(e.getId()); 
     entityRepository.flush(); 

    } catch (DataIntegrityViolationException ex) { 
     logger.debug("Logical removal"); 

     entity.setLogicalRemovalDate(new Date()); 
     entityRepository.save(entity); 
    } 
    } 

调用save()方法后,我得到这个异常:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge 

有什么办法,我可以实现这个功能?

谢谢。

回答

1

在一个新的事务中,不要在新的Hibernate会话中执行它。 The documentation说:

如果Session抛出异常,包括任何的SQLException, 立即回滚数据库事务,调用Session.close() ,丢弃该Session实例。会话的某些方法不会 使会话保持一致状态。 没有抛出异常Hibernate可以被视为可恢复。

在尝试删除它之前,您应该检查是否没有其他实体引用要删除的实体。或者干脆总是把它从逻辑上删除,因为它看起来就是你为参考实体做的事情。

+0

谢谢,通过创建2个事务方法来修复,一个用于逻辑删除,另一个用于物理。 – QQQ