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

Jpa存储库save()不更新现有数据

齐昊苍
2023-03-14

我正在尝试更新数据,据我所知,save()方法在id为空时保存实体,或者在DB中找到给定id时更新数据库中现有的实体。

但是,当我尝试保存数据时,它不会被更新:

public Employer update() {
    Employer emp = Employer.builder()
        .id(2L) // it exists in database
        .name('new company name')
        .build();

    return repository.save(emp);
}

但是,当我从数据库检索数据并更新其字段并再次保存时,它会更新:

public Employer update() {
    Employer emp = repository.getOne(2L);
    emp.setName('new company name');

    return repository.save(emp);
}
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface Employer extends JpaRepository<Employer, Long> {

}

和实体:

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(schema = "public", name = "employer")
public class Employer {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @NotBlank
  @Size(max = 50)
  private String name;

}

共有1个答案

高云瀚
2023-03-14

您的实体雇主看起来处于分离/瞬态,您正在手动传递id值,这是不允许的,因为它被标记为@generatedvalue(strategy=generationtype.identity)

您需要做的是,当您知道主键值(即id值)后,首先使用findById()方法从数据库中提取实体,通过该方法实体进入托管状态,然后尝试通过调用save()方法更新实体。这将更新您的实体。

有关实体状态的更多信息,可以参考以下内容:https://vladmihalcea.com/a-beginners-guide-to-jpa-hibernate-entity-state-transitions/

 类似资料:
  • 我在java应用程序中遇到以下异常。 我对entity表中的其他3个字段有一个唯一的约束,对attributes表中的name、Value有一个唯一的约束。当我尝试persist an实体(它有一组属性)时,repository.save()方法会失败,原因有两个:1。属性表中可能已经存在一个属性,由于唯一约束(这是我想要的。但我仍然想创建与实体的这些属性的关联)而无法插入2。实体可能已经存在,但

  • 我有一个数据已经保存在我的数据库基于我的存储库和服务。我想保存另一个数据与邮递员只改变播放器id。但它不是创建一个新的实体数据。它更新现有的实体数据。我的问题是如何更新一个数据由我的服务当它找到一个现有的id。但当它找到一个新的id将保存一个新的数据到数据库。 这是我的回购: 这是我的服务:

  • 无论如何,如果用户名已经被使用,存储库只需进行更新,因为指定的标识符不是空的。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。有什么办法可以预防吗?我必须自己做吗?例如:

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 我在使用JPA时遇到了一些困难。我没有得到任何异常,但我不能保存任何东西到数据库。我从Hibernate到Jpa,在那里一切都工作得很好。下面是我的文件 Application.Properties: 存储库: 服务: 我在提交表单时得到了200的响应,但在数据库中找不到数据

  • 我想在我的存储库中的save/saveAll方法中添加一个装饰器。 我试图通过阅读此线程使用自定义实现来覆盖方法,但我不想重写方法实现,只需调用具有更多行为的默认方法。提供的解决方案都不适合我的情况,或者需要太多的自定义。 我可以从方法体中手动调用缓存逐出,但我不能只覆盖方法并调用super。save(),因为我只使用接口,让Spring生成实现。 有什么建议吗?