Вопрос в основном такой же, как и ниже:
Сохранение каскада JPA и ссылки на отдельные объекты бросают PersistentObjectException. Почему?
Я создаю новый объект, который ссылается на существующий, отдельный. Теперь, когда я сохраняю этот объект в моем репозитории данных spring, генерируется исключение:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
если мы посмотрим на метод save() в исходном коде данных spring JPA, мы видим:
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
и если мы посмотрим на isNew() в AbstractEntityInformation
public boolean isNew(T entity) {
return getId(entity) == null;
}
Таким образом, в принципе, если я сохраню() новый объект (id == null)
, spring данные всегда будут вызываться persist, и, следовательно, этот сценарий всегда будет терпеть неудачу.
Это, кажется, очень типичный случай использования при добавлении новых элементов в коллекции.
Как я могу это решить?
ИЗМЕНИТЬ 1:
Примечание:
Эта проблема НЕ относится непосредственно к Как сохранить новый объект, который ссылается на существующий объект в spring JPA?. Чтобы уточнить, предположим, что вы получаете запрос на создание нового объекта через http. Затем вы извлекаете информацию из запроса и создаете свою сущность и существующую ссылку. Следовательно, они всегда будут отстранены.