Как я могу использовать (Spring Boot / Hibernate / JPA) для создания копии родительского объекта, а также для копирования всех детей. Процедура. Детей жаждут загрузки, так как это не сделано под @Transactional, и поэтому ленивый не сработает. Не использовать @Transacional позволяет мне установить id = null ко всем объектам, чтобы, когда я буду сохранять их, они были вставлены в виде новых записей
[*], тогда я звоню @transactional Service Method
Сохранить родителей, чтобы ID заполнялся < /li>
set child.parent_id = (идентификатор родителей) < /li>
Сохранить Дети
Мне нужно, чтобы эта часть была @transactional в случае сохранения родителя, но дети не так, чтобы в этом случае переворачивались.
Одна проблема заключается в том, что таким образом я не могу использовать ленивую загрузку. Контроллер, так как он не может быть под @transactional Потому что тогда я не могу использовать id = null. < /p>
Я также не могу перенести этот код в метод обслуживания, который не является @TransActional, а затем вызовуте другой метод обслуживания, который @Transactional для выполнения Сохранение, потому что когда метод @transactional вызывается в методе обслуживания, тогда @transactional Annotation игнорируется. сложный в том же Время должно знать обо всех этих соображениях.@GetMapping(path = "/{schemaId}/copyEntityList", produces = "application/json")
public void copyEntityList(@RequestBody List ids) throws RuntimeException {
//GET ENTITIES
List entities = entityRepository.findAllById(ids);
//INSERT ENTITIES
copyService.insertEntities(entities);
}
< /code>
copyservice2.java
@Transactional
public void insertEntities(List entities) throws RuntimeException {
//REMOVE IDS, CHANGE NAME & CODE
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for(Entity2 entity : entities) {
entity.setName(entity.getName() + " - COPY (" + LocalDateTime.now().format(formatter) + ")");
entity.setCode(entity.getCode() + " (" + LocalDateTime.now().format(formatter) + ")");
entity.setId (null);
}
//INSERT PARENTS (to get IDs)
entityRepository.saveAll(entities);
if (false) { throw new RuntimeException("Error"); }
//UPDATE CHILDREN (with PARENT_ID)
List clonedChildEntities = new ArrayList();
for(Entity2 parentEntity : entities) {
for(Entity2 childEntity : parentEntity.getChildEntities()) {
childEntity.setId (null);
childEntity.setParentId(parentEntity.getId());
childEntity.setName (childEntity.getName() + " - COPY (" + LocalDateTime.now().format(formatter) + ")");
childEntity.setCode (childEntity.getCode() + " (" + LocalDateTime.now().format(formatter) + ")");
clonedChildEntities.add(childEntity);
}
}
//INSERT CHILDREN
entityRepository.saveAll(clonedChildEntities);
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... d-children