Spring data neo4j копирует свойства в другие узлы сессии - PullRequest
0 голосов
/ 24 января 2019

В моем коде я пытаюсь создать копию существующего объекта с некоторыми измененными свойствами. Сначала я делаю старую сущность неактивной, а затем создаю новую копию с новыми свойствами и подключаю новую к тем же отношениям, что и старая. По какой-то причине при сохранении новой сущности новые свойства (называемые 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;
}
...