๋ฐ์ํ
JPA Cascade Types
Spring JPA CascadeType ์ข ๋ฅ
javax.persistence.CascadeType
JPA Cascade Type
- ALL
- PERSIST
- MERGE
- REMOVE
- REFRESH
- DETACH
CascadeType.ALL
- ์์ ์ํฐํฐ์์ ํ์ ์ํฐํฐ๋ก ๋ชจ๋ ์์ ์ ์ ํ
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
private List<Address> addresses;
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String street;
private int houseNumber;
private String city;
private int zipCode;
@ManyToOne(fetch = FetchType.LAZY)
private Person person;
}
CascadeType.PERSIST
- ํ์ ์ํฐํฐ๊น์ง ์์์ฑ ์ ๋ฌ
- Person Entity๋ฅผ ์ ์ฅํ๋ฉด Address Entity๋ ์ ์ฅ
@Test
public void whenParentSavedThenChildSaved() {
Person person = new Person();
Address address = new Address();
address.setPerson(person);
person.setAddresses(Arrays.asList(address));
session.persist(person); // persist ๋์ ์ํ
session.flush();
session.clear();
}
Hibernate: insert into Person (name, id) values (?, ?)
Hibernate: insert into Address (
city, houseNumber, person_id, street, zipCode, id) values (?, ?, ?, ?, ?, ?)
CascadeType.MERGE
- ํ์ ์ํฐํฐ๊น์ง ๋ณํฉ ์์
์ ์ง์
- Address์ Person ์ํฐํฐ๋ฅผ ์กฐํํ ํ ์ ๋ฐ์ดํธ
@Test
public void whenParentSavedThenMerged() {
int addressId;
Person person = buildPerson("devender");
Address address = buildAddress(person);
person.setAddresses(Arrays.asList(address));
session.persist(person);
session.flush();
addressId = address.getId();
session.clear();
Address savedAddressEntity = session.find(Address.class, addressId);
Person savedPersonEntity = savedAddressEntity.getPerson();
savedPersonEntity.setName("devender kumar");
savedAddressEntity.setHouseNumber(24);
session.merge(savedPersonEntity); // merge ๋์ ์ํ
session.flush();
}
Hibernate: select address0_.id as id1_0_0_, address0_.city as city2_0_0_, address0_.houseNumber as houseNum3_0_0_, address0_.person_id as person_i6_0_0_, address0_.street as street4_0_0_, address0_.zipCode as zipCode5_0_0_ from Address address0_ where address0_.id=?
Hibernate: select person0_.id as id1_1_0_, person0_.name as name2_1_0_ from Person person0_ where person0_.id=?
Hibernate: update Address set city=?, houseNumber=?, person_id=?, street=?, zipCode=? where id=?
Hibernate: update Person set name=? where id=?
CascadeType.REMOVE
- ํ์ ์ํฐํฐ๊น์ง ์ ๊ฑฐ ์์
์ ์ง์
- ์ฐ๊ฒฐ๋ ํ์ ์ํฐํฐ๊น์ง ์ํฐํฐ ์ ๊ฑฐ
@Test
public void whenParentRemovedThenChildRemoved() {
int personId;
Person person = buildPerson("devender");
Address address = buildAddress(person);
person.setAddresses(Arrays.asList(address));
session.persist(person);
session.flush();
personId = person.getId();
session.clear();
Person savedPersonEntity = session.find(Person.class, personId);
session.remove(savedPersonEntity); // remove ๋์ ์ํ
session.flush();
}
Hibernate: delete from Address where id=?
Hibernate: delete from Person where id=?
CascadeType.REFRESH
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ธ์คํด์ค ๊ฐ์ ๋ค์ ์ฝ์ด ์ค๊ธฐ(์๋ก๊ณ ์นจ)
- ์ฐ๊ฒฐ๋ ํ์ ์ํฐํฐ๊น์ง ์ธ์คํด์ค ๊ฐ ์๋ก๊ณ ์นจ
@Test
public void whenParentRefreshedThenChildRefreshed() {
Person person = buildPerson("devender");
Address address = buildAddress(person);
person.setAddresses(Arrays.asList(address));
session.persist(person);
session.flush();
person.setName("Devender Kumar");
address.setHouseNumber(24);
session.refresh(person); // refresh ๋์ ์ํ
assertThat(person.getName()).isEqualTo("devender");
assertThat(address.getHouseNumber()).isEqualTo(23);
}
CascadeType.DETACH
- ์์์ฑ ์ปจํ
์คํธ์์ ์ํฐํฐ ์ ๊ฑฐ
- ์ฐ๊ฒฐ๋ ํ์ ์ํฐํฐ๊น์ง ์์์ฑ ์ ๊ฑฐ
@Test
public void whenParentDetachedThenChildDetached() {
Person person = buildPerson("devender");
Address address = buildAddress(person);
person.setAddresses(Arrays.asList(address));
session.persist(person);
session.flush();
assertThat(session.contains(person)).isTrue();
assertThat(session.contains(address)).isTrue();
session.detach(person); // detach ๋์ ์ํ ์ ์์์ฑ ์ปจํ
์คํธ์ ์กด์ฌํ์ง ์์.
assertThat(session.contains(person)).isFalse();
assertThat(session.contains(address)).isFalse();
}
๋ฐ์ํ
'Backend๐ฑ > Spring JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์ฟผ๋ฆฌ ๋ฉ์๋ ์ฌ์ฉ (1) | 2023.04.20 |
---|---|
Spring Data JPA 1. ์์๊ตฌ์กฐ์ ์ฃผ์ ์ธํฐํ์ด์ค (0) | 2023.04.19 |
@Transactional์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋๋์ฒด ๋ญ๊น... ์ ์ฌ์ฉํ ๊น...? (0) | 2023.04.09 |
[JPA] - @JoinColumn๊ณผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ (mappedBy) (0) | 2023.04.09 |
[ Spring-Boot ] JPA @GeneratedValue ์ฌ์ฉํ๊ธฐ (0) | 2023.04.05 |