[英]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.