我有一个结构,(简化)看起来像这样:
@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"
。
答案 0 :(得分:0)
我发现你的课程有两个问题,并且在OGM中有用:
您使用标签Entity
两次。如果是OGM,这将产生问题
尝试从Neo4j加载数据。找不到正确的类型来分配值。可能的解决方法:
明确将标签设置为此类的StubEntity
之类的另一个标签。
如果因为uuid对两个类的唯一性而无法做到这一点,您甚至可能不需要StubEntity
,但也可以将FullEntity
类用于关系目标。保存数据后,Neo4j没有区别。
如果两个类的差异都超过上面显示的示例代码,则可以使用Entity
标签创建一个抽象类,并提供特殊类型标签(仅通过@NodeEntity
注释隐式或者在实现类上使用您已经使用的label属性显式化。你可以在抽象类中使用uuid约束。
两次使用@Id
注释。如果您只需要索引中的字段和唯一约束(如果我已理解您的注释正确),则无需在uuid字段上声明额外的@Id
。