Spring Boot 2.0 CrudRepository метод сохранения не сбрасывается по умолчанию - PullRequest
0 голосов
/ 27 августа 2018

У меня есть сущность JPA, показанная ниже, с коллекцией OneToMany, и когда я использую save для сущностей, упомянутых в коллекции, я ожидаю, что flush автоматически сбросит изменения, и коллекция заполнится, но этого не происходит, есть ли способ, которым я могу принудительная очистка.

@Entity
@Table(name = "data_clctn_instc")
public class DataCollectionInstance {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator ="data_clctn_instc_seq_gen")
    @SequenceGenerator(name = "data_clctn_instc_seq_gen", sequenceName = "data_clctn_instc_seq", allocationSize = 1)
    @Column(name = "id")
    private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "data_clctn_tmplt_id")
    @JsonBackReference
    private DataCollectionTemplate dataCollectionTemplate;

    @OneToMany(mappedBy = "dataCollectionInstance")
    private Collection<DataCollectionInstanceEvent> events;

    @OneToMany(mappedBy = "dataCollectionInstance")
    private Collection<PostProcessingInstance> postProcessingInstances;
}

мой класс репозитория jpa

@Repository
public interface DataCollectionInstanceDao extends   CrudRepository<DataCollectionInstance, Long> {
}

            @RequestMapping(value = "/{template}/instance", method = RequestMethod.POST, consumes = {"application/json"})
        @PreAuthorize("hasAuthority('" + SecurityFunctions.FN_CREATE_INSTANCE + "')")
        @ResponseStatus(code = HttpStatus.CREATED)
        public DataCollectionInstance createInstance(@PathVariable(TEMPLATE_PATH_VARIABLE) final String templateName,
                @RequestBody DataCollectionEntity dataCollectionEntity) {
            DataCollectionInstance dataCollectionInstance = dataCollectionInstanceService.createInstance(templateName, dataCollectionEntity);
            return dataCollectionInstance;
        }

        public DataCollectionInstance createInstance(String templateName, DataCollectionEntity dataCollectionEntity) {
            // get the template
            Optional<DataCollectionTemplate> dataCollectionTemplateOptional = dataCollectionTemplateDao.findByName(templateName);
            if (!dataCollectionTemplateOptional.isPresent()) {
                throw new IllegalArgumentException("Invalid templateName");
            }
            DataCollectionTemplate dataCollectionTemplate = dataCollectionTemplateOptional.get();
            DataCollectionInstance dataCollectionInstance = createInstance(dataCollectionTemplate, dataCollectionEntity);
            createEvent(dataCollectionEntity, dataCollectionTemplate, dataCollectionInstance);
            createProcessingInstance(dataCollectionInstance)
            return dataCollectionInstance;
        }

        private void createProcessingInstance(DataCollectionInstance dataCollectionInstance) {
            PostProcessingInstance pi = new PostProcessingInstance();
            pi.setDataCollectionInstance(dataCollectionInstance);
            pi.setCreatedBy(getUserName());
            pi.setCreatedDate(new Date());
            pi.setResourceName(execution);
            pi.setResponse("rspo");
            pi.setStatus("adf");

            // save to DB
            postProcessingInstanceDao.save(pi);
        }

        private DataCollectionInstanceEvent createEvent(DataCollectionEntity dataCollectionEntity,
                HttpMethod eventStatus, DataCollectionInstance dataCollectionInstance) {

            DataCollectionInstanceEvent dataCollectionInstanceEvent = new DataCollectionInstanceEvent();
            dataCollectionInstanceEvent.setAction(eventStatus);
            dataCollectionInstanceEvent.setCreatedBy(getUserName());
            dataCollectionInstanceEvent.setData(dataCollectionEntity.getSubmitData().toString());
            dataCollectionInstanceEvent.setDataCollectionInstance(dataCollectionInstance);

            dataCollectionInstanceEventDao.save(dataCollectionInstanceEvent);

            return dataCollectionInstanceEvent;
        }

        private DataCollectionInstance createInstance(DataCollectionTemplate dataCollectionTemplate, DataCollectionEntity dataCollectionEntity){
            DataCollectionInstance dataCollectionInstance = new DataCollectionInstance();
            dataCollectionInstance.setStatus(dataCollectionEntity.getStatus());
            dataCollectionInstance.setDataCollectionTemplate(dataCollectionTemplate);
            dataCollectionInstance.setSubmitData(dataCollectionEntity.getSubmitData().toString());
            dataCollectionInstance.setCreatedBy(getUserName());
            dataCollectionInstance.setCreatedDate(new Date());

            dataCollectionInstance = dataCollectionInstanceDao.save(dataCollectionInstance);
            return dataCollectionInstance;
        }

Я пытался сделать findById, чтобы позже получить DataCollectionInstance, но безуспешно.

что я делаю не так?

1 Ответ

0 голосов
/ 28 августа 2018

Просто добавьте cascadeType к аннотации связанного отношения.

Например, если вы хотите сохранить список DataCollectionInstanceEvent с вашим DataCollectionInstance.

Похожая недвижимость должна выглядеть:

@OneToMany(mappedBy = "dataCollectionInstance", cascade = CascadeType.ALL)
 private Collection<DataCollectionInstanceEvent> events;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...