我user
DB表看起來像這樣:春天JPA倉庫:防止更新上保存
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
}
如果它正在更新值而不是進行新的插入,這意味着它認爲它是同一個對象,但是具有更新的值,您是否在重複使用該對象以進行多次插入?你使用什麼沖水模式? – saljuama
我不是在重複使用同一個對象,我編輯了文本,以便您可以看到完整的方法。我如何檢查我的沖洗模式?我認爲這是Spring Boot的默認設置,我沒有對它做任何設置。 – Antonio