2016-10-29 6 views
0

Имейте простую структуру, подобную этой.Каков правильный способ обновления графика, содержащего удаление узлов по данным весны neo4j?

@Data 
public class DomainObject { 
    @GraphId 
    protected Long id; 
    public String createdBy; 
    public Date createdTS; 
    public String lstModBy; 
    public Date lstModTS; 
} 

@NodeEntity(label = "StepDef") 
@Data 
public class StepDef extends DomainObject{ 
    private String name; 
    private String type; 
    private String catCode; 
    private String impClass; 
    private String scope; 
    @Relationship(type = "PROPERTY_OF" = Relationship.INCOMING) 
    private List<StepDefProperty> properties; 
} 

@NodeEntity(label = "StepDefProperty") 
@Data 
public class StepDefProperty extends DomainObject{ 
     private String key; 
     private String value; 
     private String type; 
     private String lookupKey; 
} 

Когда я пытаюсь добавить объекты StepDefProperty к списку свойств и использовать stepRepo.save (stepDef) он сохраняет идеально, как ожидается, наряду с отношениями.

enter image description here

Вопрос заключается при удалении одного из узла свойств. Поэтому, если я удалю один из узлов свойств из списка и использую repo.save (stepDef), узел свойства не будет удален. Я думал, что это может быть связано с непоследовательной сессией. Итак, я попытался сделать stepRepo.findOne (stepDef.getId()) перед выполнением repo.save (stepDef) Теперь это устраняет взаимосвязь между узлами, однако узел свойств все еще присутствует в базе данных как сирота, тогда как ожидаемый узел свойства вместе с удаляемой связью. enter image description here Каков правильный способ делать обновления через весенние данные neo4j?

+0

Помогает ли вам [этот вопрос] (http://stackoverflow.com/questions/30130275/spring-data-neo4j-remove-nodeentity-and-all-referenced-nodes/40136479#40136479)? – troig

ответ

0

Вы определенно используете API правильно, когда дело доходит до разъединения связи между узлом StepDef и отношениями StepDefProperty.

Проблема в том, что вы не сказали OGM Session, что вы хотите также удалить узел на другом конце удаленной связи.

Так что вам нужно будет восстановить удаляемый узел свойств, а также удалить его из коллекции в StepDef. Затем вы можете позвонить repo.delete(StepDefPropertyToBeDeleted) и repo.save(stepDef), и все будет работать так, как вы планируете.

+0

Благодарим за отзыв. Но это означало бы, что мне придется вручную отслеживать удаляемый узел, а не использовать его. Хотел бы надеяться, что данные о весне будут обработаны для меня. –

+0

В каких других рамках вы могли бы ожидать, что сущность будет удалена? Если объект домена хорошо инкапсулирован, довольно легко получить объект, который будет удален. – digx1

+0

(Извините за выемку этой старой темы), например. Hibernate предоставляет свойство для своих реляционных аннотаций с именем «orphanRemoval», которое имеет точно желаемое поведение: Удалить объекты, которые потеряли отношение к сохраненной Entity (например, при сохранении родительского объекта). Имеет ли spring-data-neo4j что-то подобное в своих новейших версиях? Это уменьшило бы много шаблонов-кодов (для удаления сирот) – David