java - 为什么 FetchType.Lazy 不起作用?

标签 java spring hibernate jpa

我有模型类别。它可能具有父类别和子类别列表。我写这个问题是因为找不到实体与自己相关的案例。

我尝试像这样实现它:

@Entity
public class Category {
@Id
private String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Category parent;

@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Category> subcategories = Lists.newArrayList();
}

我保存的实体如下:

Category parent = new Category();
parent.setName("parent");

Category child1 = new Category();
child1.setName("child1");
child1.setParent(parent);

parent.getSubcategories().add(child1);

categoryPersistence.save(parent);

我希望看到类似的内容:

parent {
id
parent: null
childs {
   child {
      id
      parent: ...lazy loading exception...
      childs: null
   }
}
}

但是在归档父级的子模型中,我有递归循环。 如何预防?

是的,我也使用了@JsonIgnore。但我不确定这是不是一个好的做法。 但是,如果我有一个案例,当我需要一个类别时,我确实需要将其与父级一起发送到用户界面。 @JsonIgnore 可以产生这个吗?

最佳答案

@damienMiheev 我也遇到了同样的问题,但是调试问题 1 或半小时我发现

即使您的父字段延迟加载,当您的字段的自动 JSON 生成 getter 被调用时,它正在获取值,这会创建一些循环执行。 因为它先获取父级,然后获取子级,然后再次为子级集合中的每个子级获取父级,并继续此过程直到 StackOverflow。

这是您问题的解决方案

您应该从 json 生成中排除“父级”,例如您可以将该字段标记为@JsonIgnore。 您也不应该在 hashCode()、equals() 和 toString() 方法中包含父级和子级。

关于java - 为什么 FetchType.Lazy 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618101/

相关文章:

java - 连接列留空

java - Spring Async - 无法获取异步bean

spring - 如何使用 Spring Data JPA 连接两个表

java - 如何为两个不同的 session 配置两个hibernate transactionManager

java - Spring hibernate 异常

java - 如何在spring boot中重新加载外部属性文件而不需要重启tomcat?

java - 有没有办法使用正则表达式将字符串中的每个数字相乘?

java - 配置单元查询无法通过 jdbc 生成结果集

java - 从随机访问文件中读取对象

java - 尝试在 Tomcat 中将 LDAP 配置为 JNDI 资源