Java 如何从单个数据库表为json格式的父子响应设计hibernate实体

Java 如何从单个数据库表为json格式的父子响应设计hibernate实体,java,json,spring,hibernate,spring-rest,Java,Json,Spring,Hibernate,Spring Rest,我有一个数据库表 +-------------+----------------------+--------+ | category_id | name |parent_id | +-------------+----------------------+--------+ | 1 | ELECTRONICS | NULL | | 2 | TELEVISIONS | 1

我有一个数据库表

+-------------+----------------------+--------+
| category_id | name                 |parent_id  |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
+-------------+----------------------+--------+
我用这种方式设计了hibernate实体,但我无法获得预期的输出,这在下面的json格式中提到:

@Entity
@Table(name = "category")
public class Category {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "category_id")
  private short categoryId;
  @Column(name = "name")
  private String name;

  @Column(name = "parent_id")
  private Integer parentId;

  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @JoinColumn(name = "parent_id")
  private Set<Category> child;

  public short getCategoryId() {
        return categoryId;
  }

  public void setCategoryId(short categoryId) {
        this.categoryId = categoryId;
  }

  public String getName() {
        return name;
  }

  public void setName(String name) {
        this.name = name;
  }

  public Integer getParentId() {
        return parentId;
  }

  public void setParentId(Integer parentId) {
        this.parentId = parentId;
  }

  public Set<Category> getChild() {
        return child;
  }

  public void setChild(Set<Category> child) {
        this.child = child;
  }
  }
当我尝试使用此代码列出类别列表并发送响应时,我得到以下异常:

@RequestMapping(value = "/fetchCategory", method = RequestMethod.GET)
  public List<Category> fetchCategory() {
    List<Category> categories = null;
        try {
            categories = masterConfigurationService.fetchCategory();
        } catch (ServiceException e) {
              LOGGER.error(e.getMessage(), e);
        }
        return categories;
  }
更新: -已更新实体-已从实体中删除父映射


现在,如果父树与两个子树关联,我将得到两次父树。

您的映射很好。问题末尾的两个问题非常模糊。@JBNizet我更新了问题,每当我试图获取类别列表时,我都会遇到上述异常。任何惰性关联都会出现此异常:如果在会话关闭后尝试浏览未加载的惰性关联,Hibernate无法初始化惰性关联,因此引发该异常。因为您没有发布引发该异常的代码,而不是完整的堆栈跟踪,所以仍然很难提供帮助。@JBNizet我更新了生成异常的代码。仍然没有完整的堆栈跟踪。我假设这是由返回类别的JSON编组引起的。有几种解决方案:使用DTO(这将迫使您初始化惰性集合,并在服务层返回的对象和持久性实体之间实施明确的分离),使用OpenEntityManagerView过滤器/拦截器,在树中导航,从而在返回类别之前初始化所有关联。您的映射很好。问题末尾的两个问题非常模糊。@JBNizet我更新了问题,每当我试图获取类别列表时,我都会遇到上述异常。任何惰性关联都会出现此异常:如果在会话关闭后尝试浏览未加载的惰性关联,Hibernate无法初始化惰性关联,因此引发该异常。因为您没有发布引发该异常的代码,而不是完整的堆栈跟踪,所以仍然很难提供帮助。@JBNizet我更新了生成异常的代码。仍然没有完整的堆栈跟踪。我假设这是由返回类别的JSON编组引起的。有几种解决方案:使用DTO(这将迫使您初始化惰性集合,并在服务层返回的对象和持久性实体之间实施明确的分离),使用OpenEntityManagerView过滤器/拦截器,在树中导航,从而在返回类别之前初始化所有关联。
@RequestMapping(value = "/fetchCategory", method = RequestMethod.GET)
  public List<Category> fetchCategory() {
    List<Category> categories = null;
        try {
            categories = masterConfigurationService.fetchCategory();
        } catch (ServiceException e) {
              LOGGER.error(e.getMessage(), e);
        }
        return categories;
  }
session.createCriteria(Category.class).list();