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

新手上路,请多包涵

我正在尝试更新数据,据我所知,如果 id 为空,则 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;

}

原文由 user5959252 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

您的实体 Employer 看起来处于分离/瞬态状态,并且您正在手动传递 id 不允许的值,因为它被标记为 @GeneratedValue(strategy = GenerationType.IDENTITY)

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

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

原文由 codeworks elegant 发布,翻译遵循 CC BY-SA 4.0 许可协议

要通过 JPA 更新现有的实体对象,应该首先让实体管理器可以使用它。

通读文章

https://www.objectdb.com/java/jpa/query/jpql/update

摘录自同

1.Retrieving the entity objects into an EntityManager.
2.Updating the relevant entity object fields within an active transaction.
3.Applying changes to the database by calling the commit method.

我假设在没有发生更新的情况下,该实体还不是托管实体。

有关托管实体的更多信息: https ://www.baeldung.com/hibernate-entity-lifecycle#managed-entity

原文由 R.G 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