java - Jpa Repository save() 不更新现有数据

标签 java spring-boot jpa spring-data-jpa

我正在尝试更新数据,据我所知,如果 id 为 null,则 save() 方法会保存实体;如果在数据库中找到给定的 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;

}

最佳答案

您的实体雇主看起来处于分离/ transient 状态,并且您正在手动传递id值,这是不允许的,因为它被标记为@GenerateValue (策略= GenerationType.IDENTITY)

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

有关实体状态的更多信息,您可以引用: https://vladmihalcea.com/a-beginners-guide-to-jpa-hibernate-entity-state-transitions/

关于java - Jpa Repository save() 不更新现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065939/

相关文章:

hibernate - 客户端服务器通信和持久性框架

java - 在 Play 中使用 save() 方法!具有继承性(JPA)

java - SQLFunctionTemplate 不应用查询参数的顺序

java - 限制变量值 - 最好的方法

java - 在字符串中查找整数java

java - 如何在 Spring Boot ws 中访问 Spring Boot Actuator(生产就绪功能)

java - Spring-Boot 应用程序无法正确构建

java - RemoteViewsService 未调用

java - 如何对 Clob 转换为 String 进行单元测试?

java - 如何返回外部域中的文件? ( Spring 启动/java)