Я отвечаю на свой вопрос:
Кажется, проблема в стратегии генерации идентификаторов.В этом случае я генерирую Id перед сохранением в хранилище, и это вызывает проблемы.В частности,
Из того, что я мог видеть SimpleJpaRepository
имеет этот код
public <S extends T> S save(S entity) {
if (this.entityInformation.isNew(entity)) {
this.em.persist(entity);
return entity;
} else {
return this.em.merge(entity);
}
}
, где решение о том, является ли объект новым, принимается JpaPersistableEntityInformation
здесь:
public boolean isNew(T entity) {
return entity.isNew();
}
и entity.isNew()
определяется следующим образом:
@Transient
public boolean isNew() {
return null == this.getId();
}
Таким образом, другими словами, стратегия генерации идентификатора фактически влияет на результат каскада.И на самом деле я подтвердил свое предположение, изменив везде идентификаторы на
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
и, вуаля, все работает.
Не идеальная ситуация, но, по крайней мере, я знаю, почему этоэто происходит.Итак, PERSIST в основном применяется только к идентификаторам, сгенерированным в БД?Кажется странным, поэтому, если у кого-то есть предложения о том, как преодолеть эту проблему, сообщите нам.
С уважением