Hibernate保存具有空的父ID的子实体

Hibernate不想保存子实体的ID。 我有以下表格:

@Entity @Table(name = "ct_orders") data class Order( @Id @Column(name = "id") @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) val id: Int = 0, @OneToMany(fetch = FetchType.LAZY, cascade = arrayOf(CascadeType.ALL), mappedBy = "order") val route: List<Route>? = null, ... ) @Entity @Table(name = "ct_routes") @JsonIgnoreProperties("id", "order") data class Route( @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Int = 0, @Column val location: Point = GeoHelpers.point(), @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") val order: Order? = null, @Column val title: String = "" ) 

在order_id中用空值保存ct_routes。 有关系有问题吗? 或者,在我的代码中可能有错误?

以下是保存订单实体的代码部分:

 val order = orderRepository.save(Order( ... route = GeoHelpers.placesListToEntities(data.places), ... )) fun placesListToEntities(points: List<PlaceDto>) = points.map { Route( location = Helpers.geometry(it.location.latitude, it.location.longitude), title = it.title ) } 

您正在对双向@OneToMany建模,如您负责在子实体上设置父级值的文档中的示例所示:

 val order = orderRepository.save(Order(...).apply{ ... route = GeoHelpers.placesListToEntities(this, data.places), ... }) fun placesListToEntities(order:Order, points: List<PlaceDto>) = points.map { Route( order = order, location = Helpers.geometry(it.location.latitude, it.location.longitude), title = it.title ) } 

PS。 既然Route是一个实体,你可以稍微改变一下你的模型来实现语言层面的约束,比如:

 class Route internal constructor() { lateinit var order: Order constructor(order: Order) : this() { this.order = order } } 

看到这个问题的更多细节。