spring 数据 LastModifiedDate 是如何在一个对象上设置的以及顺序是什么

how spring data LastModifiedDate is set on an object and in which order

我看到 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(和休眠)如何处理这个 LastModifiedDate?

谢谢。

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

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