My user DB table looks like this:
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; This is the field definitions of my entity:
@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; The field username is the key of my table/entity and it's up to me to set its value. When I need to create another user, I do this in my service:
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; } Anyway, if the username is already taken, the repository just do an update, because the specified identifier is not null. This is not the behaviour that I want, I need it to throw something like a duplicate entry exception. Is there any way to prevent it? Do I have to do it by myself? E.g.:
User user = this.userRepository.findOne(username); if(user != null) { throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa }