私はKotlinで書かれた簡単なRESTスプリングブートアプリケーションを持っています。Hibernate OneToMany親からの間違ったバインディング
それは、次のスキーマを持っている:Map
hasOneのChannel
とChannel
hasManyのHeaders
私は、コントローラの1つのアクションだけを持っており、このような単一の要求にすべての私のモデルを保存したい:
{
"channel": {
"headers": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
}
をした場合ヘッダーが設定されていないと、すべてのモデルが正しく関連付けられ、DBの挿入順序も正しくなります。Channel
が最初に作成された後、Channel
Map
が作成された後
しかし、私はいくつかのHeader
リストを追加するとき - Hibernateは作るの追加Channel
DB内の行とこのチャネルのすべてのHeader
モデルをバインドする(IDを= 2)
マップモデル(ID = 2付き):
...
@ManyToOne(cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "channel_id")
var channel: Channel = Channel(),
...
チャンネルモデル:
...
@OneToMany(mappedBy = "channel", cascade = arrayOf(CascadeType.ALL),)
var headers: MutableSet<Header> = mutableSetOf(),
...
@JsonIgnore
@OneToMany(mappedBy = "channel", cascade = arrayOf(CascadeType.ALL))
var maps: MutableSet<Map> = mutableSetOf(),
...
ヘッダーモデル:
...
@JsonIgnore
@ManyToOne(cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "channel_id")
var channel: Channel = Channel(),
...
たぶん、いくつかの注釈が固定されなければなりません。助言を聞いてうれしいです。全てに感謝!そのような
UPDATE
保存モデル:
@PostMapping("/maps")
fun post(@RequestBody body: Map) = repo.save(body)
UPDATE 2
手動でオブジェクトを作成し、宣言する必要特性がnullable
として入力する場合 - channel_id
null
私はあなたのHeader
に、あなたは新しいChannel
にHeader
のインスタンスが作成されるたびに作成しているからだと推測
val channel = Channel(
...
)
body.channel!!.headers.forEach {
val header = Header(
name = it.name,
value = it.value
)
channel.headers.add(header)
}
val map = Map(
channel = channel
)
return repo.save(map)
を追加した: 'VARチャンネル:チャンネル? = null'がどのように 'channel_id'をセットしましたか? –
@qwert_ukgこれらのエンティティをどのように保存していますか投稿できますか?その後私は自分の答えを更新する。ありがとう –
は 'チャネル'を割り当てる方法を理解できませんか?私は 'Map'オブジェクトを手動でビルドする必要がありますか? –