В моем коде я пытаюсь создать копию существующего объекта с некоторыми измененными свойствами. Сначала я делаю старую сущность неактивной, а затем создаю новую копию с новыми свойствами и подключаю новую к тем же отношениям, что и старая. По какой-то причине при сохранении новой сущности новые свойства (называемые editProperties в приведенном ниже коде) автоматически копируются и в старую, что нежелательно.
Если я сохраняю новый объект с глубиной 0, он работает нормально и свойства не копируются, но при использовании сохранения по умолчанию я сталкиваюсь с упомянутой проблемой
Ниже приведен код, который я использую с определенными классами
public void editAsset(String company, String assetCode, Map<String, String> editProperties) {
Asset asset = assetRepository.findByCodeAndActiveIndAndCurrentInd(assetCode, true, true)
;
AssetType assetType = assetTypeRepository.findByCompanyAndType(company, asset.getType())
;
for (String editProperty : editProperties.keySet()) {
if (assetType.getAllowedProperties().stream()
.anyMatch(ap -> ap.getName().equals(editProperty) && ap.getUpgradeOnUpdate())) {
asset = upgradeAsset(asset);
break;
}
}
for (Entry<String, String> newAssetProp : editProperties.entrySet()) {
asset.getProperties().put(newAssetProp.getKey(), newAssetProp.getValue());
}
assetRepository.save(asset,0); // Problem when saved with default depth
}
private Asset upgradeAsset(Asset oldAsset) {
oldAsset.setCurrentInd(false);
Asset newAsset = new Asset(oldAsset.getName(), oldAsset.getType(), oldAsset.getCode(), oldAsset.getParentOrg(),
oldAsset.getProperties(), true, true);
for (AssetConnection oldConOut : oldAsset.getConnnectionOut()) {
AssetConnection newAssetConnectionOut = new AssetConnection(newAsset, oldConOut.getEndAsset(),
oldConOut.getType(), oldConOut.getProperties());
newAsset.getConnnectionOut().add(newAssetConnectionOut);
}
for (AssetConnection oldConIn : oldAsset.getConnnectionIn()) {
AssetConnection newAssetConnectionIn = new AssetConnection(oldConIn.getStartAsset(), newAsset,
oldConIn.getType(), oldConIn.getProperties());
newAsset.getConnnectionIn().add(newAssetConnectionIn);
}
assetRepository.saveAll(Arrays.asList(oldAsset,newAsset));
return newAsset;
}
@NodeEntity
public class Asset {
@Id
@GeneratedValue
@JsonIgnore
private Long id;
@Property("name")
private String name;
@Property("type")
private String type;
@ApiModelProperty(hidden = true)
@Property("code")
private String code = UUID.randomUUID().toString();
@ApiModelProperty(hidden = true)
@Property("active_ind")
private boolean activeInd;
@ApiModelProperty(hidden = true)
@Property("current_ind")
private boolean currentInd;
@ApiModelProperty(hidden = true)
@Relationship(type = "ASSET_CONNECTION")
private Set<AssetConnection> connnectionOut = new HashSet<>();
@JsonIgnore
@Relationship(type = "ASSET_CONNECTION", direction = Relationship.INCOMING)
private Set<AssetConnection> connnectionIn = new HashSet<>();
@JsonIgnore
@Relationship(type = "ORG_ASSET", direction = Relationship.INCOMING)
private Organisation parentOrg;
@Properties
private Map<String, String> properties = new HashMap<>();
public Asset() {
}
}
public class AssetType {
@Id
@GeneratedValue
@JsonIgnore
private Long id;
@Property("type")
private String type;
@Property("company")
private String company;
@Relationship(type = "ALLOWED_PROPERTY")
private Set<PropertyType> allowedProperties;
}