Entity์ ๊ธฐ๋ณธ ํค๋ฅผ ๋งคํํ ๋, ๋ค์๊ณผ ๊ฐ์ด ๋งคํํ ์ ์์ต๋๋ค.
@Id
@GeneratedValue
๊ธฐ๋ณธํค(PK)๋ฅผ ๋ํ๋ด๋ @Id
์ด๋
ธํ
์ด์
์ ํตํด ๊ธฐ๋ณธํค๋ก ํ ๋นํ ์ ์์ต๋๋ค. @Id
๋ง์ผ๋ก๋ ๊ธฐ๋ณธํค๋ฅผ ์ค์ ํ ์ ์์ง๋ง, ๋น์ฆ๋์ฆ ์ํฉ์ ๋ฐ๋ผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ณธํค๋ฅผ ์ค์ ํด์ผํ ๋๊ฐ ์์ต๋๋ค. ์ด ๊ธฐ๋ณธํค ๊ฐ์ ๋ํ ์์ฑ ์ ๋ต์ @GeneratedValue
์ด๋
ธํ
์ด์
์ ํตํด ์ค์ ํ ์ ์์ต๋๋ค.
@GeneratedValue
์ด๋
ธํ
์ด์
์ GenerationType
์ ํ์ธํ๋ฉด ์์ ๊ฐ์ด ๋ค ๊ฐ์ง์
๋๋ค. ๊ฐ GenerationType
์ ๋ํด ์์๋ณด๊ณ ์ด๋ค ์์ผ๋ก id๋ฅผ ์ค์ ํ๋์ง ์ค์ ์์๋ฅผ ํตํด ํ์ธํด๋ด
์๋ค.
๊ธฐ๋ณธ ํค ์์ฑ ์ ๋ต์ ์ง์ ๊ณต๊ณ (Recruitment
) Entity์ ์ง์์(Applicant
) Entity์ ์์๋ก ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Entity
@Getter
@NoArgsConstructor
public class Recruitment {
@Id
@GeneratedValue
@Column(name = "recruitment_id")
private Long id;
@Column(name = "recruitment_name")
private String recruitment_name;
@OneToMany(mappedBy = "recruitment",
cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Applicant> userList = new ArrayList<>();
}
@Entity
@Getter
@NoArgsConstructor
public class Applicant {
@Id
@GeneratedValue
@Column(name = "applicant_id")
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String phone_number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(nullable = false)
private Recruitment recruitment;
}
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/test;MODE=MYSQL
username: sa
password:
driver-class-name: org.h2.Driver
mvc:
pathmatch:
matching-strategy: ant_path_matcher
jpa:
hibernate:
ddl-auto: create-drop
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
์ง์์ฑ ๊ณต๊ธ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ID ์ด์ ์ฌ์ฉํ์ฌ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
๊ธฐ๋ณธ ํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ ์ ๋ต์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋์ผ๋ก ์์ฑํ๊ณ id ๊ฐ์ 1 ์ฆ๊ฐ์ํต๋๋ค.
JPA๋ commit(flush) ์์ ์์ ์ฟผ๋ฆฌ๋ค์ DB๋ก ์ ์กํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ AUTO_INCREMENT๋ Insert ์ ๊ธฐ๋ณธํค ๊ฐ์ด ์์ฑ๋ฉ๋๋ค. AUTO_INCREMENT ์ฌ์ฉ ์ commit์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธํค ๊ฐ์ ์ ์ ์๊ธฐ์ ์์์ฑ ๊ฐ์ฒด๋ฅผ ์์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. AUTO_INCREMNT๋ฅผ ์ฌ์ฉํ๋ฉด ์์ธ์ ์ผ๋ก persist ์์ ์ ๋ฐ๋ก DB๋ก ์ฟผ๋ฆฌ๋ฅผ ์ ์กํด PK ๊ฐ ์์ฑ ํ ๊ฐ์ฒด์ ์ ์ฅํฉ๋๋ค.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
์ง์์ฑ ๊ณต๊ธ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค Sequence Object๋ฅผ ์ฌ์ฉํ์ฌ id๋ฅผ ๋ถ์ฌํฉ๋๋ค. ์ ์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๊ฐ ๋ชจ๋ ํ ์ด๋ธ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฐ์์ ์ด์ง ์์ต๋๋ค!
Sequence๋ฅผ ์กฐํํ๋ฌ pk ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ํ์ง๋ง, initialValue ์ allocationSize ๋ฅผ ์กฐ์ ํจ์ผ๋ก์จ ๊ณง๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ์ง ์๊ณ , ์์์ฑ ์ปจํ ์คํธ์ ์์ฌ์๋ค๊ฐ ํธ๋์ญ์ commit ํ๋ ์์ ์ INSERT ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค
๊ทธ๋ ๋ค๋ฉด SEQUENCE ์ ๋ต์ ํ ์ด๋ธ๋ณ ์์ฐจ์ ์ธ id๋ฅผ ๋ถ์ฌ ๋ชป ํ๋์?
๊ทธ๋ ์ง ์์ต๋๋ค! ํ
์ด๋ธ๋ง๋ค DB Sequence๋ฅผ ๊ด๋ฆฌํ๋ @SequenceGenerator
๋ฅผ ์ฌ์ฉํ๋ฉด Sequence Object๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
@Entity
@Getter
@NoArgsConstructor
@SequenceGenerator(
name = "APPLICANT_PK_GENERATOR",
sequenceName = "APPLICANT_PK_SEQUENCE"
)
public class Applicant {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="APPLICANT_PK_GENERATOR")
@Column(name = "applicant_id")
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String phone_number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(nullable = false)
private Recruitment recruitment;
}
id๊ฐ ํ ์ด๋ธ ์์๋๋ก ๋ถ์ฌ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค ๐
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
๊ณ ์ ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ์ง์์ฑ ๊ณต๊ธ์๊ฐ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
๊ธฐ๋ณธ ํค Table์ ์์ฑํ์ฌ id๋ฅผ ๋ถ์ฌํฉ๋๋ค.
HIBERNATE_SEQUENCES
ํ
์ด๋ธ์ด ์์ฑ๋์์ต๋๋ค!
ํ
์ด๋ธ์ ์นผ๋ผ์ ํ์ธํด๋ณด๋ SEQUENCE_NAME
๊ณผ NEXT_VAL
์ ๊ฐ๊ณ ์์ต๋๋ค. ์นผ๋ผ๋ช
์ ํตํด ํ
์ด๋ธ ๋ณ๋ก id๊ฐ์ด ์์ฑ๋จ์ ๋ฐ๋ผ id๊ฐ์ ์์๋๋ก ์ ์งํ๊ธฐ ์ํด ์์ฑ๋ ํ
์ด๋ธ์
๋๋ค.
์์ฑ๋ Applicant
์ ์๊ฐ 6๋ช
์ด๋ฏ๋ก NEXT_VAL
๋ก 6์ ์ ์ฅํ๊ณ ๋ค์ Applicant
๊ฐ ์์ฑ๋ ๊ฒฝ์ฐ 7์ ๋ถ์ฌํ๊ณ ๊ฐ์ 7๋ก ๊ฐฑ์ ํฉ๋๋ค.
๊ฐ ํ ์ด๋ธ๋ง๋ค Index Table์ ์ค์ ํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
@Entity
@Getter
@TableGenerator(
name = "APPLICANT_PK_GENERATOR",
table = "APPLICANT_PK_SEQUENCE"
)
@NoArgsConstructor
public class Applicant {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "APPLICANT_PK_GENERATOR")
@Column(name = "applicant_id")
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String phone_number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(nullable = false)
private Recruitment recruitment;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
์ง์์ฑ ๊ณต๊ธ์๊ฐ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํฉํ ์ ๋ต์ ์ ํํด์ผ ํจ์ ๋ํ๋ ๋๋ค. AUTO ์์ฑ ์ ๋ต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค๊ฐ ์กด์ฌํ ๊ฒ์ผ๋ก ์์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ๊ณต๊ธ์ ์ฒด๋ ์คํค๋ง ์์ฑ์ ์ง์ํ์ง ์๊ฑฐ๋ ๋ฐํ์์ ์คํค๋ง ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ค์ ๊ฐ์ ๋ฐ๋ผ ์๋(Auto)์ผ๋ก ์ ๋ต์ ์ค์ ํฉ๋๋ค. ๋ฐฉ์ธ์ ๋ฐ๋ผ ์์ ์ธ ๊ฐ์ง ์ ๋ต ์ค ํ๋๋ก ์ง์ ๋ฉ๋๋ค.
ํน๋ณํ id๊ฐ์ ์ค์ ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ฌด๋ํ๊ฒ AUTO
๋ก ์ค์ ํฉ์๋ค.
https://www.inflearn.com/course/ORM-JPA-Basic#
https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html