【问题标题】:JPARepository wont update entity on saveJPARepository 不会在保存时更新实体
【发布时间】:2022-01-17 16:09:56
【问题描述】:

非常简单的情况,JPA 正在杀死我的脑细胞

 @Entity
@Table(name = "food_entry")
@ublic class FoodEntry implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Column(name = "product_name", nullable = false, unique = false, insertable = true, updatable = false, length = 256)
    private String name;

    @CreatedDate
    @Column(name = "instant", updatable = false, unique = false, nullable = false, insertable = true)
    private Instant instant = Instant.now();

    @Min(value = 0, message = "calories must be positive")
    @Column(name = "calories", updatable = false, insertable = true, nullable = false, unique = false)
    private long calories;

}

@Transactional
    public FoodEntry update(final FoodEntry newEntry, long id) {
        final User loggedUser = SecurityUtils.getCurrentLoggedUser();

        if (loggedUser == null || !loggedUser.getAuthorities().contains(Authority.ADMIN))
            throw new AccessDeniedException("You dont have authorization to perform this action");


        FoodEntry current = this.repository.findById(id).orElseThrow(() -> new NotFoundException("Not found FoodEntry with specified id: " + id));


        current.setCalories(newEntry.getCalories());
        current.setInstant(newEntry.getInstant());
        current.setName(newEntry.getName());

        try {
            this.repository.save(current);
            this.repository.flush();
            return null;
        }
        catch (Exception e) {
            throw e;
        }
    }

@Repository
public interface FoodRepository extends JpaRepository<FoodEntry, Long> {}

代码运行,从数据库中查询食物条目,但是当我调用保存时,什么都没有发生, JPA 简单返回与我作为参数传递的完全相同的对象,并且没有在数据库上运行查询...稍后获取该实体将返回过时的值

为什么?这么简单我错过了什么?

相同的 CREATE 代码可以正常工作...但是当我尝试更新时,save 方法什么也不做

【问题讨论】:

  • 请同时添加所有调用update方法的相关代码

标签: spring-boot jpa spring-data-jpa


【解决方案1】:

updatable = false 属性应该被更改,JPA 不会更新属性 updatable 为 false 的实体,所以将其设置为 true。

更多参考: https://www.ibm.com/support/pages/jpa-entities-primary-key-automatically-generated-read-only-annotations

【讨论】:

    【解决方案2】:

    我找到了答案,如果有人遇到同样的问题,我会在这里发布一些超级愚蠢的东西:

    https://github.com/spring-projects/spring-data-jpa/issues/1735

    如果所有字段都设置为更新 false,JPA 不会更新实体,它不会抛出错误或异常或任何类型的可跟踪日志,它只是忽略调用

    由于项目早期要求不进行编辑,所以我忘记在更改后更改实体

    【讨论】:

      【解决方案3】:

      问题是,您要更新的所有这些属性(卡路里、即时、名称)都设置了它们的updatable=false

      带有updatable=false 的属性只能设置到您第一次调用.save(..)。之后,所有这些属性都不会再更新,即使事务没有被刷新。

      【讨论】:

        【解决方案4】:

        这个问题是由于 updatable=false 造成的,因为每当列被指定为 updatable=false 时,它​​就不能通过 JPA 更新。

        【讨论】:

          猜你喜欢
          • 2019-11-15
          • 2017-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-11
          • 2020-01-01
          • 2021-06-26
          相关资源
          最近更新 更多