当前位置: 首页 > 知识库问答 >
问题:

Spring JPA存储库:防止保存时更新

夏侯英纵
2023-03-14
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;
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
}

共有1个答案

程举
2023-03-14

当使用默认配置并使用CrudRepository#save()JParepository#save()时,它将委托EntityManager使用persists(),如果它是一个新实体,则使用persists(),如果不是,则使用merge()

在使用默认配置时,检测实体状态(new或not)以及使用appropiate方法所遵循的策略如下:

  • 默认情况下,执行属性ID检查,如果它是null,则它是一个新实体,否则不是。
  • 如果实体实现persistable,则检测将委托给该实体实现的isnew()方法。
  • 还有第三个选项,即实现EntityInformation,但需要进一步的自定义。
    null
 类似资料:
  • 我有一个数据已经保存在我的数据库基于我的存储库和服务。我想保存另一个数据与邮递员只改变播放器id。但它不是创建一个新的实体数据。它更新现有的实体数据。我的问题是如何更新一个数据由我的服务当它找到一个现有的id。但当它找到一个新的id将保存一个新的数据到数据库。 这是我的回购: 这是我的服务:

  • 我有以下课程: DBEntity.java 使用者JAVA 用户服务。JAVA UserRepository.java

  • 对于CREATE操作,这是存储在数据库中的内容:- 但是,当我执行更新操作时,未更新的字段将变为null 现在,我的问题是如何防止名称和电子邮件变为空??

  • 一个被提交了的改动会被永久地保存在仓库(repository)中。然而,在你日常工作中你经常需要“暂时地”保存一下你的一些本地改动。例如,如果你正在开发一个新的功能,但是与此同时又得到了一个错误报告,并且需要马上修复它,而你现在的本地改动又和这个错误毫无关系,因此你必须暂时地停止新功能的开发,来开始着手修复这个错误。并且你还想要保存那些已完成的开发工作,以便之后能继续来完成它。 像这样的情况会随时

  • 我的应用程序的写入吞吐量很低,我可以管理2-3分钟的更改,以反映在solr搜索结果中 目前,我通过索引应用程序进行提交(在每批文档之后),并在solr端配置了以下内容: 选择配置的原因来自我对以下内容的理解: 我的应用程序被大量读取需要大量缓存,我负担不起刷新缓存的费用。因此,我已经完全禁用了软提交。 我已经禁用了opensearch cher,因为如果我不这样做,它会使不可取的顶级缓存无效 在生