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;

这是我实体的字段定义:

@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;

}

无论如何,如果用户名已被使用,则存储库只进行更新,因为指定的标识符不为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

回到顶部