jpa слияния и значения по умолчанию в базе данных - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь создать приложение 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

...