2016-03-08 3 views
0

Я пытаюсь сохранить следующий класс в базе данных Neo4J, используя spring-data-neo4j version 4.0.0.RELEASE. Это класс с именем «GroupCategory» с некоторыми полями, такими как name, ownerId и т. Д. Он перезаписал методы equals и hashcode, как это предусмотрено средой eclipse.Метод переопределения hashCode() не позволяет сохранять свойства класса в Neo4J

@NodeEntity(label="GroupCategory") 
public class GroupCategory implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @GraphId 
    private Long id; 
    @Property private String uuid; 
    @Property private String name; 
    @Property private String creatorUuid; 
    @Property private String ownerUuid; 
    @Property private String profile; 
    @Property private String status; 

    @Relationship(type = GroupRelationshipNames.BELONGS_TO, direction = Relationship.INCOMING) 
    private List<GroupCategoryRelation> groupCategoryRelations = new ArrayList<GroupCategoryRelation>(); 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getUuid() { 
     return uuid; 
    } 

    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCreatorUuid() { 
     return creatorUuid; 
    } 

    public void setCreatorUuid(String creatorUuid) { 
     this.creatorUuid = creatorUuid; 
    } 

    public String getOwnerUuid() { 
     return ownerUuid; 
    } 

    public void setOwnerUuid(String ownerUuid) { 
     this.ownerUuid = ownerUuid; 
    } 

    public String getProfile() { 
     return profile; 
    } 

    public void setProfile(String profile) { 
     this.profile = profile; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public List<GroupCategoryRelation> getGroupCategoryRelations() { 
     return groupCategoryRelations; 
    } 

    public void setGroupCategoryRelations(
      List<GroupCategoryRelation> groupCategoryRelations) { 
     this.groupCategoryRelations = groupCategoryRelations; 
    } 

    @Override 
    public String toString() { 
     return "GroupCategory [id=" + id + ", uuid=" + uuid + ", name=" + name 
       + ", creatorUuid=" + creatorUuid + ", ownerUuid=" + ownerUuid 
       + ", profile=" + profile + ", status=" + status 
       + ", groupCategoryRelations=" + groupCategoryRelations + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((creatorUuid == null) ? 0 : creatorUuid.hashCode()); 
     result = prime 
       * result 
       + ((groupCategoryRelations == null) ? 0 
         : groupCategoryRelations.hashCode()); 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     result = prime * result 
       + ((ownerUuid == null) ? 0 : ownerUuid.hashCode()); 
     result = prime * result + ((profile == null) ? 0 : profile.hashCode()); 
     result = prime * result + ((status == null) ? 0 : status.hashCode()); 
     result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     GroupCategory other = (GroupCategory) obj; 
     if (creatorUuid == null) { 
      if (other.creatorUuid != null) 
       return false; 
     } else if (!creatorUuid.equals(other.creatorUuid)) 
      return false; 
     if (groupCategoryRelations == null) { 
      if (other.groupCategoryRelations != null) 
       return false; 
     } else if (!groupCategoryRelations.equals(other.groupCategoryRelations)) 
      return false; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     if (ownerUuid == null) { 
      if (other.ownerUuid != null) 
       return false; 
     } else if (!ownerUuid.equals(other.ownerUuid)) 
      return false; 
     if (profile == null) { 
      if (other.profile != null) 
       return false; 
     } else if (!profile.equals(other.profile)) 
      return false; 
     if (status == null) { 
      if (other.status != null) 
       return false; 
     } else if (!status.equals(other.status)) 
      return false; 
     if (uuid == null) { 
      if (other.uuid != null) 
       return false; 
     } else if (!uuid.equals(other.uuid)) 
      return false; 
     return true; 
    } 



} 

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

