У меня проблема с работой с внешними ключами в Spring.Возвращенный объект не имеет правильного значения на моем корабле отношений.
orderTypeId
из Order
отсутствует в ответе CREATED, но последующий запрос GET дает ожидаемый результат.
Ожидаемое поведение
Вот небольшой пример того, чего я хочу достичь.
Запрос
POST /api/orders
{
"orderType": "orderTypes/1",
}
или GET /api/orders/2
Выход
{
"id": 2,
"orderTypeId": 1, // either this
"orderType": "orderTypes/1" // or this
"_links": {
"self": {
"href": "http://localhost:8090/api/orders/2"
},
"order": {
"href": "http://localhost:8090/api/orders/2"
},
"orderType": {
"href": "http://localhost:8090/api/orders/2/orderType"
},
"orderType": {
"href": "orderTypes/1" // this could even be acceptable
}
}
}
Мой код
Entites
@Data
@Entity
public class Order {
@Id
@GeneratedValue
private Long id;
@Column(name = "order_type_id", nullable = false, insertable = false, updatable = false)
private Long orderTypeId;
@NotNull
@ManyToOne
@JoinColumn(name = "order_type_id")
private OrderType orderType;
}
@Data
@Entity
public class OrderType {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@JsonIgnore
@OneToMany(mappedBy = "orderType")
private List<Order> orders;
}
Контроллер
@RepositoryRestResource
public interface OrderRepository extends JpaRepository<Order, Long> {}
POST
POST /api/orders
{
"orderType": "orderTypes/1",
}
Выход
{
"id": 2,
"orderTypeId": null,
"_links": {
"self": {
"href": "http://localhost:8090/api/orders/2"
},
"order": {
"href": "http://localhost:8090/api/orders/2"
},
"orderType": {
"href": "http://localhost:8090/api/orders/2/orderType"
}
}
}
Однако, если я сделаю GET /orders/2
orderTypeIdправильно установлен.
Что я делаю не так?
ОБНОВЛЕНИЕ
Я пытался что-то еще
@Data
@Entity
public class Order {
@Id
@GeneratedValue
private Long id;
@NotNull
@ManyToOne
@JoinColumn
@JsonManagedReference
@RestResource(exported=false) // ADDED
private OrderType orderType;
}
@Data
@Entity
public class OrderType {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
// removed orders
}
GET /api / orders / 2
{
"id": 2,
"orderTypeId": {
"id": 1,
"name": "foo"
},
"_links": {
"self": {
"href": "http://localhost:8090/api/orders/2"
},
"order": {
"href": "http://localhost:8090/api/orders/2"
}
}
}
Но теперь POST не работает: (
POST /api/orders
{
"orderType": "orderTypes/1",
}
Возвращает 400 неверных запросов ...