gpt4 book ai didi

java - 完成删除和插入抛出刷新异常

转载 作者:行者123 更新时间:2023-12-02 13:29:16 26 4
gpt4 key购买 nike

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

{   
"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() {
}

}

这是具有一对多映射的实体类。其中 DTO 中的 paramValueList(来自请求 json)被获取并作为 3(paramId) 记录插入到 IncidentParamTrans 表中。

/**
* The persistent class.
*
*/
@Entity
@Table(name="IR_TB_INCIDENT_PARAM_TRAN")
public class IncidentParamTran implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name="IR_TB_INCIDENT_PARAM_TRAN_GENERATOR", sequenceName="IR_SEQ_INCIDENT_PARAM_RUN_ID")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="IR_TB_INCIDENT_PARAM_TRAN_GENERATOR")
@Column(name="PARAM_RUN_ID")
private long paramRunId;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="INCIDENT_ID")
private IncidentHdr incidentHdr;


@Column(name="PARAM_ID")
private BigDecimal paramId;


public IncidentParamTran() {
}


}

如果输入是这样的。

{   
"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);
}

将 dto 映射到实体并调用 repo save 方法。

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

}

异常(exception):

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: om.gov.moh.irs.model.entity.incident.IncidentHdr

最佳答案

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

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

  1. 首先将“IncidentHdr.incidentParamTrans”转换为 DTO 供以后使用
  2. 清除 IncidentHdr.incidentParamTrans 集合:inc .getIncidentParamTrans().clear()
  3. 保存并刷新IncidentHdr:incidentHdrRepository.**saveAndFlush**(inc)。这将触发您通过手动存储库调用执行的删除查询。使用刷新执行保存非常重要,因此在再次填充集合之前此时执行实际的删除查询。
  4. 再次填写“IncidentHdr.incidentParamTrans”并保留/保存

这种方法的优点是 Hibernate 可以跟踪对 IncidentHdr.incidentParamTrans 集合所做的所有更改,并确保正确处理状态。这种方法的缺点之一是它将整个 IncidentHdr.incidentParamTrans 集合加载到内存中,但是,根据您的配置,我相信这应该不是问题,因为您已经这样做了(通过委派IncidentHdr.incidentParamTransIncidentHdr 实体的 CRUD 管理)。

希望这有帮助。

关于java - 完成删除和插入抛出刷新异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43247978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com