๐1:N ์ฐ๊ด๊ด๊ณ๋ฅผ ์์๋ณด์.
์์ user Table๊ณผ user_history๋ 1๋ N ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.
โ ์ด์ ์ ๋ง๋ User์ User_history ์ํฐํฐ๋ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด๋๋ค. Test ํด๋ณด์.
@Test
void userRelationTest(){
User user = new User();
user.setName("david");
user.setEmail("david@fast.com");
user.setGender(Gender.MALE);
userRepository.save(user);
userHistoryRepository.findAll().forEach(System.out::println);
}
๊ฒฐ๊ณผ
UserHistory(super=BaseEntity(createdAt=2022-02-08T14:23:00.755, updatedAt=2022-02-08T14:23:00.755), id=1, userId=null, name=david, email=david@fast.com)
UserHistory์ userId ๊ฐ์ด null๋ก ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ.. ์ด์ ๋ PrePersist๋ฅผ ์ฌ์ฉํ์ฌ ๋๋น์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ๋๋ ค์ ๊ทธ๋ฐ๊ฑฐ ๊ฐ๋ค. ๊ทธ๋ผ PostPersist๋ก ๋ณ๊ฒฝํด์ฃผ์.
public class UserEntityListener {
@PostPersist
@PostUpdate
public void prePersistAndPreUpdate(Object o) {
...
...
...
โ ๊ฐ์ ์ ์ ์ ๋ํด์ userhistory๋ฅผ ์ถ๊ฐ์ ์ผ๋ก entity ๋ฆด๋ ์ด์ ์ ํ์ธํด๋ณด์.
void userRelationTest(){
User user = new User();
user.setName("david");
user.setEmail("david@fast.com");
user.setGender(Gender.MALE);
userRepository.save(user);
user.setName("danielll");
userRepository.save(user);
user.setEmail("daniel@fast.com");
userRepository.save(user);
userHistoryRepository.findAll().forEach(System.out::println);
}
์ถ๋ ฅํ๋ฉด.
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:05:10.094, updatedAt=2022-02-08T15:05:10.094), id=1, userId=6, name=david, email=david@fast.com)
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:05:10.141, updatedAt=2022-02-08T15:05:10.141), id=2, userId=6, name=danielll, email=david@fast.com)
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:05:10.141, updatedAt=2022-02-08T15:05:10.141), id=3, userId=6, name=danielll, email=daniel@fast.com)
โ ์ฌ๋ฌ ํ์คํ ๋ฆฌ์ค id๊ฐ์ ํน์ ํด์ ๋ณผ์ ์๋๋ก findByUserId ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ Testํด๋ณด์.
public interface UserHistoryRepository extends JpaRepository<UserHistory, Long> {
List<UserHistory> findByUserId(Long userId);
}
@Test
void userRelationTest(){
User user = new User();
user.setName("david");
user.setEmail("david@fast.com");
user.setGender(Gender.MALE);
userRepository.save(user);
user.setName("danielll");
userRepository.save(user);
user.setEmail("daniel@fast.com");
userRepository.save(user);
// userHistoryRepository.findAll().forEach(System.out::println);
// Table ๊ด๊ณ๋ก ๊ฐ์ ธ์ค๊ธฐ.
List<UserHistory> result = userHistoryRepository.findByUserId(userRepository.findByEmail("daniel@fast.com").getId());
result.forEach(System.out::println);
}
โ ์ ์ฒ๋ผ Table ๊ด๊ณ๋ก ๊ฐ์ ๊ฐ์ ธ์์ง๋ง Jpa ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์๋ค. JPA์์ ์ ๊ณตํ๋ @OntToMany์ด๋ ธํ ์ด์ ์ ์ด์ฉํด๋ณด์.
@OneToMany
private List<UserHistory> userHistories
= new ArrayList<>(); //getUserHistoryes๋ฅผ ํ์๋ NullPointException์ด ๋จ์ง ์๊ฒ ๊ธฐ๋ณธ๋ฆฌ์คํธ ๋ฃ์ด์ฃผ์.
// Jpa์์ ํด๋น๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋น ๋ฆฌ์คํธ๋ฅผ ์๋์ผ๋ก ๋ฃ์ด์ฃผ๊ธฐ๋ ํ์ง๋ง, persistํ๊ธฐ ์ ์ ํด๋น ๊ฐ์ด Null์ด๊ธฐ ๋๋ฌธ์ ๋ก์ง์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ์๊ธธ์์๋ค.
๊ทธ๋ผ ์ ์ Id๊ฐ์ ๊ฐ์ ธ์์ userHistory๋ฅผ ๋ค์ ์กฐํํ๋ ๋ถ๋ถ์ ์์ ํ ์ ์๋ค.
@Test
void userRelationTest(){
User user = new User();
user.setName("david");
user.setEmail("david@fast.com");
user.setGender(Gender.MALE);
userRepository.save(user);
user.setName("danielll");
userRepository.save(user);
user.setEmail("daniel@fast.com");
userRepository.save(user);
// userHistoryRepository.findAll().forEach(System.out::println);
// Table ๊ด๊ณ๋ก ๊ฐ์ ธ์ค๊ธฐ.
// List<UserHistory> result = userHistoryRepository.findByUserId(userRepository.findByEmail("daniel@fast.com").getId());
List<UserHistory> result = userRepository.findByEmail("daniel@fast.com").getUserHistories();
result.forEach(System.out::println);
}
์ด๋ ๊ฒ ํ๊ณ Test๋ฅผ ํ๋ฉด LazyInitializationException ์ค๋ฅ๊ฐ ๋๋ค. ํ์ง๋ง ๋ค์ ์ฑํฐ์์ ๋ฐฐ์ธ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋จ, FetchType์ EAGER๋ก ๋ณ๊ฒฝํด์ฃผ์.
@OneToMany(fetch = FetchType.EAGER)
private List<UserHistory> userHistories
= new ArrayList<>();
@JoinColumn??
์์ ๊ฐ์ด Testํ๊ณ console(DDL)์ ํ์ธํด๋ณด๋ฉด
create table user_user_histories (
user_id bigint not null,
user_histories_id bigint not null
)
๐ user_user_histories๋ผ๋ ์ค๊ฐ ๋งตํ ํ
์ด๋ธ์ด ์์ฑ๋์ด์๋ค. ์ด๋ ์ฌ์ฉํ๋๊ฒ์ด @JoinColume์ด๋ค.
@JoinColume์ Entity๊ฐ ์ด๋ค ์ปฌ๋ผ์ผ๋ก joinํ๊ฒ ๋ ์ง ์ง์ ํ๋ ์ด๋
ธํ
์ด์
์ด๋ค.
๐ ์ด๋ ๊ฒ ํ๋ฉด user_user_histories ํ
์ด๋ธ์ ์ฌ๋ผ์ง์ง๋ง user_historyํ
์ด๋ธ์ user_id์ Join์ด ๋์ด์ผํ๋๋ฐ user_histories_id ์ปฌ๋ผ์ด ์๋ก์๊ธธ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ @JoinColumn(name="user_id")๋ผ๊ณ ์ง์ ํด์ user_id๋ก ์กฐ์ธํ ๊บผ๋ผ๊ณ ๋ช
์์ ์ผ๋ก ํํํด๋ฌ์ผํ๋ค.
๐
์ด๋ ๊ฒ ์ค๋ฅ๊ฐ ๋จ๋๋ฐ ์ปฌ๋ผ ๋ค์์ด user_id๋ฅผ ์ธ์ง userId๋ก ์ธ์ง ๋ชจํธํ๋ค๋ ๋ป ์ด๋ค.
๊ทธ๋ฌ๋ UserHistory์๋ ๋ช
์์ ์ผ๋ก ํด์ค๋ค.
public class UserHistory extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
TEST ํ๋ฉด
Hibernate:
create table user (
id bigint generated by default as identity,
created_at timestamp,
updated_at timestamp,
email varchar(255),
gender varchar(255),
name varchar(255),
primary key (id)
)
Hibernate:
create table user_history (
id bigint generated by default as identity,
created_at timestamp,
updated_at timestamp,
email varchar(255),
name varchar(255),
user_id bigint,
primary key (id)
)
์์๊ฐ์ด DDL์ด ์ฌ๋๋ก ์์ฑ๋๊ฑธ ๋ณผ ์ ์๋ค.
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:35:57.741, updatedAt=2022-02-08T15:35:57.741), id=1, userId=6, name=david, email=david@fast.com)
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:35:57.819, updatedAt=2022-02-08T15:35:57.819), id=2, userId=6, name=danielll, email=david@fast.com)
UserHistory(super=BaseEntity(createdAt=2022-02-08T15:35:57.819, updatedAt=2022-02-08T15:35:57.819), id=3, userId=6, name=danielll, email=daniel@fast.com)
๊ฒฐ๊ณผ๋ ์ ๋์จ๋ค.
insertable, updatable
History๋ผ๋ ๊ฐ์ User ์ํฐํฐ์์ ์์ ํ๊ฑฐ๋ ์ถ๊ฐํ๋ฉด ์๋๋ค. ์ฆ, ReadOnly ์กฐํ์ ์ฉ ๊ฐ์ด ๋์ด์ผ ํ๋ค.
@JoinColumn(name = "user_id", insertable = false, updatable = false)
๐ค ์ดํ์ cascade,ํธ๋์ ์
์์ ๋ฐฐ์ฐ๊ฒ ์ง๋ง..
*๐ค JPA๋ ์๋์ผ๋ก ๋ง์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋์ ์ฒ๋ฆฌํด์ค๋ค. ํ์ง๋ง ๋๋ ๋ชจ๋ฅด๋ ์ฌ์ด์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์คํํ๊ธฐ ๋๋ฌธ์, ๋ถํ์ํ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ค์๋์ด๋, ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ด์๋ฅผ ๋ง๋ค์ ์๋ค.
Table Entity๋ฅผ ์ด์ฌํ ์ค๊ณํด์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์ต์ ์ ์ฟผ๋ฆฌ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด JPA๊ณ ์์ ๊ธธ์ด๋ค. ๐ค *
'Dev > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ฐ๊ด๊ด๊ณ ์ดํด๋ณด๊ธฐ(1:1) (0) | 2022.03.02 |
---|---|
JPA ์ฐ๊ด๊ด๊ณ (N:1) (0) | 2022.03.02 |
JPA EntityListener (0) | 2022.03.02 |
JPA Entity์ ๊ธฐ๋ณธ์์ฑ (0) | 2022.03.02 |
JPA ์ฟผ๋ฆฌ๋ฉ์๋ ์ ๋ ฌ (0) | 2022.03.02 |