iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Mobile Development

Spring Boot & Android Studio教學系列 第 11

建立實體關係:@ManyToOne和@OneToMany的用法

  • 分享至 

  • xImage
  •  

範例

假設一扇門可以用多把不同的鑰匙打開,一把鑰匙對應一扇門

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Door {
    @Id
    @GeneratedValue
    private Long id;
    private String doorName;
    private String type;

    @OneToMany(cascade = CascadeType.ALL,
            fetch = FetchType.LAZY,
            orphanRemoval = true,
            mappedBy = "door")
    @JsonManagedReference
    private List<Key> key;

}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
    @Id
    @GeneratedValue
    private Long id;
    private String keyName;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "door_id")
    @JsonBackReference
    private Door door;
}

@ManyToOne:這個註解用來識別一個多對一的關係關聯。在你的程式碼中,它被用於Key類別上,表示每個Key都屬於一個Door。這意味著多個Key可以與同一Door關聯,但每個鑰匙只能關聯到一個Door。

@OneToMany:這個註解用於標誌一個多個的關聯關係。在你的程式碼中,它被用於Door類上,表示每個Door可以有多個鑰匙。這允許你將多個鑰匙與同一扇Door關聯起來。

@JoinColumn:此註解用於指定在關聯關係中使用的外鍵列的名稱。在資料庫表中建立一個指向Door的外鍵name = "door_id"。

@JsonManagedReference:這個註解用於解決JSON序列化時的循環引用問題。在你的程式碼中,它被用於Door類的關鍵字段上。當物件被序列化為JSON時,這個註解告訴Jackson庫要序列化key字段,並在關聯的Key物件上標記為被管理的一方。這有助於避免無限下降的序列化。

@JsonBackReference:這個註解也用於解決JSON序列化時的循環引用問題。它被用於Key類別的閘Door字段上。它告訴Jackson庫在JSON序列化時不要序列化閘字段,因為閘Door字段已經在閘類上的關鍵字段上被序列化為JSON了。這防止了循環引用問題。

關聯連接

//新增數據與添加關聯
@PostMapping("/ex")
public String ex(){
    var door = Door.builder()
            .type("open")
            .doorName("digDoor")
            .build();
    doorRepository.save(door);
    var key1 = Key.builder()
            .keyName("Key1")
            .door(door) //這裡將此鑰匙著名與剛剛創建的門有關聯
            .build();
    keyRepository.save(key1);
    var key2 = Key.builder()
            .keyName("Key2")
            .door(door) //這裡將此鑰匙著名與剛剛創建的門有關聯
            .build();
    keyRepository.save(key2);
    return "Good";
}

//查看門的相關資訊
@GetMapping("/doorCheck")
public Door Door(){
    var door = doorRepository.findById(1L).orElseThrow();
    return door;
}


上一篇
深入解析 Spring Boot 中的 @OneToOne 資料庫關聯
下一篇
@ManyToMany:多對多關係的實現
系列文
Spring Boot & Android Studio教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言