SpringBoot JPA@OneToManyと@ManyToOneの使い方と注意点

1864 ワード

SpringBoot JPAは、一対多、多対一の使い方で、何日も振り回して、やっと分かりました.
書き方は非常に簡潔で,コード量が少なく,開発効率の利点が明らかである.以下のように整理されています.
エンティティ:一: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