@Test 
public void changeCategoryName(){ 
    String ownerUuid = "PERSON_0_UUID"; 
    String name = "GROUP_0"; 
    String name1 = "GROUP_1"; 

    GroupCategory groupCategory = new GroupCategory(); 
    groupCategory.setName(name); 
    groupCategory.setOwnerUuid(ownerUuid); 
    groupCategory.setProfile(Profile.PRIVATE.name()); 
    GroupCategory savedGroupCategory = groupCategoryService.create(groupCategory); 

    System.out.println("----------- "+groupCategoryService.findByUuid(savedGroupCategory.getUuid())); 
    Assert.assertTrue(groupCategoryService.findByUuid(savedGroupCategory.getUuid()).getName().equals(name)); 

    savedGroupCategory.setName(name1); 
    savedGroupCategory = groupCategoryService.save(savedGroupCategory); 
    System.out.println("----------- "+groupCategoryService.findByUuid(savedGroupCategory.getUuid())); 
    Assert.assertTrue(groupCategoryService.findByUuid(savedGroupCategory.getUuid()).getName().equals(name1)); 


    savedGroupCategory.setName(name); 
    groupCategoryService.save(savedGroupCategory); 
    System.out.println("----------- "+groupCategoryService.findByUuid(savedGroupCategory.getUuid())); 
    Assert.assertTrue(groupCategoryService.findByUuid(savedGroupCategory.getUuid()).getName().equals(name)); 


} 

ответ из трех «printlns» приведены ниже

----------- GroupCategory [id=889, uuid=9f891006-3d89-4665-ae2f-4946d13b74ac, name=GROUP_0, creatorUuid=null, ownerUuid=PERSON_0_UUID, profile=PRIVATE, status=ACTIVE, groupCategoryRelations=[]] 
----------- GroupCategory [id=889, uuid=9f891006-3d89-4665-ae2f-4946d13b74ac, name=GROUP_1, creatorUuid=null, ownerUuid=PERSON_0_UUID, profile=PRIVATE, status=ACTIVE, groupCategoryRelations=[]] 
----------- GroupCategory [id=889, uuid=9f891006-3d89-4665-ae2f-4946d13b74ac, name=GROUP_1, creatorUuid=null, ownerUuid=PERSON_0_UUID, profile=PRIVATE, status=ACTIVE, groupCategoryRelations=[]] 

Если поле «имя» ищется на это canbe заметил, что поле сохраняется и обновлено для первых двух случаев. Но в третьем случае, при возврате к предыдущему значению «Group_0», поле имени не сохраняется. Последнее утверждение в тестовом случае терпит неудачу, потому что сохраненный объект сохраняет предыдущее значение «Group1». Эта идея даст три печатных издания.

Так получилось, что переход значения поля имени из Group_0 в Group_1 работает, но один из Group_1 обратно в Group_0 не работает. Если значение изменяется на любое другое значение, отличное от Group_0, из Group_1, значение обновляется. То есть сохранение не работает, если значение изменяется альтернативно.

Если я удаляю метод hashCode() из класса GroupCategory, то все, кажется, работает хорошо. В частности только комментирование хэш-код для поля имени делает трюк, как

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((creatorUuid == null) ? 0 : creatorUuid.hashCode()); 
    result = prime 
      * result 
      + ((groupCategoryRelations == null) ? 0 
        : groupCategoryRelations.hashCode()); 
    result = prime * result + ((id == null) ? 0 : id.hashCode()); 
    //result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    result = prime * result 
      + ((ownerUuid == null) ? 0 : ownerUuid.hashCode()); 
    result = prime * result + ((profile == null) ? 0 : profile.hashCode()); 
    result = prime * result + ((status == null) ? 0 : status.hashCode()); 
    result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); 
    return result; 
} 

Но одни и те же проблемы persits для других полей, а также. На данный момент кажется, что, обновляя значения альтернативно (значение1 до значения2, а затем значение value1), похоже, не работает, если hashCode() переопределяется в классе

ответ

2

Эта ошибка исправлена, пожалуйста, используйте версию 1.1. 6 of neo4j-ogm.

Update

SDN зависит от библиотеки Neo4j ОГМ. SDN 4.0 был выпущен с более старой версией Neo4j-OGM, которая не содержит этого исправления ошибок. Вы можете добавить эту зависимость, чтобы переопределить версию Neo4j OGM-

<dependency> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-ogm</artifactId> 
     <version>1.1.6</version> 
    </dependency> 
+0

Я использую следующую зависимость в pom.xml. { spring-data-neo4j 4.0.0.RELEASE} Нужно ли мне переключаться на neo4j-ogm? Будет замечательно, если вы сможете прокомментировать, какой из них использовать (spring-data-neo4j или neo4j-ogm) и почему. – Soumya

+0

обновил мой ответ – Luanne

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