Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 完成删除和插入异常_Java_Jpa_Spring Data_Spring Data Jpa_Jpa 2.0 - Fatal编程技术网

Java 完成删除和插入异常

Java 完成删除和插入异常,java,jpa,spring-data,spring-data-jpa,jpa-2.0,Java,Jpa,Spring Data,Spring Data Jpa,Jpa 2.0,我有一个问题,需要执行完全删除,然后插入。 尝试过一种方法,可以建议有没有其他更好的方法 { "incidentTime": 1491207083634, "estCode": 152, "incidentParamTrans": [ { "paramValueList": [ 11, 12, 14 ] } ] } 这是主实体类 @Entity @Table(name="I

我有一个问题,需要执行完全删除,然后插入。 尝试过一种方法,可以建议有没有其他更好的方法

{   
  "incidentTime": 1491207083634,
  "estCode": 152,
  "incidentParamTrans": [
    {      
      "paramValueList": [
        11,
        12,
        14
      ]
    }
  ]
}
这是主实体类

@Entity
@Table(name="IR_TB_INCIDENT_HDR")
public class IncidentHdr implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="IR_TB_INCIDENT_HDR_INCIDENTID_GENERATOR", sequenceName="IR_SEQ_INCIDENT_ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="IR_TB_INCIDENT_HDR_INCIDENTID_GENERATOR")
    @Column(name="INCIDENT_ID")
    private long incidentId;

    @OneToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.LAZY,  mappedBy="incidentHdr")
    private Set<IncidentParamTran>  incidentParamTrans;

    public IncidentHdr() {
    }

}
如果输入是这样的

{   
  "incidentId": 4700,
  "incidentTime": 1491207083634,
  "estCode": 152,
  "incidentParamTrans": [
    {      
      "paramValueList": [
        10,
        14,
      ]
    }
  ]
}
必须删除IncidentParamTrans表中的所有数据,事件Id为4700。其中,事件Id不是主键

之后,我必须将所有新记录(2条记录)插入IncidentParamTrans

执行完全删除并执行新插入,这反过来引发刷新异常

我试过的代码

服务层代码段

@Override
    @Transactional(rollbackFor=IncidentReportingException.class)
    public IncidentHdrDto saveIncidentReport(IncidentHdrDto incidentHdrDto)
    if(incidentHdrDto.getIncidentParamTrans()!= null ){
            Set<IncidentParamTranDto> incidentParamTranDtos = new HashSet<IncidentParamTranDto>();
        //  dto.getSensitivityPattern().remove
            IncidentHdr inc = mapper.map(incidentHdrDto, IncidentHdr.class);
            incidentParamTransRepo.deleteByIncidentHdr(inc);

            for(IncidentParamTranDto item:incidentHdrDto.getIncidentParamTrans()){

                if(item != null){
                    for(BigDecimal paramItem: item.getParamValueList()){
                        IncidentParamTranDto val = new IncidentParamTranDto();
                        val.setParamId(paramItem);
                        val.setIncidentHdr(incidentHdrDto);
                        incidentParamTranDtos.add(val);
                    }
                }
            }
            incidentHdrDto.setIncidentParamTrans(incidentParamTranDtos);
        }

        result = saveIncidentHdr(incidentHdrDto);
        }

我认为它失败的原因是,
IncidentHdr.incidentParamTrans
收集仍然处于无效状态,因为实际删除事件参数是由
incidentparamtransrop.deleteByIncidentHdr(inc)处理的;
存储库调用,但另一方面,CRUD操作的所有权通过级联行为配置在
IncidentHdr.incidentParamTrans
上设置

为避免混淆,我建议尝试以下方法:

  • 首先将“IncidentHdr.incidentParamTrans”转换为DTO供以后使用
  • 清除
    IncidentHdr.incidentParamTrans
    集合:
    inc.getIncidentParamTrans().Clear()
  • 使用刷新来保存IncidentHdr:
    IncidentHdr还原。**saveAndFlush**(inc)
    。这将触发使用手动存储库调用执行的删除查询。使用刷新执行save非常重要,因此在再次填充集合之前,此时将执行实际的删除查询
  • 再次填写“IncidentHdr.incidentParamTrans”并保存它
  • 这种方法的优点是Hibernate可以跟踪对
    IncidentHdr.incidentParamTrans
    集合所做的所有更改,并确保正确处理状态。 这种方法的一个缺点是它会将整个
    IncidentHdr.incidentParamTrans
    集合加载到内存中,但是,根据您的配置,我认为这应该不是问题,因为您已经这样做了(通过将
    IncidentHdr.incidentParamTrans
    的CRUD管理委托给
    IncidentHdr
    实体)

    希望这有帮助

    @Override
        @Transactional(rollbackFor=IncidentReportingException.class)
        public IncidentHdrDto saveIncidentReport(IncidentHdrDto incidentHdrDto)
        if(incidentHdrDto.getIncidentParamTrans()!= null ){
                Set<IncidentParamTranDto> incidentParamTranDtos = new HashSet<IncidentParamTranDto>();
            //  dto.getSensitivityPattern().remove
                IncidentHdr inc = mapper.map(incidentHdrDto, IncidentHdr.class);
                incidentParamTransRepo.deleteByIncidentHdr(inc);
    
                for(IncidentParamTranDto item:incidentHdrDto.getIncidentParamTrans()){
    
                    if(item != null){
                        for(BigDecimal paramItem: item.getParamValueList()){
                            IncidentParamTranDto val = new IncidentParamTranDto();
                            val.setParamId(paramItem);
                            val.setIncidentHdr(incidentHdrDto);
                            incidentParamTranDtos.add(val);
                        }
                    }
                }
                incidentHdrDto.setIncidentParamTrans(incidentParamTranDtos);
            }
    
            result = saveIncidentHdr(incidentHdrDto);
            }
    
        @Override
        public IncidentHdrDto saveIncidentHdr(IncidentHdrDto incidentHdrDto)
                throws IncidentReportingException {
            return mapper.map(iReportingRepo.save(mapper.map(incidentHdrDto, IncidentHdr.class)),IncidentHdrDto.class);
        }
    
    Repo class used to delete 
    
        public interface IncidentParamTransRepo extends JpaRepository<IncidentParamTran, Long> {
    
    
    
        Long deleteByIncidentHdr(IncidentHdr inc);
    
    }
    
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: om.gov.moh.irs.model.entity.incident.IncidentHdr