我有一个问题。当我尝试获取 Employee
的 JSON
对象时,我看不到一个非常重要的字段(company
)。例如,我需要获取这样的对象:
{
"name": "Jack",
"company": {
"name": "Microsoft",
"id": 4
},
"id": 1
}
但是我得到的是一个没有公司的对象(错误!):
{
"name": "Bill",
"id": 2
}
同时我想获取Company的json对象:
{
"name": "Microsoft",
"employees": [
{
"name": "Jack",
"id": 1
},
{
"name": "Frank",
"id": 3
}
],
"id": 4
}
公司对象没问题。当我收到它时,它看起来很完美。问题出在 Employee 对象中。
这是我的实体类
@Entity
@Table(name = "company")
public class Company implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@OneToMany(mappedBy = "company")
@Cascade(value = CascadeType.ALL)
@JsonManagedReference
private Collection<Employee> employees;
还有我的 Employee 类
@Entity
@Table(name = "employee")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
@Column
String name;
@ManyToOne()
@Cascade(value = org.hibernate.annotations.CascadeType.ALL)
@JoinColumn(name = "company_id", referencedColumnName = "id")
@JsonBackReference
private Company company;
我认为问题出在 @Json[SomeCondition] 注释中。有人可以帮我修复代码吗?我需要像这样使用 companym 获取 Employee 对象:
{
"name": "Jack",
"company": {
"name": "Microsoft",
"id": 4
},
"id": 1
}
更新:
这是我的 Controller :
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
EmployeeService employeeService;
@RequestMapping(method = {RequestMethod.GET}, produces = "application/json")
public @ResponseBody Collection<Employee> getEmployees() {
return employeeService.getEmployees();
}
@RequestMapping(value = "/{id}", method = {RequestMethod.GET, RequestMethod.PUT},
produces = "application/json")
public @ResponseBody Employee getEmployee(@PathVariable("id") Integer id) {
return employeeService.getEmployee(id);
}
@RequestMapping(method = RequestMethod.POST, consumes = "application/json",
headers = "content-type=application/json")
public String addEmployee(@RequestBody Employee employee) {
employeeService.addEmployee(employee);
return "redirect:/employee";
}
@RequestMapping(method = RequestMethod.PUT, consumes = "application/json",
headers = "content-type=application/json")
public String updateEmployee(@RequestBody Employee employee) {
employeeService.updateEmployee(employee);
return "redirect:/employee/" + employee.getId();
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String deleteEmployee(@PathVariable("id") Integer id) {
employeeService.deleteEmployee(id);
return "redirect:/employee";
}
}
最佳答案
这是hibernate中EAGER和LAZY fetch的问题。小心这两个概念。在实现之前阅读它。 在公司类中定义关系时添加 fetch=FetchType.EAGER。
@OneToMany(mappedBy = "company",fetch=FetchType.EAGER)
@Cascade(value = CascadeType.ALL)
@JsonManagedReference
private Collection<Employee> employees;
关于java - 如何获取 Hibernate 对象并将其映射到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23071038/