之所以这样工作是因为您使用标记了事务为只读
@Transactional(readonly = true)。
如您所见,由于您仍然可以通过
flush()手动调用保留更改,因此它不会使您的事务实际上是只读的。但是,它在事务结束时禁用自动刷新,因此,如果没有手动刷新,更改将不会持久。
您需要
readOnly从类级别的注释中删除,或在具有方法级别的注释的非只读方法上覆盖它:
@Override@Transactional(readonly = false)public boolean save(User user) { ... }还要注意,事务划分通常应用于服务层方法,而不是DAO方法。特别是,在编写DAO方法时,您实际上并不知道哪些事务应该是只读的,哪些不是只读的。如以下示例所示,此信息仅在设计服务层时可用:
public class UserService { @Autowired UserDAO dao; @Transactional(readonly = true) public User getUserById(int id) { return dao.getById(id); // getById() can participate in effectively read-only transaction } @Transactional public void changeUserName(int id, String newName) { User u = dao.getById(id); // Or not u.setName(newName); // Change will be flushed at the end of transaction }}


