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

时间:2018-02-06 11:23:57

标签: neo4j spring-data-neo4j neo4j-ogm spring-data-neo4j-5

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

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

1 个答案:

答案 0 :(得分:0)

我发现你的课程有两个问题,并且在OGM中有用:

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

    • 明确将标签设置为此类的StubEntity之类的另一个标签。

    • 如果因为uuid对两个类的唯一性而无法做到这一点,您甚至可能不需要StubEntity,但也可以将FullEntity类用于关系目标。保存数据后,Neo4j没有区别。

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

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