jpa合并和数据库中的默认值

时间:2011-12-06 21:17:00

标签: jpa merge field

我正在尝试使用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注释

此致 马尔钦

0 个答案:

没有答案