我正在使用带有Hibernate的Spring MVC,但是我遇到了一个奇怪的情况,当我使用@Transational注释的服务完成它的执行时,似乎hibernate正在我的实体中执行额外的更新,这是一个未在任何地方编码的更新 . 有人能帮助我吗?我的控制器:

@Controller
public class UserController {

    @Resource(name="userService")
    private UserService userService;

    @RequestMapping(value="/user/create", method=RequestMethod.GET)
    public ModelAndView createUser(User user) throws GenericException {

        this.userService.doTestOnUpdateUser();

        return new ModelAndView("createUser");
    }

我的服务:@Service(“userService”)公共类UserServiceImpl实现UserService {

@Resource(name = "userDao")
private UserDao userDao;

@Override
@Transactional(rollbackFor = CauseTrasactionRollback.class)
public void doTestOnUpdateUser() {
    try {
        User user = this.userDao.findById(40l);
        user.setFirstName("Rogerio1234");
        user.setLastName("R123");
        user.setEmail("rro@gmail.com");
        user.setPassword("novo password");

        this.userDao.save(user);
        System.out.println("why ?");

    } catch (DaoException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

我的DAO:

@Repository("userDao")
public class UserDaoImpl extends CrudDaoImpl<User> implements UserDao {

    @Autowired
    public UserDaoImpl(SessionFactory sessionFactory) {
        super(sessionFactory);
    }

    @Override
    public void save(User user) throws DaoException {
        try {

            String sql = "";
            User userBefore = null;

            if (user.getId() == null) {
                user.setCreated(new Date());
                sql = "insert into users (first_name, last_name, email, password, created, last_updated, email_confirmed_at)"
                        + "values (:firstName, :lastName, :email, md5(:password), :created, :lastUpdated, :emailConfirmedAt)";
            } else {
                userBefore = this.findById(user.getId());
                user.setLastUpdated(new Date());
                if (userBefore.getPassword() != user.getPassword()) {
                    sql = "update users set first_name=:firstName, last_name=:lastName, email=:email, "
                            + " password=md5(:password), created=:created, last_updated=:lastUpdated, "
                            + " email_confirmed_at=:emailConfirmedAt where id=:id";
                } else {
                    sql = "update users set first_name=:firstName, last_name=:lastName, email=:email, "
                            + "created=:created, last_updated=:lastUpdated, email_confirmed_at=:emailConfirmedAt where id=:id";
                }
            }

            SQLQuery sqlQuery = this.sessionFactory.getCurrentSession()
                    .createSQLQuery(sql);
            if (user.getId() != null) {
                sqlQuery.setLong("id", user.getId());
                if (userBefore.getPassword() != user.getPassword()) {
                    sqlQuery.setString("password", user.getPassword());
                }
            } else {
                sqlQuery.setString("password", user.getPassword());
            }
            sqlQuery.setString("firstName", user.getFirstName());
            sqlQuery.setString("lastName", user.getLastName());
            sqlQuery.setString("email", user.getEmail());
            sqlQuery.setDate("created", user.getCreated());
            sqlQuery.setDate("lastUpdated", user.getLastUpdated());
            sqlQuery.setDate("emailConfirmedAt", user.getEmailConfirmedAt());

            sqlQuery.executeUpdate();

        } catch (Exception e) {
            throw new DaoException("Error at saving "
                    + user.getClass().getSimpleName(), e);
        }
    }
}

控制台日志显示如下:

Hibernate:选择user0_.id为id8_,user0_.created为created8_,user0_.last_updated为last3_8_,user0_.email为email8_,user0_.email_confirmed_at为email5_8_,user0_.first_name为first6_8_,user0_.last_name为last7_8_,user0_.password为password8_来自用户user0_ where user0_.id =?

Hibernate: update users set created=?, last_updated=?, email=?, email_confirmed_at=?, first_name=?, last_name=?, password=? where id=?

Hibernate:选择user0_.id为id8_,user0_.created为created8_,user0_.last_updated为last3_8_,user0_.email为email8_,user0_.email_confirmed_at为email5_8_,user0_.first_name为first6_8_,user0_.last_name为last7_8_,user0_.password为password8_来自用户user0_ where user0_.id =?

Hibernate:更新用户设置first_name =?,last_name = ?, email = ?, created = ?, last_updated = ?, email_confirmed_at =?其中id =?为什么?

Hibernate: update users set created=?, last_updated=?, email=?, email_confirmed_at=?, first_name=?, last_name=?, password=? where id=?

我不明白为什么要执行这两个没有编码的更新 . 问题是我在postgres上使用MD5来加密用户的密码,每次更新其他属性时我都不能让它更新密码,否则密码会再次加密,改变它,但是现在这两个未编码的更新是在数据库中设置密码而不将其加密为“novo密码” .

任何帮助将不胜感激 .