Naveen Kumar Gurram
Naveen Kumar Gurram

Reputation: 23

Spring Boot 2.0 CrudRepository save method not flushing by default

I have a JPA entity shown below have OneToMany collection and when I use save on the entities mentioned in collection, I expect flush will automatically flush the changes and the collection is populated, but it's not happening, is there a way I can force 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;
}

my jpa repository class

@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;
        }

I tried doing findById to get DataCollectionInstance later but no luck.

what am I doing wrong?

Upvotes: 1

Views: 3742

Answers (1)

gokhanbirincii
gokhanbirincii

Reputation: 585

Just add cascadeType to related relation annotation.

For example if you want to persist list of DataCollectionInstanceEvent with your DataCollectionInstance.

Related property should be looking :

@OneToMany(mappedBy = "dataCollectionInstance", cascade = CascadeType.ALL)
 private Collection<DataCollectionInstanceEvent> events;

Upvotes: 3

Related Questions