0

以下实体在删除时抛出和错误:

实体:

@Entity
@NamedQueries({
})
public class Server {
   //some attributes
}

我有以下非常简单的 JUnit 测试,它执行以下操作:

  1. 实体服务器已创建
    @Transactional
    公共类 ServerDao {
    公共服务器更新(服务器实体,长用户 ID){
        entity.setDeleted(false);
        如果(实体.getId()> 0){
            如果(用户 ID > 0){
                entity.setUpdated(new Date());
                entity.setUpdatedby(usersDao.get(userId));
            }
            em.merge(实体);
        } 别的 {
            如果(用户 ID > 0){
                entity.setInserted(new Date());
                entity.setInsertedby(usersDao.get(userId));
            }
            em.persist(实体);
        }
        返回实体;
        }
    }
    
  2. 实体服务器已删除

    ...同道

    公共无效删除HardJUnit(服务器实体){
        em.remove(实体);
    }
    

    这将引发如下异常:

org.apache.openjpa.persistence.ArgumentException:您无法对分离的对象“org.apache.openmeetings.persistence.beans.basic.Server-1”执行删除操作。

如果我将删除方法更改为:

public void deleteHardJUnit(Server entity) {
    if (entity.getId() > 0) {
        em.refresh(entity);
        em.remove(entity);
    }
}

一切“似乎”都按预期工作,没有抛出异常并且记录从数据库中删除。

但是我不确定这应该是什么意思,我们真的需要在删除之前刷新每个实体吗?因为我之前已经多次使用 EntityManager.delete 而不需要刷新实体。

4

1 回答 1

1

假设您使用的是 Spring 的@Transactional注解,它不能拦截来自被注解对象实例内的调用(由于 Spring 使用动态代理进行 AOP 和方法拦截)。尝试从服务层调用并在那里注释方法。

如果您不使用 Spring,那么您可能想要使用@TransactionAttribute,这是类似的 Java EE 注释。

于 2013-02-02T03:52:46.753 回答