【问题标题】:Spring Boot 2.0 CrudRepository save method not flushing by defaultSpring Boot 2.0 CrudRepository 保存方法默认不刷新
【发布时间】:2018-08-27 18:05:15
【问题描述】:

我有一个如下所示的 JPA 实体,它有 OneToMany 集合,当我对集合中提到的实体使用保存时,我希望刷新会自动刷新更改并填充集合,但它没有发生,有没有办法可以强制刷新。

@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 但没有成功。

我做错了什么?

【问题讨论】:

  • 您能分享您调用存储库方法的代码吗?可能有一个事务性进程,它会回滚保存操作。
  • 扩展JpaRepository,如果您想手动处理它,请自行在存储库上调用flush。
  • @DarrenForsythe 我试过 JpaRepository 但没有用。
  • @EmreSavcı 更新了控制器和服务类

标签: java spring-boot spring-data-jpa


【解决方案1】:

只需在相关关系注解中添加cascadeType即可。

例如,如果您想将 DataCollectionInstanceEvent 列表与您的 DataCollectionInstance 一起保存。

相关属性应该看:

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

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多