简体   繁体   English

无法获取 spring 启动 hibernate rest Z8A5DA52ED126447D359E70C05721 一个到多个关系

[英]Cant get spring boot hibernate rest api to return a one to many relationship

I have modelled a car park with building and floor models.我用建筑和地板模型为停车场建模。 There is a one to many relationship between building and floor.建筑物和楼层之间存在一对多的关系。 I have built a rest controllers to retrieve the data.我已经构建了一个 rest 控制器来检索数据。 I am attempting to retrive the data via a simple get request to api/v1/parkingbuildings/1/ .我正在尝试通过对api/v1/parkingbuildings/1/的简单获取请求来检索数据。 The issue is that when retrieving a building i do not see a list of floors as per my relation mapping.问题是,在检索建筑物时,根据我的关系映射,我没有看到楼层列表。 Any insight into any mistakes i may be making would be appreciated.对我可能犯的任何错误的任何见解将不胜感激。 Below is the json that gets returned;下面是返回的 json;

{"building_id":1,"building_name":"Labadiestad","postcode":"SA78BQ","max_floors":14,"owner_name":"Schaefer, Gutmann and Braun"}

I am expecting to see a collection of floors in the payload and i cannot fathom why, ive written other similar simpler solutions that do the same without issue, ive compared my prior solutions and see little difference that matters in my approach.我期待在有效载荷中看到一系列楼层,但我无法理解为什么,我编写了其他类似的更简单的解决方案,它们可以毫无问题地做同样的事情,我比较了我以前的解决方案,发现我的方法几乎没有什么区别。

Here is my building model这是我的建筑 model

package com.admiral.reslink.models;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity(name = "parking_buildings")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class ParkingBuilding {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long building_id;

    private String building_name;
    private String postcode;
    private int max_floors;
    private String owner_name;

    // ToDo sort the relationships

    @OneToMany(mappedBy = "parkingBuilding")
    @JsonIgnore
    private List<ParkingFloor> parkingFloors;

    public ParkingBuilding() {
    }

    public long getBuilding_id() {
        return building_id;
    }

    public void setBuilding_id(long building_id) {
        this.building_id = building_id;
    }

    public String getBuilding_name() {
        return building_name;
    }

    public void setBuilding_name(String building_name) {
        this.building_name = building_name;
    }

    public String getPostcode() {
        return postcode;
    }

    public void setPostcode(String postcode) {
        this.postcode = postcode;
    }

    public int getMax_floors() {
        return max_floors;
    }

    public void setMax_floors(int max_floors) {
        this.max_floors = max_floors;
    }

    public String getOwner_name() {
        return owner_name;
    }

    public void setOwner_name(String owner_name) {
        this.owner_name = owner_name;
    }

    public List<ParkingFloor> getParkingFloors() {
        return parkingFloors;
    }

    public void setParkingFloors(List<ParkingFloor> parkingFloors) {
        this.parkingFloors = parkingFloors;
    }


}

And here is my floor model这是我的地板 model

package com.admiral.reslink.models;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "parking_floors")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

public class ParkingFloor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long floor_id;

    private int floor_number;
    private int max_height_inches;
    private boolean is_covered;
    private boolean is_disabled_access;

    // ToDo sort the relationships
    @ManyToOne
    @JoinColumn(name="building_id", nullable=false)
    private ParkingBuilding parkingBuilding;

    @OneToMany(mappedBy = "parkingFloor")
    @JsonIgnore
    private List<ParkingSpace> parkingSpace;

    public ParkingFloor() {
    }

    public long getFloor_id() {
        return floor_id;
    }

    public void setFloor_id(long floor_id) {
        this.floor_id = floor_id;
    }

    public int getFloor_number() {
        return floor_number;
    }

    public void setFloor_number(int floor_number) {
        this.floor_number = floor_number;
    }

    public int getMax_height_inches() {
        return max_height_inches;
    }

    public void setMax_height_inches(int max_height_inches) {
        this.max_height_inches = max_height_inches;
    }

    public boolean isIs_covered() {
        return is_covered;
    }

    public void setIs_covered(boolean is_covered) {
        this.is_covered = is_covered;
    }

    public boolean isIs_disabled_access() {
        return is_disabled_access;
    }

    public void setIs_disabled_access(boolean is_disabled_access) {
        this.is_disabled_access = is_disabled_access;
    }

    public ParkingBuilding getParkingBuilding() {
        return parkingBuilding;
    }

    public void setParkingBuilding(ParkingBuilding parkingBuilding) {
        this.parkingBuilding = parkingBuilding;
    }

    public List<ParkingSpace> getParkingSpace() {
        return parkingSpace;
    }

    public void setParkingSpace(List<ParkingSpace> parkingSpace) {
        this.parkingSpace = parkingSpace;
    }
}

Here is my building controller这是我的建筑 controller

package com.admiral.reslink.controllers;

import com.admiral.reslink.models.ParkingBuilding;
import com.admiral.reslink.models.ParkingFloor;
import com.admiral.reslink.repositories.ParkingBuildingRepository;
import com.admiral.reslink.repositories.ParkingFloorRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/v1/parkingbuildings")
public class ParkingBuildingController {

    @Autowired
    private ParkingBuildingRepository parkingBuildingRepository;

    @GetMapping
    public List<ParkingBuilding> list() {return parkingBuildingRepository.findAll();}

    @GetMapping
    @RequestMapping("{id}")
    public ParkingBuilding get(@PathVariable Long id) {return  parkingBuildingRepository.getById(id);}

    @PostMapping
    public ParkingBuilding create(@RequestBody final ParkingBuilding parkingBuilding) {
        return parkingBuildingRepository.saveAndFlush(parkingBuilding);
    }

    @RequestMapping(value="{id}", method = RequestMethod.DELETE)
    public void delete(@PathVariable Long id) {
        parkingBuildingRepository.deleteById(id);
    }

    @RequestMapping(value="{id}", method = RequestMethod.PUT)
    public ParkingBuilding update(@PathVariable Long id, @RequestBody ParkingBuilding parkingBuilding) {
        ParkingBuilding existingParkingBuilding = parkingBuildingRepository.getById(id);
        BeanUtils.copyProperties(parkingBuilding, existingParkingBuilding, "building_id");
        return parkingBuildingRepository.saveAndFlush(existingParkingBuilding);
    }
}

Not sure how you are retrieving the floors.不知道你是如何检索地板的。 OneToMany is by default lazy and would not load unless asked. OneToMany 默认是lazy的,除非被询问,否则不会加载。

In your repository, try:在您的存储库中,尝试:

@EntityGraph(attributePaths = "parkingFloors")
ParkingBuilding findById(long id);

The issue was with the @Jsonignore annotations i used.问题出在我使用的 @Jsonignore 注释上。 I had to be more specific with the @Jsonignoreproperty annotation to target which properties i did not want to serialise.我必须更具体地使用 @Jsonignoreproperty 注释来定位我不想序列化的属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM