Spring JPA存储库:防止保存时更新
我的user
数据库表如下所示:
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;
这是我实体的字段定义:
@Entitypublic 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;
}
无论如何,如果用户名已被使用,则存储库只进行更新,因为指定的标识符不为null。这不是我想要的行为,我需要它抛出类似重复条目异常的内容。有什么办法可以防止呢?我必须自己做吗?例如:
User user = this.userRepository.findOne(username);if(user != null) {
throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa
}
回答:
如果使用默认配置,并且使用CrudRepository#save()
或JpaRepository#save()
,它将使用或委派给EntityManager
来使用,persists()
如果它是新实体,或者merge()
不是。
使用默认配置时,采用以下策略来检测实体状态(新建或不新建)以使用适当的方法:
- 默认情况下,将执行 检查,如果为
null
,则它为新实体,否则为新实体。 - 如果实体实现,
Persistable
则检测将委托给该实体实现的isNew()
方法。 - 有第三个选项,实现
EntityInformation
,但需要进一步的自定义。
资源
因此,在您的情况下,由于您使用的用户名为as
ID
,并且它不为null,因此Repository调用最终委托给了EntityManager.merge()
代替persist()
。因此,有两种可能的解决方案:
- 使用不同的
ID
属性,将其设置为null,然后使用任何自动生成方法,或者 - 使用户实现
Persistable
并使用该isNew()
方法来确定它是否为新实体。
如果由于某种原因您不想修改您的实体,则也可以更改修改刷新模式配置的行为。默认情况下,在spring数据jpa中,hibernate刷新模式设置为AUTO。您要做的就是将其更改为COMMIT,并将其更改为属性org.hibernate.flushMode
。您可以通过替换修改这个配置EntityManagerFactoryBean
在一个@Configuration
班。
而且,如果您不想弄乱EntityManager的配置,则可以使用JpaRepository#flush()
或JpaRepository#saveAndFlush()
方法将待处理的更改提交到数据库。
以上是 Spring JPA存储库:防止保存时更新 的全部内容, 来源链接: utcz.com/qa/403753.html