Neo4j Spring Data NodeEntity использует String как @id

Я пытаюсь использовать java.lang.String в качестве @Id для NodeEntity.

 @NodeEntity(label = "MachineType")
 public class MachineType {
     @Id private String id;
     ....

Это должно быть возможно в соответствии с документом neo4j spring data:

While an id is still required on all entities, the behavior has been
simplified by introducing the new @Id annotation. It replaces both
@GraphId and the primary attribute and can be placed on any attribute 
with a simple type.

Когда я пытаюсь вставить, я получаю:

{
    "cause": null,
    "message": "Id must be assignable to Serializable!: null"
}

Что странно, потому что String реализует Serializable. Кто-нибудь знает, где искать дальше?


person Jonas Droste    schedule 21.03.2018    source источник


Ответы (1)


Я думаю, что в качестве идентификатора нельзя использовать что-либо другое. Имейте в виду, что этот длинный номер будет повторно использован, если вы удалите узел.

Я использую плагин UUID для создания истинных уникальных ключей, а когда я использую spring-data-rest, я использую BackendIdConverter, чтобы изменить идентификатор на uuid для ресурсов, которые я предоставляю.

Пример: Модель:

@NodeEntity
@Data
public class Target {

    @Id @GeneratedValue Long id;   // <----Neo4j id 

    private String uuid;           // <----My Key

    @Version Long version;
    private List<String> labels = new ArrayList<>();
    @Relationship(type = "HAS_MEDIA", direction=Relationship.OUTGOING)
    private List<Gallery> media = new ArrayList<>();

}

Преобразуйте идентификатор ресурса в мой ключ:

@Component 
public class MovieIdConverter implements BackendIdConverter {
    @Autowired MovieRepo movieRepository;

    @Override
    public Serializable fromRequestId(String id, Class<?> entityType) {
        Movie movie = movieRepository.findByUuid(id);
        return  (Serializable) movie.getId();
    }

    @Override
    public String toRequestId(Serializable serializable, Class<?> aClass) {
        Long id = (Long) serializable;
        Optional<Movie> movie = movieRepository.findById(id);
        if (movie.isPresent()) return movie.get().getUuid();
        return null;
}

    @Override
    public boolean supports(Class<?> aClass) {
        return Movie.class.equals(aClass);
    }
}
person Shock    schedule 23.03.2018