多對多關係是指一個實體類別可以與多個其他實體類別相關聯,同時其他實體類別也可以與該實體類別相關聯。
假設一扇門可以用多把不同的鑰匙打開,一把鑰匙也對應多扇門,這就是多對多的關聯
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
@Id
@GeneratedValue
private Long id;
private String keyName;
@ManyToMany(mappedBy = "door")
// @JsonIgnore
@JsonIgnoreProperties("door")
@Builder.Default
private List<Key> key = new ArrayList<>();
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
@Id
@GeneratedValue
private Long id;
private String keyName;
@ManyToMany
@JoinTable(
name = "door_key",
joinColumns = @JoinColumn(name = "key_id"),
inverseJoinColumns = @JoinColumn(name = "door_id")
)
@JsonIgnoreProperties("key")
// @JsonIgnore
@Builder.Default
private List<Door> door = new ArrayList<>();
}
當你在實體之間建立多對多關聯時,通常需要一個中介表來存儲這些關聯 @JoinTable 就是用於設定多對多關聯的中介表。
name:指定中介表的名稱。
joinColumns:指定一個或多個列(欄位)來關聯當前實體的外鍵。
inverseJoinColumns:指定一個或多個列(欄位)來關聯另一個實體的外鍵。
用於控制序列化和反序列化過程中的 JSON 屬性排除。
@JsonIgnoreProperties("door") 和 @JsonIgnoreProperties("key")。這表示在轉換為 JSON 時,Jackson 將忽略 Door 物件中的 key 屬性,以及 Key 物件中的 door 屬性,從而避免無限循環。
@PostMapping("/many")
public Door createDoorWithKey(){
var door = Door
.builder()
.doorName("一號門")
.type("open")
.build();
doorRepository.save(door);
var key = Key
.builder()
.keyName("多功能鑰匙")
.build();
keyRepository.save(key);
//建立關聯
door.getKey().add(key);
key.getDoor().add(door);
doorRepository.save(door);
return door;
}