【问题标题】:how spring data LastModifiedDate is set on an object and in which order如何在对象上设置弹簧数据 LastModifiedDate 以及以何种顺序
【发布时间】:2021-02-23 21:19:13
【问题描述】:

我看到 spring 数据的 LastModifiedDate 功能的奇怪行为。

请参考此示例代码:

@Entity
class Store {
    @OneToMany(cascade = REFRESH, fetch = EAGER, mappedBy="store")
    List<Products> products;

    @LastModifiedDate
    Instant modificationDate;
}

@Entity
class Product {
    @ManyToOne(cascade = REFRESH)
    Store store;

    @LastModifiedDate
    Instant modificationDate;

    double price;

    boolean available;
}

@Service
class ProductsService {
    void reduceMaxProductPrice(UUID storeId, double reduceBy) {
        var store = storeRepository.findById(storeId);
        var product = store.getProducts().max(p.getPrice()); // Pseudo - get by price
        product.setPrice(product.getPrice() - reduceBy);
        productRepository.save(product);

        // make changes to store - and save
        storeRepository.save(store);
    }
}    

我假设由于我先存储产品然后存储商店,因此商店的最后修改日期将在产品之后。 在实践中,在大多数情况下 (95%+) 这是符合预期的,但我确实看到最后修改的产品是在商店中的产品之后。

我正在尝试了解可能导致此问题的原因?您能否介绍一下 spring(和 hibernate)如何处理这个 LastModifiedDate?

谢谢。

【问题讨论】:

    标签: hibernate spring-data-jpa last-modified


    【解决方案1】:

    Spring Data 和我假设 Hibernate 也使用生命周期事件来设置这些日期。

    通常,这些与您调用save 的顺序无关,因为使用JPA 调用savepersistmerge 实际上并没有将您的对象写入数据库,而只是将其注册到最终被写出来。 Hibernate 可能并且将重新排序实际的数据库操作以及引发事件的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多