存在关联实体的保存问题

问题产生

最开始的时候,是在做非强检器具的编辑功能。添加了一个非强检器具,然后点击编辑,获取对应的对象,然后绑定在表单上,附加参量没有出现。

图中红框的位置应该有一个附加参量的编辑部分,但现在没有出现。然后从次开始问题的查找。

问题定位

1.检查前台问题

首先是先检查一下是否是前台出错了,因为这是个动态的表单,所以存在ng-show,检查无误。附加参量的位置使用了ng-repeat,也就是说,只要获取到了数据,附加参量就会显示。

2.检查jsonview

调用的是get方法,所以可能是相应的实体上没有添加jsonview,所以在前台没有获取到对应的数据。将所有的关联实体都添加上jsonview后,依然不好使。也不是这个问题。

3.打印获取的对象

获取的附加参量是一个空数组。到这里可以知道,get方法没有出错。那么既然获取没有问题,那么就只能是保存的时候出现了问题。

4.查找save的错误

这个保存的问题还是花了挺长时间才找到的。最后还是因为巧合才发现问题的原因。

最开始,我的更新方法update在保存的时候使用的是jpa自带的保存方法。

1
2
3
4
5
6
@Override
public void update(Long id, NonMandatoryInstrument nonMandatoryInstrument) {
...
logger.debug("持久化更新内容");
nonMandatoryInstrumentRepository.save(oldNonMandatoryInstrument);
}

这里直接使用repository的save方法,然后我先点击了一下编辑,然后保存。在点击编辑,发现原来的参量也不见了。

然后我将update的保存方法也换成M层的保存方法。就和最上面的问题一样了:参量能存上,但是附加参量存不上。

所以我就去看了一下M层的save是怎么写的:

1
2
3
4
5
6
7
public void save(NonMandatoryInstrument nonMandatoryInstrument) {
logger.debug("为参数添加非强检器具");
for(Parameter parameter: nonMandatoryInstrument.getParameterSet()) {
parameter.setNonMandatoryInstrument(nonMandatoryInstrument);
}
nonMandatoryInstrumentRepository.save(nonMandatoryInstrument);
}

发现在保存之前先为每个参量添加了非强检器具这个属性。看到这里我就知道问题所在了:保存的时候没有设置附加参量的参量属性。

原因猜测

首先我们知道非强检器具参量一对多的关系。参量附加参量一对多的关系。我们在建实体的时候,避免生成中间表,使用了mappedBy这个属性,交由一的一方来维护表。这样就会在参量的表中生成一个非强检器具的外键,所以如果在保存的时候不为参量添加非强检器具,这个外键就是空的。所以在查询的时候就不能关联查询出参量。参量和附加参量也是这个道理。

问题解决

解决办法很简单,在保存之前,为附加参量设置参量这个属性。

1
2
3
4
5
6
7
8
9
10
11
public void save(NonMandatoryInstrument nonMandatoryInstrument) {
logger.debug("为参数添加非强检器具");
for(Parameter parameter: nonMandatoryInstrument.getParameterSet()) {
parameter.setNonMandatoryInstrument(nonMandatoryInstrument);
logger.debug("为附加参量添加参量");
for (AdditionalParameter additionalParameter: parameter.getAdditionalParameterSet()) {
additionalParameter.setParameter(parameter);
}
}
nonMandatoryInstrumentRepository.save(nonMandatoryInstrument);
}

总结

这次的问题解决时间还是比较长的,虽然最终问题是解决了,但是还是暴露出比较多的问题。一个就是对已知的知识掌握的不够灵活,另一个就是debug能力比较弱。

坚持原创技术分享,您的支持将鼓励我继续创作!