κ°μ²΄μ ν μ΄λΈ 맀ν
JPA μμ μ μΌ μ€μν 2κ°μ§
- μμμ± μ»¨ν μ€νΈ λ° λ΄λΆ λμ λ°©μ
- κ°μ²΄μ μν°ν°μ 맀ν μ€κ³
μν°ν° 맀ν μκ°
JPA λ κ°μ²΄μ μν°ν°λ₯Ό 맀ννκΈ° μν΄ μλμ κ°μ λ€μν μ λν μ΄μ μ μ§μνλ€.
@Entity
@Table
κ°μ²΄μ ν μ΄λΈ 맀νμ μν μ λν μ΄μ @Column
νλμ μ»¬λΌ λ§€νμ μν μ λν μ΄μ @Id
κΈ°λ³Έ ν€ λ§€νμ μν μ λν μ΄μ @ManyToOne
@JoinColumn
μ°κ΄κ΄κ³ 맀νμ μν μ λν μ΄μ μ΄λ² κ°μμμλ μ°κ΄κ΄κ³ 맀νμ μ μΈν λͺ¨λ μ λν μ΄μ μ λ€λ€λ³Ό κ²μ΄λ€.
@Entity
@Entity
κ° λΆμ ν΄λμ€λ JPA κ° κ΄λ¦¬νλ€.
λλ¬Έμ, JPA λ₯Ό μ¬μ©ν΄μ ν
μ΄λΈκ³Ό 맀νν ν΄λμ€λ @Entity
κ° νμμ μ΄λ€.
@Entity
μ¬μ© μ μ£Όμν μ μ΄ λͺκ°μ§ μλλ°, μ΄λ μλμ κ°λ€.
- λμ μμ±μ μν
public
λλprotected
κΈ°λ³Έ μμ±μκ° νμμ μ΄λ€. - final ν΄λμ€, enum, interface, inner ν΄λμ€λ μ¬μ©νμ§ μλλ€.
- μ μ₯ν νλμ
final
μ μ¬μ©νμ§ μλλ€.name
μμ±μ ν΅ν΄@Entity(name = "Member")
μ²λΌ μ¬μ©ν μν°ν°μ μ΄λ¦μ μ§μ ν μ μλ€. - κΈ°λ³Έκ°μΌλ‘ ν΄λμ€ μ΄λ¦μ μ¬μ©νλ€.
- λ€λ₯Έ ν¨ν€μ§μ μ΄λ¦μ΄ κ°μ ν΄λμ€κ° μμΌλ©΄ κ°κΈμ κΈ°λ³Έκ°μ μ¬μ©νλ€.
@Table
@Table
μ μν°ν°μ 맀νν ν
μ΄λΈ μ§μ νλ μ λν
μ΄μ
μ΄λ€.
@Table
μ λν
μ΄μ
μλ λ€μν μμ±μ΄ μ‘΄μ¬νλλ°, μ΄λ μλμ κ°λ€.
name
μμ±μΌλ‘ DB ν μ΄λΈ μ΄λ¦μ΄ MBR μΌ κ²½μ°@Table(name = "MBR")
λ‘ μ§μ ν μ μλ€.calalog
μμ±μΌλ‘ λ°μ΄ν°λ² μ΄μ€ catalog 맀νν μ μλ€.schema
μμ±μΌλ‘ λ°μ΄ν°λ² μ΄μ€ schema 맀νν μ μλ€.uniqueConstraints
μμ±μΌλ‘ DDL μμ± μ μ λν¬ μ μ½ μ‘°κ±΄μ μμ±ν μ μλ€.
λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μλ μμ±
JPA λ 맀ν μ λ³΄λ§ λ³΄κ³ λ¬΄μ¨ ν μ΄λΈμ΄ νμνμ§ μκΈ° λλ¬Έμ DDL μ μ ν리μΌμ΄μ μ€ν μμ μ μλ μμ±νμ¬ ν μ΄λΈμ μλμΌλ‘ μμ±ν΄μ€λ€. μ΄λ μ¬λ¬κ°μ§ μ₯μ μ μ 곡νλλ°, μ΄λ μλμ κ°λ€.
- ν μ΄λΈ μ€μ¬ κ°λ°μμ κ°μ²΄ μ€μ¬ κ°λ°λ‘ μ νν μ μλ€.
- DB λ°©μΈμ νμ©ν΄μ DB μ λ§λ μ μ ν DDL μ μμ±νλ€. μ΄λ° μλ μμ± DDL μ μ΄μ μλ²μμλ λΆμν μ μκΈ° λλ¬Έμ μλμ κ°μ μ£Όμ μ¬νμ΄ μ‘΄μ¬νλ€.
- μ΄λ κ² μμ±λ DDL μ κ°λ° μ₯λΉμμλ§ μ¬μ©ν΄μΌ νλ€.
- μμ±λ DDL μ μ΄μμλ²μμλ μ¬μ©νμ§ μκ±°λ, μ μ ν λ€λ¬μ ν μ¬μ©ν μ μλ€.
λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μλ μμ± - μμ± μ€μ
JPA μ€μ μ hibernate.hbm2ddl.auto
μ€μ μ΄ μ‘΄μ¬νλλ°, μλμ κ°μ κΈ°λ₯λ€μ μ 곡νλ€.
create
κΈ°μ‘΄ ν μ΄λΈμ DROP ν ν λ€μ CREATE νλ€.create-drop
create μ κ°μΌλ μ’ λ£ μμ μ ν μ΄λΈμ DROP νλ€.update
λ³κ²½λ¬Έλ§ λ°μνλ€. λλ¬Έμ μ΄μ DB μμλ μ¬μ©ν΄μ μλλ€.validate
μν°ν°μ ν μ΄λΈμ΄ μ μ 맀νλμλμ§λ§ νμΈνλ€.none
μ무 μ€μ λ μ¬μ©νμ§ μλλ€.
λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μλ μμ± - μ£Όμ
μ΄μ μ₯λΉμλ μ λλ‘ create
create-drop
update
λ μ¬μ©νλ©΄ μλλ€.
- κ°λ° μ΄κΈ° λ¨κ³μλ
create
λλupdate
λ₯Ό μ¬μ©νλ€. - ν
μ€νΈ μλ²μμλ
update
λλvalidate
λ₯Ό μ¬μ©νλ€. - μ€ν
μ΄μ§κ³Ό μ΄μ μλ²μμλ
validate
λλnone
μ μ¬μ©νλ€.
DDL μμ± κΈ°λ₯
DDL μμ± κΈ°λ₯μ DDL μ μλμΌλ‘ μμ±ν λλ§ μ¬μ©λ λΏ, JPA μ μ€ν λ‘μ§μλ μν₯μ μ£Όμ§ μλλ€.
- μ μ½μ‘°κ±΄ μΆκ°
@Column(nullable = false, length = 10)
- μ λν¬ μ μ½μ‘°κ±΄ μΆκ°
@Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )})
νλμ μ»¬λΌ λ§€ν
@Entity
public class Member {
@Id // PK 맀ν
private Long id;
@Column(name = "name") // μ»¬λΌ μ΄λ¦ μ€μ
private String userName;
private Integer age;
@Enumerated(EnumType.STRING) // enum νμ
μ¬μ© μ
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) // λ μ§ νμ
μ¬μ© μ
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member() {
}
}
create table Member (
id bigint not null,
age integer,
createdDate timestamp,
description clob,
lastModifiedDate timestamp,
roleType varchar(255),
name varchar(255),
primary key (id)
)
맀ν μ λν μ΄μ μ 리
@Column
μ»¬λΌ λ§€ν@Temporal
λ μ§ λ§€ν@Enumerated
enum νμ 맀ν@Lob
BLOB, CLOB 맀ν@Transient
νΉμ νλλ₯Ό 컬λΌμ 맀ννμ§ μμ
@Column μμ±
name
νλμ 맀νν ν μ΄λΈμ μ»¬λΌ μ΄λ¦- κΈ°λ³Έκ°μ κ°μ²΄μ νλ μ΄λ¦μΌλ‘ μ§μ λ¨
insertable
updatable
λ±λ‘, λ³κ²½ κ°λ₯ μ¬λΆ- κΈ°λ³Έκ°μ TRUE λ‘ μ§μ λ¨
nullable(DDL)
null κ°μ νμ© μ¬λΆ μ€μ νλ€. false λ‘ μ€μ μ not null μ μ½μ‘°κ±΄μ΄ μΆκ°λλ€.unique(DDL)
ν 컬λΌμ κ°λ¨ν μ λν¬ μ μ½μ‘°κ±΄ μΆκ° μ μ¬μ©- μ΄λ¦μ μ€μ νκΈ° μν΄
@Table(uniqueConstraints)
λ λ§μ΄ μ¬μ©ν¨
- μ΄λ¦μ μ€μ νκΈ° μν΄
columnDefinition(DDL)
DB μ»¬λΌ μ 보λ₯Ό μ§μ μ€ μ μμlength(DDL)
λ¬Έμ κΈΈμ΄ μ μ½μ‘°κ±΄. String νμ μλ§ μ¬μ©- κΈ°λ³Έκ°μ 255 λ‘ μ§μ λ¨
precision
scale(DDL)
BigDecimal νμ μμ μ¬μ©precision
μ μμμ ν¬ν¨ μ 체 μλ¦Ώμ. κΈ°λ³Έκ° = 19scale
μ μμμ μλ¦Ώμ. κΈ°λ³Έκ° = 2
@Enumarated μμ±
μλ° enum νμ μ 맀νν λ μ¬μ©νλλ°, ORDINAL μ μ¬μ©νμ§ μλλ€. ORDINAL μ μμλ‘ μ μ₯νκΈ° λλ¬Έμ enum μ΄ μΆκ°λ κ²½μ° κ°μ κ°μ 보μ₯ν μ μλ€.
@Enumerated(EnumType.ORDINAL)
enum μμλ₯Ό DB μ μ μ₯@Enumerated(EnumType.STRING)
enum μ΄λ¦μ DB μ μ μ₯
@Temporal μμ±
λ μ§ νμ μ 맀νν λ μ¬μ©νλ€. μ΅μ νμ΄λ²λ€μ΄νΈμμλ LocalDate, LocalDateTime μ μ§μνκΈ° λλ¬Έμ μλ΅ κ°λ₯νλ€.
@Temporal(TemporalType.DATE)
λ μ§, DB μ date νμ κ³Ό 맀ν@Temporal(TemporalType.TIME)
μκ°, DB μ time νμ κ³Ό 맀ν@Temporal(TemporalType.TIMESTAMP)
λ μ§μ μκ°, DB μ timestamp νμ κ³Ό 맀ν
@Lob μμ±
DB μ BLOC κ³Ό CLOB νμ κ³Ό 맀νν λ μ¬μ©νλ€. 맀ννλ νλ νμ μ΄ λ¬Έμλ©΄ CLOB 맀ν, λλ¨Έμ§λ BLOB 맀νλλ€.
- CLOB -
String
char[]
java.sql.CLOB
- BLOB -
byte[]
java.sql.BLOB
κΈ°λ³Έ ν€ λ§€ν
κΈ°λ³Έ ν€ λ§€ν λ°©λ²
@Id
λ§ μ¬μ©νμ¬ μ§μ ν λΉ@Id @GeneratedValue
λ₯Ό ν΅ν μλ μμ±IDENTITY
DB μ μμ, MySQL μμ μ¬μ©νλ€.SEQUENCE
DB μνμ€ μ€λΈμ νΈ μ¬μ©, ORACLE μμ μ¬μ©νλ€.@SequenceGenerator
νμ
TABLE
ν€ μμ±μ© ν μ΄λΈ μ¬μ©, λͺ¨λ DB μμ μ¬μ©νλ€.@TableGenerator
νμ
AUTO
λ°©μΈμ λ°λΌ μλ μ§μ , κΈ°λ³Έκ°μΌλ‘ μ€μ λλ€.
IDENTITY μ λ΅
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
κΈ°λ³Έ ν€ μμ±μ DB μ μμνλ κ²μ΄λ€. μ£Όλ‘ MySQL μ AUTO_INCREMENT μ μ¬μ©λλ€.
JPA λ λ³΄ν΅ νΈλμμ
μ»€λ° μμ μ INSERT SQL μ μ€ννλ€.
νμ§λ§, AUTO_ INCREMENT λ λ°μ΄ν°λ² μ΄μ€μ INSERT SQL μ μ€νν μ΄νμ ID κ°μ μ μ μλ€.
λλ¬Έμ, IDENTITY μ λ΅μ em.persist()
μμ μ μ¦μ INSERT SQL μ€ννκ³ DBμμ μλ³μλ₯Ό μ‘°ννλ€.
SEQUENCE μ λ΅
@Entity
@SequenceGenerator(
name = βMEMBER_SEQ_GENERATOR",
sequenceName = βMEMBER_SEQ", //맀νν λ°μ΄ν°λ² μ΄μ€ μνμ€ μ΄λ¦
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
DB μνμ€λ μ μΌν κ°μ μμλλ‘ μμ±νλ νΉλ³ν DB μ€λΈμ νΈμ΄λ€. μ£Όλ‘ ORACLE μμ μ¬μ©νλ€.
SEQUENCE μ λ΅μ allocationSize
μμ±μ ν΅ν΄ λ©λͺ¨λ¦¬μ μ«μλ₯Ό 미리 κ°μ Έμμ μ¬μ©νλ€.
μ¦, 50μΌλ‘ μ€μ ν΄λλ©΄, 1 ~ 50 κΉμ§λ λ©λͺ¨λ¦¬λ₯Ό ν΅ν΄ id κ°μ ν λΉνκΈ° λλ¬Έμ DB μ λ€νΈμν¬ ν΅μ μ΄ μΌμ΄λμ§ μλλ€.
TABLE μ λ΅
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = βMEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
ν€ μμ± μ μ© ν μ΄λΈμ νλ λ§λ€μ΄μ DB μνμ€λ₯Ό νλ΄λ΄λ μ λ΅μ΄λ€. λͺ¨λ DB μ μ μ© κ°λ₯νμ§λ§, μ±λ₯μ΄ μ’μ§ μκΈ° λλ¬Έμ μ μ¬μ©νμ§ μλλ€.
κΆμ₯νλ μλ³μ μ λ΅
κ°μ₯ μ’μ κΈ°λ³Έ ν€ μ μ½ μ‘°κ±΄μ null μ΄ μλλ©° μ μΌνκ³ λ³νλ©΄ μλλ€. λ―ΈλκΉμ§ μ΄ μ‘°κ±΄μ λ§μ‘±νλ μμ°ν€λ μ°ΎκΈ° μ΄λ ΅κΈ° λλ¬Έμ λ체ν€λ₯Ό μ¬μ©νλ€. μλ₯Ό λ€μ΄, μ£Όλ―Όλ±λ‘λ²νΈλ κΈ°λ³Έ ν€λ‘ μ μ νμ§ μλ€. λλ¬Έμ, Longν + λμ²΄ν€ + ν€ μμ±μ λ΅ μ¬μ©νλ κ²μ κΆμ₯νλ€.
μ€μ μμ 1 - μꡬμ¬ν λΆμκ³Ό κΈ°λ³Έ 맀ν
μꡬμ¬ν λΆμ
- νμμ μνμ μ£Όλ¬Έν μ μλ€.
- μ£Όλ¬Έ μ μ¬λ¬ μ’ λ₯μ μνμ μ νν μ μλ€.
κΈ°λ₯ λͺ©λ‘
- νμ κΈ°λ₯
- νμ λ±λ‘
- νμ μ‘°ν
- μν κΈ°λ₯
- μν λ±λ‘
- μν μμ
- μν μ‘°ν
- μ£Όλ¬Έ κΈ°λ₯
- μν μ£Όλ¬Έ
- μ£Όλ¬Έ λ΄μ μ‘°ν
- μ£Όλ¬Έ μ·¨μ
λλ©μΈ λͺ¨λΈ λΆμ
- νμκ³Ό μ£Όλ¬Έμ κ΄κ³: νμμ μ¬λ¬ λ² μ£Όλ¬Έν μ μλ€. (μΌλλ€)
- μ£Όλ¬Έκ³Ό μνμ κ΄κ³: μ£Όλ¬Έν λ μ¬λ¬ μνμ μ νν μ μλ€. λ°λλ‘ κ°μ μνλ μ¬λ¬ λ² μ£Όλ¬Έλ μ μλ€. μ£Όλ¬Έ μνμ΄λΌλ λͺ¨λΈμ λ§λ€μ΄ λ€λλ€ κ΄κ³λ₯Ό μΌλλ€, λ€λμΌ κ΄κ³λ‘ νμ΄λ.
ν μ΄λΈ μ€κ³
μν°ν° μ€κ³μ 맀ν
λ°μ΄ν° μ€μ¬ μ€κ³μ λ¬Έμ μ
νμ¬ λ°©μμ ν μ΄λΈμ μΈλν€λ₯Ό κ°μ²΄μ κ·Έλλ‘ κ°μ Έμ μ¬μ©νλ€. μ¦, ν μ΄λΈ μ€κ³μ λ§μΆ°μ§ κ°μ²΄λ₯Ό μ¬μ©νκ³ μλ κ²μ΄λ€. μ΄λ¬ν μ€κ³λ κ°μ²΄ κ·Έλν νμμ΄ λΆκ°λ₯νλ©°, μ°Έμ‘°κ° μκΈ° λλ¬Έμ UML λ μλͺ»λ κ²μ μ μ μλ€.