在 OGM 中加载 RelationshipEntity 时出现 Stackoverflow 异常
Stackoverflow-Exception while loading RelationshipEntity in OGM
我有以下 类:
@NodeEntity
public class Item{
//...
}
@RelationshipEntity(type = "HAS")
public class HasRelation{
//...
@StartNode
private User user;
@EndNode
private Item item;
}
@NodeEntity
public class User{
//...
@Relationship(type="HAS")
private Set<HasRelation> has;
}
所以现在我有一个 ID 为 1 的用户 Sven
在数据库中有一个项目 Hammer
并且想要加载它。
当我调用 OGM session.load(User.class, 1)
时,我总是得到一个 Whosebug 异常,因为用户持有关系,持有用户,持有关系,等等。
这对我来说是错误的使用 OGM 的方式,我不想将加载的深度限制为 0。
但是 OGM 规范告诉我,没有其他方法,因为 RelationshipEntity 需要 Start- 和 EndNode 并且必须在其中之一中引用。
因此,除了将 Loading-Depth 限制为 0 之外,我看不到防止此异常的方法。
有没有更好的方法?
您将数据公开为 JSON。转换器还需要遍历
'object tree' 这会导致计算器溢出。
解决方案很简单:您在 User
class 中定义传出关系,因此当 jackson 库命中该关系时不需要再次访问该对象。
@RelationshipEntity(type = "LIKES")
public class LikedBook {
@Id
@GeneratedValue
private Long id;
private String how;
@StartNode
@JsonIgnore // <- "do not go back"
private User user;
@EndNode
private Book book;
我有以下 类:
@NodeEntity
public class Item{
//...
}
@RelationshipEntity(type = "HAS")
public class HasRelation{
//...
@StartNode
private User user;
@EndNode
private Item item;
}
@NodeEntity
public class User{
//...
@Relationship(type="HAS")
private Set<HasRelation> has;
}
所以现在我有一个 ID 为 1 的用户 Sven
在数据库中有一个项目 Hammer
并且想要加载它。
当我调用 OGM session.load(User.class, 1)
时,我总是得到一个 Whosebug 异常,因为用户持有关系,持有用户,持有关系,等等。
这对我来说是错误的使用 OGM 的方式,我不想将加载的深度限制为 0。
但是 OGM 规范告诉我,没有其他方法,因为 RelationshipEntity 需要 Start- 和 EndNode 并且必须在其中之一中引用。
因此,除了将 Loading-Depth 限制为 0 之外,我看不到防止此异常的方法。
有没有更好的方法?
您将数据公开为 JSON。转换器还需要遍历 'object tree' 这会导致计算器溢出。
解决方案很简单:您在 User
class 中定义传出关系,因此当 jackson 库命中该关系时不需要再次访问该对象。
@RelationshipEntity(type = "LIKES")
public class LikedBook {
@Id
@GeneratedValue
private Long id;
private String how;
@StartNode
@JsonIgnore // <- "do not go back"
private User user;
@EndNode
private Book book;