我有自引用表 nh_node 引用它自己。
我尝试遵循从父母JPA获取所有孩子和子孩子解决方案。
代码:
@javax.persistence.Entity
@lombok.Data
@lombok.EqualsAndHashCode(callSuper = false)
@javax.persistence.Table(name ="nh_node")
public class NodeEntity extends BaseEntity implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private static final String NODE_GENERATOR = "node_generator";
@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = NODE_GENERATOR)
@javax.persistence.SequenceGenerator(name =NODE_GENERATOR, sequenceName = "node_id_sequence", allocationSize = 1)
@javax.persistence.Column(name ="node_id")
private java.lang.Long nodeId;
@javax.persistence.Column(name ="node_name",length =32)
private java.lang.String nodeName;
@javax.persistence.OneToMany( cascade = CascadeType.ALL)
@javax.persistence.JoinColumn(name ="node_id")
private java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeUserMappingEntity> nodeUsers;
@javax.persistence.ManyToOne( cascade = CascadeType.ALL)
@javax.persistence.JoinColumn(name ="node_category_id")
private com.mt.retail.nodehierarchyservice.entity.NodeCategoryEntity nodeCategory;
@javax.persistence.OneToMany(mappedBy = "parentNode", cascade = CascadeType.ALL)
private java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeEntity> childNodes;
@javax.persistence.ManyToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@javax.persistence.JoinColumn(name ="parent_node_id")
private com.mt.retail.nodehierarchyservice.entity.NodeEntity parentNode;
@javax.persistence.OneToMany( cascade = CascadeType.ALL)
@javax.persistence.JoinColumn(name ="node_id")
private java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeNotificationDetailEntity> nodeNotificationDetails;
@javax.persistence.Column(name ="tenant_id",nullable = true,length =10)
private java.lang.Long tenantId;
public java.lang.Long getNodeId() {
return nodeId;
}
public java.lang.Long setNodeId(java.lang.Long nodeId) {
return this.nodeId = nodeId;
}
public java.lang.String getNodeName() {
return nodeName;
}
public java.lang.String setNodeName(java.lang.String nodeName) {
return this.nodeName = nodeName;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeUserMappingEntity> getNodeUsers() {
return nodeUsers;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeUserMappingEntity> setNodeUsers(java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeUserMappingEntity> nodeUsers) {
return this.nodeUsers = nodeUsers;
}
public com.mt.retail.nodehierarchyservice.entity.NodeCategoryEntity getNodeCategory() {
return nodeCategory;
}
public com.mt.retail.nodehierarchyservice.entity.NodeCategoryEntity setNodeCategory(com.mt.retail.nodehierarchyservice.entity.NodeCategoryEntity nodeCategory) {
return this.nodeCategory = nodeCategory;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeEntity> getChildNodes() {
return childNodes;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeEntity> setChildNodes(java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeEntity> childNodes) {
return this.childNodes = childNodes;
}
public com.mt.retail.nodehierarchyservice.entity.NodeEntity getParentNode() {
return parentNode;
}
public com.mt.retail.nodehierarchyservice.entity.NodeEntity setParentNode(com.mt.retail.nodehierarchyservice.entity.NodeEntity parentNode) {
return this.parentNode = parentNode;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeNotificationDetailEntity> getNodeNotificationDetails() {
return nodeNotificationDetails;
}
public java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeNotificationDetailEntity> setNodeNotificationDetails(java.util.List<com.mt.retail.nodehierarchyservice.entity.NodeNotificationDetailEntity> nodeNotificationDetails) {
return this.nodeNotificationDetails = nodeNotificationDetails;
}
public java.lang.Long getTenantId() {
return tenantId;
}
public java.lang.Long setTenantId(java.lang.Long tenantId) {
return this.tenantId = tenantId;
}
//returns all children to any level
public List<NodeEntity> getAllChildren(){
return getAllChildren(this);
}
//recursive function to walk the tree
private List<NodeEntity> getAllChildren(NodeEntity parent){
List<NodeEntity> allChildren = new ArrayList<>();
for(NodeEntity child : childNodes){
allChildren.add(child);
allChildren.addAll(getAllChildren(child));
}
服务中:
@Override
public NodeDTO getNodeByNodeId(Long nodeId) {
Optional<NodeEntity> nodeEntity = nodehierarchyRepository.findById(nodeId);
System.out.println(nodeEntity.get().getAllChildren());
return null;
}
当我尝试检索节点子节点时,我收到“处理程序调度失败;嵌套异常是 java.lang.StackOverflowError”异常。
我能知道我的代码哪里出错了吗?