Я пытаюсь создать приложение Spring MVC, используя Spring Security. У меня проблема с JPA - у меня есть такой код (часть действия регистра):
userDao.addUser(user);
UserDetailsAdapter userDetails = new UserDetailsAdapter(user);
String password = userDetails.getPassword();
Object salt = saltSource.getSalt(userDetails);
user.setPassword(passwordEncoder.encodePassword(password, salt));
После последней строки должен быть вызов для обновления поля пароля в базе данных (addUser - это диспетчер сущностей JPA'a), но я не знаю, как этого добиться без дополнительных выборок.
Моя таблица пользователей выглядит так:
CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
`password` varchar(64) NOT NULL,
`rank_id` tinyint(4) unsigned DEFAULT '1',
`email` varchar(45) NOT NULL,
`registration_date` datetime NOT NULL,
`last_login_date` datetime DEFAULT NULL,
`admin` bit(1) DEFAULT b'0',
`active` bit(1) DEFAULT b'1',
PRIMARY KEY (`user_id`),
KEY `users_rank_id_pk` (`rank_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8$$
Проблема в том, что перед вызовом addUser для объекта пользователя не установлены значения по умолчанию (rank_id, active, admin, last_login_date). Если я вызываю слияние для этого объекта, я получаю эти значения равными нулю, потому что они не устанавливаются по умолчанию.
Если я снова выберу объект User, используя
User test = userDao.findUserById(user.getUserId());
test.setPassword(passwordEncoder.encodePassword(password, salt));
userDao.updateUser(test);
Все это работает, но делает несколько запросов к базе данных. Есть ли другой путь? Я попытался установить значения по умолчанию в сопоставленных классах напрямую, но это не сработало. Я использую Spring HibernateJpaVendorAdapter и аннотацию @Transactional на моих классах DAO
С уважением,
Marcin