假設一扇門可以用多把不同的鑰匙打開,一把鑰匙對應一扇門
@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;
}