SpringBoot JPA@OneToManyと@ManyToOneの使い方と注意点
1864 ワード
SpringBoot JPAは、一対多、多対一の使い方で、何日も振り回して、やっと分かりました.
書き方は非常に簡潔で,コード量が少なく,開発効率の利点が明らかである.以下のように整理されています.
エンティティ:一:DetectUnit(サイト)、多:Device(デバイス)、一つのサイトに複数のデバイスを配備する.
1対多OneToMany:DetectUnit.java
クエリの結果:
多対一ManyToOne:Device.java
クエリの結果:
注意点:
@JsonBackReferenceは、jsonの生成時にこの属性が除外されることを示します
エンティティAとエンティティBには複数の関係があります.
AとBのうち、少なくとも一方は@JsonBackReferenceを持参しなければならない.そうしないと、Infinite Recursionの問題を引き起こし、デッドサイクルを招く.
参照先:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion
書き方は非常に簡潔で,コード量が少なく,開発効率の利点が明らかである.以下のように整理されています.
エンティティ:一:DetectUnit(サイト)、多:Device(デバイス)、一つのサイトに複数のデバイスを配備する.
1対多OneToMany:DetectUnit.java
//@JsonBackReference //json
@OneToMany(targetEntity=Device.class, mappedBy="detectUnit")
private List devices;
//setter, getter
クエリの結果:
{
"id": 1,
"no": "001",
"name": " ",
"devices": [
{
"id": 3,
"no": "000111",
"name": " 1 ",
"deployTime": "2015-01-13"
},
{
"id": 7,
"no": "0188",
"name": " 5 ",
"deployTime": "2016-08-12"
},
...
]
}
多対一ManyToOne:Device.java
//@JsonBackReference //json
@ManyToOne
private DetectUnit detectUnit;
//setter, getter
クエリの結果:
[
{...}
{
"id": 5,
"no": "ML002",
"name": " 2 ",
"deployTime": "2015-01-12",
"detectUnit": {
"id": 2,
"no": "002",
"name": " "
}
}
{...}
]
注意点:
@JsonBackReferenceは、jsonの生成時にこの属性が除外されることを示します
エンティティAとエンティティBには複数の関係があります.
AとBのうち、少なくとも一方は@JsonBackReferenceを持参しなければならない.そうしないと、Infinite Recursionの問題を引き起こし、デッドサイクルを招く.
参照先:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion