2016-04-02 3 views
2

мне нужно создать новый узел класса А, который имеет связь с узлом пользователя:Spring Data Neo4j - Создать новый узел с связи с существующим узлом

@NodeEntity 
public class A implements Serializable { 

    /** 
    * Graph node identifier 
    */ 
    @GraphId 
    private Long nodeId; 

    /** 
    * Enity identifier 
    */ 
    private String id; 

    //... more properties ... 

    @Relationship(type = "HAS_ADVERTISER", direction = Relationship.OUTGOING) 
    private User user; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof IdentifiableEntity)) return false; 

     IdentifiableEntity entity = (IdentifiableEntity) o; 
     if (!super.equals(o)) return false; 

     if (id != null) { 
      if (!id.equals(entity.id)) return false; 
     } else { 
      if (entity.id != null) return false; 
     } 

     return true; 
    } 


} 


@NodeEntity 
public class User implements Serializable { 

    /** 
    * Graph node identifier 
    */ 
    @GraphId 
    private Long nodeId; 

    /** 
    * Enity identifier 
    */ 
    private String id; 

    //... more properties ... 


    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof IdentifiableEntity)) return false; 

     IdentifiableEntity entity = (IdentifiableEntity) o; 
     if (!super.equals(o)) return false; 

     if (id != null) { 
      if (!id.equals(entity.id)) return false; 
     } else { 
      if (entity.id != null) return false; 
     } 

     return true; 
    } 

} 

Теперь, давайте предположим, что мы имеем следующие данные для нового узла A:

{ 
    "id": 1, 
    "nodeId": "0001-0001", 
    "user": { 
      "id": 4, 
      "nodeId": "0002-0002", 
      "name": null, 
      "firstName": null 
      } 
} 

Я пытаюсь создать узел а с отношением между новым узлом а и (уже существующим) узлом пользователя, который имеет «идентификатор» : 4 и «nodeId»: «0002-0002» (уникальный идентификатор узла), но вместо этого пользовательский узел обновляет поля «na меня "и" firstName "с null.

Я использую GraphRepository прокси для его создания:

@Repository 
public interface ARepository extends GraphRepository<A> { 


} 

Есть ли способ сделать это без этого обновления, только делая связь с узлом пользователя?

ответ

0

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

+0

Благодарим за отзыв! –

0

Вы можете сделать это с помощью MERGE. См. Cypher RefCard

@Repository 
public interface ARepository extends GraphRepository<A> { 

    @Query("MERGE (a:A {id:aId}})-[:HAS_ADVERTISER]-(u:User {id:{userId}})" + 
      "RETURN a") 
    public A createAndGetAd(@Param("aId") String aId, 
          @Param("userId") String userId) 
    }