Hibernate / JPA简单的创建/删除实体

时间:2012-08-29 22:07:05

标签: spring hibernate jpa

我无法在交易中进行简单的创建/删除工作。我使用Spring / JPA / Hibernate,没有ehcache。

我的实体类User和MyDao有两个方法标记为Spring的@Transactional(我理解@Transactional应该服务,这里只是简化我的情况)


    public class MyDao {
      @PersistenceContext
      private EntityManager entityManager;

      @Transactional
      public void create(User user) {
        entityManager.persist(user);
        entityManager.refresh(user);
      }

      @Transactional
      public void delete(User user) {
        // Since user maybe detached, I use Hibernate to delete.
        Session sess = entityManager.unwrap(Session.class);
        sess.delete(user);
      }
    }

我的测试:


    {
      User user = new User();
      myDao.create(user);

      // above is ok. user created with generated ID.
      // and I assume the transaction is closed, so user is detached

      myDao.delete(user);

      // above failed with error "Removing a detached instance ..."
    }

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

感谢您的帮助

迈克尔

1 个答案:

答案 0 :(得分:0)

Hibernate文档表示只有在覆盖equals()和hashCode()时才能对分离实体进行操作。我会在明天重返工作岗位时看看它是否有效。我不满意的两件事:

  • 如果先前已分离,实体必须具有身份字段的值,为什么不只使用它?
  • 文件......

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

BTW,我说的是应用于我们所有实体的通用方法,而不仅仅是一个用户类。