Neo4j-OGM/Spring-Data-Neo4j:将 属性 类型从 Integer 迁移到 String
Neo4j-OGM/Spring-Data-Neo4j: Migrate property type from Integer to String
在大型数据库中,我必须将一种节点类型的 属性 的数据类型从 Integer 更改为 String(即 42 到“42”),以便也支持非数字 ID。
我已经设法完成 本身,并且 属性 现在在数据库中具有预期的类型。
我已经使用 Neo4j-Browsers 功能验证了这一点,将查询结果显示为 JSON:
"graph": {
"nodes": [
{
"id": "4190",
"labels": [
"MyEntity"
],
"properties": {
"id": "225"
}
}
}
请注意 "id" 属性 与节点自己的(数字)id 不同。
在对应的Spring-Data-Neo4j 4app中,我也将对应的属性的类型由Integer调整为String。我希望这就足够了,但是在第一次加载受影响的实体时,我现在收到:
org.neo4j.ogm.exception.MappingException: Error mapping GraphModel to instance of com.example.MyEntity
[...]
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Can not set java.lang.String field de.moneysoft.core.model.base.UriEntity.transfermarktId to java.lang.Integer
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:43)
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:68)
at org.neo4j.ogm.context.GraphEntityMapper.writeProperty(GraphEntityMapper.java:232)
at org.neo4j.ogm.context.GraphEntityMapper.setProperties(GraphEntityMapper.java:184)
at org.neo4j.ogm.context.GraphEntityMapper.mapNodes(GraphEntityMapper.java:151)
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:135)
... 122 common frames omitted
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.example.MyEntity.id to java.lang.Integer
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:41)
... 127 common frames omitted
我不知道 Neo4j-OGM 存储任何类型的模型或数据类型(至少我没有在图中看到它)。为什么它仍然认为我的 属性 是一个整数?
编辑:
迁移后的节点实体:
@NodeEntity
public class MyEntity
{
@Property
protected String name;
@Property
private String id;
}
我不知道任何其他相关代码。
好吧,如果您看到的错误看起来难以置信,那可能就是这样。
一夜好眠后,我意识到我连接到了错误的数据库实例:不是我在浏览器中查看的已迁移数据库实例,而是另一个包含未迁移状态的数据库实例。
连接到正确的实例后,一切正常!
在大型数据库中,我必须将一种节点类型的 属性 的数据类型从 Integer 更改为 String(即 42 到“42”),以便也支持非数字 ID。
我已经设法完成
"graph": {
"nodes": [
{
"id": "4190",
"labels": [
"MyEntity"
],
"properties": {
"id": "225"
}
}
}
请注意 "id" 属性 与节点自己的(数字)id 不同。
在对应的Spring-Data-Neo4j 4app中,我也将对应的属性的类型由Integer调整为String。我希望这就足够了,但是在第一次加载受影响的实体时,我现在收到:
org.neo4j.ogm.exception.MappingException: Error mapping GraphModel to instance of com.example.MyEntity
[...]
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Can not set java.lang.String field de.moneysoft.core.model.base.UriEntity.transfermarktId to java.lang.Integer
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:43)
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:68)
at org.neo4j.ogm.context.GraphEntityMapper.writeProperty(GraphEntityMapper.java:232)
at org.neo4j.ogm.context.GraphEntityMapper.setProperties(GraphEntityMapper.java:184)
at org.neo4j.ogm.context.GraphEntityMapper.mapNodes(GraphEntityMapper.java:151)
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:135)
... 122 common frames omitted
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.example.MyEntity.id to java.lang.Integer
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.neo4j.ogm.entity.io.FieldWriter.write(FieldWriter.java:41)
... 127 common frames omitted
我不知道 Neo4j-OGM 存储任何类型的模型或数据类型(至少我没有在图中看到它)。为什么它仍然认为我的 属性 是一个整数?
编辑: 迁移后的节点实体:
@NodeEntity
public class MyEntity
{
@Property
protected String name;
@Property
private String id;
}
我不知道任何其他相关代码。
好吧,如果您看到的错误看起来难以置信,那可能就是这样。 一夜好眠后,我意识到我连接到了错误的数据库实例:不是我在浏览器中查看的已迁移数据库实例,而是另一个包含未迁移状态的数据库实例。
连接到正确的实例后,一切正常!