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();