В моем проекте Spring Boot у меня есть две модели, Building и Location.Я пытаюсь создать новое местоположение, которое принадлежит зданию.
Это мои модели:
Модель местоположения
public class Location implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
private Integer id;
@NonNull
@Getter
@Setter
private String name;
@NonNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "building_id")
@JsonBackReference("building-location")
@ToString.Exclude
@Getter
@Setter
private Building building;
@Getter
@Setter
@Version
@Column(name = "lock_version")
private Integer lockVersion;
}
Модель здания
public class Building implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
private Integer id;
@NonNull
@Size(max = 10)
@Getter
@Setter
private String name;
@OneToMany(mappedBy = "building")
@JsonManagedReference("building-location")
@ToString.Exclude
@Getter
private List<Location> locations = new ArrayList<>();
@Getter
@Setter
@Version
@Column(name = "lock_version")
private Integer lockVersion;
}
Это мой контроллер
@PostMapping(value = "/")
@ResponseBody
public ResponseEntity<Response> createLocation(@Valid @RequestBody Location location) {
Location createdLocation = locationRepository.save(location);
return ResponseEntity.ok(
new Response(ResponseTypeEnum.Success, createdLocation)
);
}
Это тело запроса:
{
"name": "Kitchen",
"building": {
"id": 9
}
}
У меня проблемав том, что JPA не распознает объект building , поэтому при попытке сохранить Location я получаю следующее исключение:
SQLException Column 'building_id' cannot be null. Query is: insert into location (building_id, lock_version, name) values (?, ?, ?), parameters [<null>,0,'Yoga Room']
.
Если я получу здание из БД, используя findById
, а затем установлю свойство здания в объекте Location, оно будет работать, но я не хочу получать объект для сохранения экземпляра Location.Я просто хочу передать внешний ключ и сохранить новый экземпляр.
Могу ли я сделать это с JPA?