Spring JPA 2
๐ฟ Entity Mapping
@Entity
- Entity๋ ๊ฐ์ฒด ๊ด์ ์์ ๋ถ๋ฅด๋ ์ด๋ฆ
- ๋ณดํต Class์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์
- Entity์ ์ด๋ฆ์ JQL์์ ์ฌ์ฉ
@Table
- Relation(database) ๊ด์ ์์ ๋ถ๋ฅด๋ ์ด๋ฆ
- @Entity์ ์ด๋ฆ์ด ๊ธฐ๋ณธ๊ฐ
- Table์ ์ด๋ฆ์ SQL์์ ์ฌ์ฉ
@Id
- Entity์ Primary Key๋ฅผ ๋งคํํ ๋ ์ฌ์ฉ
- java์ ๋ชจ๋ primitive ์ Wrapper ํ์
์ฌ์ฉ ๊ฐ๋ฅ
- Date๋ BigDecimal, BigInteger๋ ์ฌ์ฉ๊ฐ๋ฅ
- ๋ณตํฉํค๋ฅผ ๋ง๋ค์ด ๋งคํํ๋ ๋ฐฉ๋ฒ๋ ์๊ธด ์์
@GenerativeValue
- Primary Key์ ์์ฑ ๋ฐฉ๋ฒ์ ๋งคํํ๋ Annotation
- ์์ฑ ์ ๋ต๊ณผ ์์ฑ๊ธฐ๋ฅผ ์์ฑํ ์ ์์
- ๊ธฐ๋ณธ ์ ๋ต: AUTO(DB์ ๋ฐ๋ผ ์ ์ ํ ์ ๋ต ์ ํ)
- TABLE, SEQUENCE, IDENTITY ์ค ํ๋
@Column
- unique, nullable, length, ColumnDefinition ๋ฑ Row์ ํน์ฑ ์ ์
@Temporal
- Date ์ Calendar
@Transient
- Column์ผ๋ก ๋งคํํ๊ณ ์ถ์ง ์์ ๋ฉค๋ฒ ๋ณ์์ ์ฌ์ฉ
Tip
- spring.jpa.show-sql=true
- spring.jpa.properties.hibernate.format_sql=true
๐ฟ @Value ํ์ ๋งคํ
Entity ์ Value
- ์๋ณ์๊ฐ ์์ด์ผ ํ๋๊ฐ
- ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํด์ผ ํ๋๊ฐ
Value ํ์ ์ข ๋ฅ
- ๊ธฐ๋ณธ ํ์ (String, Date, Boolean)
- Composite Value ํ์
- Collection Value ํ์
- ๊ธฐ๋ณธ ํ์ ์ ์ฝ๋ ์
- Composite ํ์ ์ ์ฝ๋ ์
Composite Value ํ์
- @Embedable
- @Embedded
- @AttributeOverrides
- AttributeOverride
๐ฟ ๊ด๊ณ ๋งคํ
- 2๊ฐ์ Entity์ ๊ด๊ณ๋ฅผ ์ค์
- ๋ ์ค ํ๋๋ ๊ด๊ณ์ ์ฃผ์ธ์ด ๋์ด์ผ ํจ
- ๋ค๋ฅธ ์ชฝ์ ์ข ์๋ ์ชฝ
- ํด๋น ๊ด๊ณ์ ๋ฐ๋์ชฝ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง ์ชฝ์ด ์ฃผ์ธ
- ๋จ๋ฐฉํฅ
- ๋จ๋ฐฉํฅ์์๋ ๊ด๊ณ์ ์ฃผ์ธ์ด ๋ช
ํ
- ๊ด๊ณ๋ฅผ ์ ์ํ ์ชฝ์ด ๊ด๊ณ์ ์ฃผ์ธ
- ๋จ๋ฐฉํฅ @ManyToOne
- ๊ธฐ๋ณธ๊ฐ์ FK ์์ฑ
- ๋จ๋ฐฉํฅ @OneToMany
- ๊ธฐ๋ณธ๊ฐ์ ์กฐ์ธ ํ ์ด๋ธ ์์ฑ
- ๋จ๋ฐฉํฅ์์๋ ๊ด๊ณ์ ์ฃผ์ธ์ด ๋ช
ํ
- ์๋ฐฉํฅ
- FK๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ชฝ์ด Owner ๋ฐ๋ผ์ @ManytoOne ๊ฐ์ง๊ณ ์๋ ์ชฝ์ด ์ฃผ์ธ
- ์ฃผ์ธ์ด ์๋ ์ชฝ์ mappedby๋ฅผ ํตํด ํ๋๋ฅผ ์ค์
- @ManyToOne(์ด์ชฝ์ด ์ฃผ์ธ)
- @OneToMany(mappedby)
- ์ฃผ์ธ์๊ฒ ๊ด๊ณ๋ฅผ ์ค์ ํด์ผ DB์ ๋ฐ์์ด ๋จ(์ค์)
- mappedby์ชฝ์ ๋ํด์ saveํด๋ DB ์ ์ฉ ์๋จ
๐ฟ Entity ์ํ์ Cascade
Cascade: Entity์ ์ํ๋ฅผ ์ ์ด ์ํค๋ ์ต์
Entity์ ์ํ
- Transient: JPA๊ฐ ๋ชจ๋ฅด๋ ์ํ
- Persistent: JPA๊ฐ ๊ด๋ฆฌ์ค์ธ ์ํ(1์ฐจ ์บ์ฌ, Dirty-Checking, WriteBehind)
- Detached: JPA๊ฐ ๋์ด์ ๊ด๋ฆฌํ์ง ์๋ ์ํ
- Removed: JPA๊ฐ ๊ด๋ฆฌํ๊ธด ํ์ง๋ง ์ญ์ ํ๊ธฐ๋ก ํ ์ํ
Entity Fetch Join
- ์ฐ๊ด๋ Entity๋ฅผ ํจ๊ป ์กฐํ
- select m from Member m join fetch m.team
- SQL: Select M.,T. FROM MEMBER M INNER JOIN TEAM T on M.TEAM_ID=T.ID