JPA - 仅当方法为@Transactional时才会更新数据库

时间:2010-10-08 12:56:07

标签: java hibernate jpa entitymanager

我遇到了一个我不太懂的问题 - 除非使用DAO的方法注释为@Transactional,否则底层数据库不会更新。我的应用程序运行在JPA / Hibernate,Spring和Wicket上。那是为什么?

DAO:

@Repository(value = "userDao")
public class UserDaoJpa implements UserDao {
    @PersistenceContext
    private EntityManager em;

    public User findById(Long id) {
        return em.find(User.class, id);
    }

    public List findAll() {
        Query query = em.createQuery("select e from User e");
        return query.getResultList();
    }

    public User create(User user) {
        em.persist(user);
        return user;        
    }

    public User update(User user) {
        return em.merge(user);
    }

    public void delete(User user) {
        user = em.merge(user);
        em.remove(user);
    }
}

服务:

@Service(value = "userManager")
public class UserManagerImpl implements UserManager {
    @Autowired
    UserDao dao;

    public void setUserDao(UserDao dao) {
        this.dao = dao;
    }

    public List getUsers() {
        return dao.findAll();
    }

    public User getUser(String userId) {
        return dao.findById(Long.valueOf(userId));
    }

    public void saveUser(User user) {
        dao.update(user);
    }

    @Transactional
    public void removeUser(User user) {
        dao.delete(user);
    }
}

如果我遗漏@Transactional注释,数据库不会更新。

2 个答案:

答案 0 :(得分:3)

那是正常的: CRUD Scheme中的每个数据库操作都需要它的事务边界。没有这些边界,实际上没有任何内容写入数据库。  事务是DB操作(插入,更新)的集合,它们必须成功完成或者整个操作被数据库撤消。这就是为什么你必须在事务开始和结束时告诉Hibernate,所以hibernate可以告诉哪些操作必须作为工作单元重新调整。没有事务边界,最终对数据库的提交永远不会发生。

希望有所帮助

答案 1 :(得分:-1)

尝试刷新并提交。