更新节点而不首先使用 Neo4j OGM 检索它



我有一个结构,它(简化)看起来像这样:

@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".

我看到您的类和在 OGM 中的使用存在两个问题:

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

    • 将标签显式设置为另一个标签,例如此类的标签StubEntity

    • 如果由于 uuid 在两个类上的唯一性而无法做到这一点,则您甚至可能不需要StubEntity而是将FullEntity类也用于关系目标。保存数据后,Neo4j 不会有任何区别。

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

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

相关内容

  • 没有找到相关文章

最新更新