我遇到了一个我不太懂的问题 - 除非使用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注释,数据库不会更新。
答案 0 :(得分:3)
那是正常的: CRUD Scheme中的每个数据库操作都需要它的事务边界。没有这些边界,实际上没有任何内容写入数据库。 事务是DB操作(插入,更新)的集合,它们必须成功完成或者整个操作被数据库撤消。这就是为什么你必须在事务开始和结束时告诉Hibernate,所以hibernate可以告诉哪些操作必须作为工作单元重新调整。没有事务边界,最终对数据库的提交永远不会发生。
希望有所帮助
答案 1 :(得分:-1)
尝试刷新并提交。