2

В моей Neo4j 3.0.1 и SDN 4.1.1.RELEASE проекта У меня есть следующие объекты:Neo4j 3.0.1 SDN 4.1.1.RELEASE фантомные узлы

@NodeEntity 
public class CriterionGroup extends Authorable { 

    private final static String DEFINED_BY = "DEFINED_BY"; 
    private final static String CONTAINS = "CONTAINS"; 

    private String name; 

    private String description; 

    @Relationship(type = DEFINED_BY, direction = Relationship.OUTGOING) 
    private Decision owner; 

    @Relationship(type = CONTAINS, direction = Relationship.OUTGOING) 
    private Set<Criterion> criteria = new HashSet<>(); 
.... 

@NodeEntity 
public class Criterion extends Authorable { 

    private final static String CONTAINS = "CONTAINS"; 
    private final static String DEFINED_BY = "DEFINED_BY"; 

    private String name; 

    private String description; 

    @Relationship(type = CONTAINS, direction = Relationship.INCOMING) 
    private CriterionGroup group; 

    @Relationship(type = DEFINED_BY, direction = Relationship.OUTGOING) 
    private Decision owner; 
.... 


@NodeEntity 
public class Decision extends Commentable { 

    private final static String CONTAINS = "CONTAINS"; 
    private final static String DEFINED_BY = "DEFINED_BY"; 
    private final static String VOTED_FOR = "VOTED_FOR"; 

    private String name; 

    @Relationship(type = CONTAINS, direction = Relationship.INCOMING) 
    private Set<Decision> parentDecisions = new HashSet<>(); 

    @Relationship(type = CONTAINS, direction = Relationship.OUTGOING) 
    private Set<Decision> childDecisions = new HashSet<>(); 

    @Relationship(type = DEFINED_BY, direction = Relationship.INCOMING) 
    private Set<CriterionGroup> criterionGroups = new HashSet<>(); 

    @Relationship(type = DEFINED_BY, direction = Relationship.INCOMING) 
    private Set<Criterion> criteria = new HashSet<>(); 
.... 

В моем тесте я пытаюсь удалить CriterionGroup со следующим способом: репозитария

@Query("MATCH()-[r]-(cg:CriterionGroup) WHERE id(cg) = {criterionGroupId} DELETE cg, r") 
void deleteCriterionGroup(@Param("criterionGroupId") Long criterionGroupId); 

то, что я пытаюсь получить эту CriterionGroup по идентификатору

criterionGroupRepository.findOne(id); 

и он возвращает NULL. Все идет нормально.

Сразу после того, что я пытаюсь получить групповой объект из Criterion, который был в удаленном CriterionGroup и он возвращает .. удален CriterionGroup

criterionRepository.findOne(criterion.getId()).getGroup() 

Что я делаю неправильно? Все работало нормально на SDN 3.4.4.RELEASE и Neo4j 2.3.3, но с Neo4j 3.0.1SDN 4.1.1.RELEASE из-за моих ограниченных знаний. У меня много неожиданных ситуаций.

Кроме того, хорошо ли иметь следующее определение отношений в единое целое (я удалил enforceTargetType)

@Relationship(type = CONTAINS, direction = Relationship.INCOMING) 
private Set<Decision> parentDecisions = new HashSet<>(); 

@Relationship(type = CONTAINS, direction = Relationship.OUTGOING) 
private Set<Decision> childDecisions = new HashSet<>(); 

они имеют разные направления.

ответ

2

Насколько я могу судить, у вас появляется эта группа CriterionGroup, потому что вы удалили ее с помощью пользовательского запроса, минуя OGM. График знает о ваших изменениях, но контекст сопоставления OGM не делает. Решение состоит в том, чтобы отменить регистрацию этого объекта после сеанса после того, как вы удалили его с помощью настраиваемого запроса, используя Session.detachEntity(id), или обновите весь сеанс session.clear().

Да, это хорошо, чтобы иметь СОДЕРЖИТ определение отношений, пожалуйста, помните, что для любых отношений отмеченных INCOMING, вы должны аннотировать аксессор, мутаторы и свойство для parentDecisions, если они существуют с @Relationship(type = CONTAINS, direction = Relationship.INCOMING)

Update: Также сделайте убедитесь, что ваша объектная модель синхронизирована с тем, что вы удаляете с помощью пользовательского запроса. т. е. если вы удаляете CriterionGroup с помощью пользовательского запроса, вы также должны обновить свою объектную модель, чтобы отразить это, например, criterion.group=null. Или полностью очистите сеанс, используя session.clear() и перезагрузите все зависимые объекты.

+0

Спасибо за ваш ответ. Каков правильный способ получения ссылки на объект Session? Кроме того, для 'Decision.parentDecisoins' у меня есть следующие методы:' Set getParentDecisions() ',' addParentDecision (решение по решению) ',' removeParentDecision (решение решения) '.. если все они также будут аннотированы с помощью' @Relationship (type = CONTAINS, direction = Relationship.INCOMING) '? Если да, зачем нам такое избыточное резервирование? – brunoid

+0

Я нашел способ доступа к сеансу. Но 'session.detachNodeEntity (criterionGroupId);' не работает. Но 'session.clear();' очищает все остальные объекты, поэтому все мои существующие тесты терпят неудачу. – brunoid

+0

Также у вас есть планы по автоматической синхронизации состояния между OGM и пользовательским выполнением запроса Cypher? – brunoid

 Смежные вопросы

  • Нет связанных вопросов^_^