2

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

道:

@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 注释,则数据库不会得到更新。

4

2 回答 2

3

这很正常:CRUD 方案中的每个数据库操作都需要它的事务边界。没有这些界限,数据库中实际上不会写入任何内容。事务是数据库操作(插入、更新)的集合,这些操作必须全部成功,否则整个操作都会被数据库撤消。这就是为什么你必须告诉 Hibernate 什么时候事务开始和结束,所以 hibernate 可以知道哪些动作必须被视为工作单元。没有事务边界,对数据库的最终提交永远不会发生。

希望有帮助

于 2010-10-08T12:59:37.830 回答
-1

尝试刷新并提交。

于 2010-10-08T12:57:52.613 回答