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
集合:inc.getIncidentParamTrans().Clear()
IncidentHdr还原。**saveAndFlush**(inc)
。这将触发使用手动存储库调用执行的删除查询。使用刷新执行save非常重要,因此在再次填充集合之前,此时将执行实际的删除查询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