【发布时间】:2016-06-19 11:01:26
【问题描述】:
我的user DB 表如下所示:
CREATE TABLE user (
username VARCHAR(32) PRIMARY KEY,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
password VARCHAR(32) NOT NULL,
enabled BOOL
) ENGINE = InnoDB;
这是我的实体的字段定义:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false)
private String password;
username 字段是我的表/实体的键,由我来设置它的值。
当我需要创建另一个用户时,我会在我的服务中执行此操作:
public User insertUserImpl(String username, String firstName, String lastName) {
Assert.hasText(username);
Assert.hasText(firstName);
Assert.hasText(lastName);
String password = UUID.randomUUID().toString().substring(0, 4); // temp
User user = new User(username, password);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEnabled(false);
this.userRepository.save(user);
// FIXME - assegnare un ruolo
return user;
}
无论如何,如果用户名已被占用,则存储库只需进行更新,因为指定的标识符不为空。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。 有什么办法可以预防吗?我必须自己做吗? 例如:
User user = this.userRepository.findOne(username);
if(user != null) {
throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa
}
【问题讨论】:
-
如果它正在更新值而不是进行新的插入,这意味着它认为它是同一个对象,但是具有更新的值,您是否重复使用该对象进行多次插入?你用的是什么冲洗模式?
-
我没有重复使用同一个对象,我编辑了文本,以便您可以看到完整的方法。如何检查我的冲洗模式?我认为这是 Spring Boot 默认设置,我没有设置任何内容。
标签: java spring spring-boot spring-data-jpa