1

我有一个结构,它(简化)如下所示:

@NodeEntity(label = "Entity")
class FullEntity {

    @Id @GeneratedValue
    var _id: Long? = null

    @Id @Index(unique = true)
    lateinit var uuid: String

    lateinit var someMoreData: String // this data is sometimes lost

    @Relationship(type = "TARGETS", direction = Relationship.OUTGOING)
    var target: StubEntity? = null
}

@NodeEntity(label = "Entity")
class StubEntity {

    @Id @GeneratedValue
    var _id: Long? = null

    @Id @Index(unique = true)
    lateinit var uuid: String
}

@RepositoryRestResource
interface EntityRepository : Neo4jRepository<FullEntity, Long>

现在,当我独立保存两个相关FullEntity对象时,如果我以一种方式进行操作,则一切正常:

entityRepository.save(FullEntity().apply {
    uuid = "uuid1"
    someMoreData = "SomeMoreData1"
    target = StubEntity().apply {
        uuid = "uuid2"
    }
})
// some time later ...
entityRepository.save(FullEntity().apply {
    uuid = "uuid2"
    someMoreData = "SomeMoreData2"
})

但如果我像这样颠倒顺序:

entityRepository.save(FullEntity().apply {
    uuid = "uuid2"
    someMoreData = "SomeMoreData2"
})
// some time later ...
entityRepository.save(FullEntity().apply {
    uuid = "uuid1"
    someMoreData = "SomeMoreData1"
    target = StubEntity().apply {
        uuid = "uuid2"
    }
})

它删除"SomeMoreData2"

4

1 回答 1

0

我发现您的课程和在 OGM 中的使用存在两个问题:

  1. 您使用该标签Entity两次。如果 OGM 尝试从 Neo4j 加载数据,这将产生问题。它找不到正确的类型来分配值。可能的解决方法:

    • 将标签显式设置为另一个类似StubEntity此类的标签。

    • 如果这是不可能的,因为 uuid 在两个类上的唯一性,您甚至可能不需要StubEntityFullEntity也将类用于关系目标。保存数据后在 Neo4j 中不会有任何区别。

    • 如果这两个类比上面的示例代码有更多的差异,您可以创建一个带有标签的抽象类,并在实现类上Entity提供特殊类型标签(通过仅@NodeEntity使用您已经使用的标签属性进行注释来隐式或显式)。比你可以在抽象类中使用 uuid 约束。

  2. 使用@Id注释两次。@Id如果您只需要索引中的字段和唯一约束(如果我理解您的评论正确),则无需在 uuid 字段上声明额外的内容。

于 2018-02-08T07:30:38.457 回答