Spring data neo4j не инициализирует объекты, помеченные @Relationship - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть такая модель местоположения (представляющая эквивалент макета проприетарной модели, опущенный автоматически сгенерированный идентификатор и некоторые другие поля):

@NodeEntity
class Space: Location() {
    @field:Relationship(type = "SUBLOCATED_IN", direction = Relationship.OUTGOING) var subLocation: SubLocation? = null
}
@NodeEntity
abstract class SubLocation: Location() {
    @field:Relationship(type = "LOCATED_IN", direction = Relationship.OUTGOING) var locatedIn: Building? = null
}
@NodeEntity
class Building: Location()
@NodeEntity
abstract class Location {
    var name: String? = null
    var city: String? = null
    var country: String? = null
}

A SubLocation - это аннотация для нескольких различных конкретных классов, таких как Office, Desk, Room и т. Д., Реализация которых не имеет значения. Location используется, например, в Person классе:

@NodeEntity
class Person(
    var name: String,
    @JsonIgnore @Relationship(type = "WORKS_IN", direction = Relationship.OUTGOING)
    var location: Location? = null
)

Когда у меня есть подграф типа Person -> Room (SubLocation) -> Building, все работает как шарм. Я запрашиваю через интерфейс Neo4jRepository, и он выдает объект Person с location (Person -> SubLocation), а также locatedIn (SubLocation -> Building) правильно установлено:

interface PersonRepository: Neo4jRepository<Person, Long> {
    @Depth(5) // exaggerated for test purposes
    fun findAllByName(name: String): List<Person>
}

Проблема проявляется, когда у меня есть такой подграф, как

Person -> Space -> Room (SubLocation) -> Building

и когда я делаю запрос с использованием того же метода хранилища, я получаю только первый уровень отношений, сопоставленных с объектами. Person объект имеет location для Space, но Space имеет subLocation для null.

Я использую новейшие версии: spring-data-neo4j -> 5.1.6.RELEASE и neo4j-ogm-core -> 3.1.8 и neo4j:3.5.3.

TL; DR:

spring-data-neo4j не отображает автоматически @Relationship аннотированное поле с абстрактным типом класса на конкретный объект, назначается null.

1 Ответ

0 голосов
/ 16 апреля 2019

Видимо, это разрешимо на заказ @Query:

interface PersonRepository: Neo4jRepository<Person, Long> {
    @Query(""""
        MATCH g=(:Person)-[*1..3]->(:Building)
        RETURN g
    """")
    fun findAllByName(name: String): List<Person>
}
...