我无法在交易中进行简单的创建/删除工作。我使用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()可以删除分离或托管。但为什么失败了呢?
感谢您的帮助
迈克尔
答案 0 :(得分:0)
Hibernate文档表示只有在覆盖equals()和hashCode()时才能对分离实体进行操作。我会在明天重返工作岗位时看看它是否有效。我不满意的两件事:
我们的db表有长列和ID列的字符串,所以我不能使用带有抽象getId()的基本实体类。我几乎继续实现一个方法来通过实体类的反射来检索@Id字段,然后是纯JPA来查找()然后先删除。
BTW,我说的是应用于我们所有实体的通用方法,而不仅仅是一个用户类。