0

我无法跨事务进行简单的创建/删除工作。我使用 Spring/JPA/Hibernate,没有 ehcache。

我的实体类 User 和 MyDao 使用 Spring 的 @Transactional 标记的两个方法(我知道 @Transactional 应该在服务中,这里只是简化我的情况)

    公共类 MyDao {
      @PersistenceContext
      私有实体管理器实体管理器;

      @Transactional
      公共无效创建(用户用户){
        entityManager.persist(user);
        entityManager.refresh(user);
      }

      @Transactional
      公共无效删除(用户用户){
        // 由于用户可能已分离,因此我使用 Hibernate 进行删除。
        会话 sess = entityManager.unwrap(Session.class);
        sess.delete(用户);
      }
    }

我的测试:

    {
      用户用户 = 新用户();
      myDao.create(user);

      // 上面没问题。使用生成的 ID 创建的用户。
      // 我假设事务已关闭,因此用户已分离

      myDao.delete(user);

      // 上面失败并出现错误“正在删除一个分离的实例......”
    }

根据 Hibernate, session.delete() 可以删除分离的或托管的。但是为什么失败了?

感谢帮助

迈克尔

4

1 回答 1

0

Hibernate 文档说,只有当它覆盖 equals() 和 hashCode() 时,你才能对分离的实体进行操作。明天回去上班看看能不能用。我不满意的两件事:

  • 如果之前分离,实体必须具有标识字段的值,为什么不直接使用它呢?
  • 文件...

我们的 db 表有用于 ID 列的 long 和 string,所以我不能使用带有抽象 getId() 的基本实体类。我几乎继续实现一种方法来通过反射从我们的实体类中检索@Id 字段,然后是纯 JPA 首先查找()然后删除。

顺便说一句,我说的是应用于我们所有实体的通用方法,而不仅仅是一个 User 类。

于 2012-08-30T04:41:59.063 回答