我正在尝试使用Spring Security制作Spring MVC应用程序。我有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);
整个过程有效,但它可以进行更多的数据库查询。还有另外一种方法吗?我尝试直接在映射类中设置默认值,但它没有用。我在我的DAO类上使用spring的HibernateJpaVendorAdapter和@Transactional注释
此致 马尔钦