java - 如何获取 Hibernate 对象并将其映射到 JSON

标签 java json spring hibernate jackson

我有一个问题。当我尝试获取 EmployeeJSON 对象时,我看不到一个非常重要的字段(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/

相关文章:

java - Primefaces 一页中的两个数据表导致分页和过滤问题

javascript - 从 javascript 获取外部 JSON 文件 - 本地网站

java - 如何在Spring上有条件地创建@Controller和@Service实例

java - JTable -> TableModeListener

java - 如何使用 UriInfo 测试 JERSEY Controller 方法

java - 在对象上同步似乎没有同步

json - 如何合并由逗号分隔的过滤器生成的 jq JSON 对象

javascript - 将包含数组数组的字符串转换为 JSON 对象

java - 如何将 @SpringBootTest(webEnvironment) 与 @DataJpaTest 一起使用?

java - 如何排除除@ComponentScan 下的一个类之外的所有@Component 类?