Database ์ค๊ฒ๋ฅผ ์งํํ๋ค๋ณด๋ฉด 1:1 ๊ด๊ณ์์ ๋ถ๋ชจ์ ์์์ฒ๋ผ ํ๋์ ํ
์ด๋ธ์ ์ข
์๋์ด ์๋ ํ
์ด๋ธ์ด ์ค๊ณ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.์ด๋ฐ ๊ฒฝ์ฐ ๋ถ๋ชจ ํ
์ด๋ธ์ PK๋ฅผ ์์ํ
์ด๋ธ์์ PK์ด์ FK๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ JPA Entity ์ค๊ณ๋ฅผ ํ ๋ ๋จ์ @JoinColumn Annotation์ผ๋ก ์ค๊ณํ๊ฒ๋๋ฉด ๋ถ๋ชจํ
์ด๋ธ์์ PK๊ฐ ์๋ค๊ณ JPA์์ ์ค๋ฅ๋ก ๋ฐ์๋ค์ผ ๋ฟ๋ง ์๋๋ผ PK ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ผ๋ PK ์ FK๊ฐ ๋ฐ๋ก ์๊ฒจ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ MapsId ๋ผ๋ Annotation์ ์ด์ฉํด์ FK ์ปฌ๋ผ์ ์ค์ด๋ ๋์์ PK ์ FK๋ฅผ ํฉ์ณ์ ์ค๊ณ๊ฐ ๋๋๋ก ๊ธฐ๋กํด๋ณด๋ ค๊ณ ํ๋ค.
@Entity(name = "speaker_info")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class SpeakerInfo {
@Id
@Column(name = "speaker_id", length = 15)
private String speakerId;
@Column(name = "lte_number", length = 11, nullable = false)
private String lteNumber;
@ManyToOne(targetEntity = RegionInfo.class, fetch = FetchType.LAZY)
@JoinColumn(name = "region_code", nullable = false)
private RegionInfo regionInfo;
@Column(name = "latitude")
private Double latitude;
@Column(name = "longitude")
private Double longitude;
@Column(name = "description", columnDefinition = "TEXT")
private String description;
}
๋ถ๋ชจ Entity์ ์ค๊ณ๋ ์์ ๊ฐ์ด ๋์ด ์๋ค. ์คํผ์ปค ์ ๋ณด์ ๊ดํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ ์์ Entity๋ก๋ ์คํผ์ปค์ ์ค์ ์ ๋ณด์ ๊ดํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋๋ก ์ค๊ณ๊ฐ ๋์ด ์๋ค.
์๋์ ์์ Entity์ ์ ๋ณด๋ฅผ ๋ณด๋๋ก ํ์.
@Entity(name = "speaker_control_value_info")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class SpeakerControlValueInfo {
@Id
private String speakerInfoId;
@MapsId(value = "speakerInfoId")
@OneToOne(targetEntity = SpeakerInfo.class, fetch = FetchType.LAZY)
@JoinColumn(name = "speaker_info_id")
private SpeakerInfo speakerInfo;
// SubCommand 1
@Column(name = "bgm_volume_ch1")
@ColumnDefault("0")
private byte bgmVolumeCh1;
}
์์ Entity์ ์ค๊ณ๋ ์์ ๊ฐ์ด ๋์ด ์๋ค. ์คํผ์ปค ์ ๋ณด๋ฅผ ๋ถ๋ชจ Entity๋ก์ 1:1๋ก ๊ฐ์ง๊ณ ์๋๋ก ์ค๊ณํ์๋ค. ์คํผ์ปค ์ ๋ณด๊ฐ ์์ด์ผ ์คํผ์ปค ์ค์ ์ ๋ณด๊ฐ ์๋ ๊ฒ ์ด๋ฏ๋ก 1:1๋ก์ ๋ฐ์ดํฐ๊ฐ ์๋๊ฐ ์ด์ ๋ ์์ผ๋ฏ๋ก ํด๋น ๋ฌธ์ ๋ ๋ฐฐ์ ํ๋๋ก ํ๋ค. Annotation์ ๊ธฐ์ค์ผ๋ก ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ์.
@MapsId Annotation์ ๊ดํ์ฌ ์ ๋ฆฌํด๋ณด์๋ค. ๋ธ๋ก๊ทธ๋ฅผ ๋ค์ง๋ค๋ณด๋ฉด ๋จ์ํ Column๋ฅผ ์ค์ฌ์ฃผ๋ ์ญํ ์ด๋ผ๊ณ ๋์ค๋๋ฐ, ์ ํํ ๊ฐ๋ ์ ์์ง ๊นจ๋ซ์ง ๋ชปํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ง ๊นจ๋ฌ์๊ฑฐ ๊ฐ์์ ์ข ์์ฝ๋ค. @MapsId ์ ๊ฐ๋ ์ ๋ํ ๊ณต๋ถ๋ฅผ ์ข๋ ํด์ ๋์ค์ ๊ธฐ๋กํด ๋ณด๋ ค๊ณ ํ๊ณ , 1:N์์ @MapsId๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋๋ฐ ๊ทธ๊ฒ๋ ์ฐพ์์ ๊ธฐ๋กํด๋ณด๋ ค๊ณ ํ๋ค.