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 调用 save
或 persist
或 merge
实际上不会写入您的对象到数据库,但只是将其注册为最终写入。 Hibernate 可能并且将会重新排序实际的数据库操作以及引发事件的顺序。
我看到 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 调用 save
或 persist
或 merge
实际上不会写入您的对象到数据库,但只是将其注册为最终写入。 Hibernate 可能并且将会重新排序实际的数据库操作以及引发事件的顺序。