remove() ๋ฉ์๋๋ก ์ ๊ฑฐํ๊ธฐ
๋ง์ง๋ง์ผ๋ก ๊ฐ์ฒด ์ญ์ ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์น์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ๋์์ค๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฏ ๊ฐ์ง ๋์์ค๊ฐ ์์ต๋๋ค.
- remove() ๋ฉ์๋ ๋ก ์ ๊ฑฐํ๊ธฐ
- ํ์ฌ๋ฅผ ์ํ ์ ๊ฑฐ
- ๊ณ ์์ ์ํ ์ ๊ฑฐ
- JPQL๋ก ์ญ์
- NativeQuery๋ฅผ ํตํ ์ญ์
- ์ํํธ์ญ์ ()
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋ถ๋ช ํ ํด๊ฒฐ์ฑ ์ธ remove() ๋ฉ์๋ ํธ์ถ๋ถํฐ ์์ํ ๊ฒ์ ๋๋ค .
User user = new User();
user.setName("Kolyan");
session.persist(user); // add an object to the database
session.flush();
session.clear(); // close the session
user = (User) session.find(User.class, user.getId() ); //receive the object from the database
session.remove(user);
session.flush();
session.clear(); // close the session
//here the object is actually deleted.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ์์ ์ flush() ๋ฉ์๋๊ฐ ํธ์ถ๋๊ฑฐ๋ ํธ๋์ญ์ ์ด ๋ซํ ํ์ ์คํ๋ฉ๋๋ค .
๊ณ๋จ์ ์ญ์
SQL์ ๊ณต๋ถํ ๋ CONSTRAINT๋ฅผ ์ฌ์ฉํ์ฌ ์ข ์ ํ ์ด๋ธ์ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋์์ต๋๋ค.
CONSTRAINT ONDELETE REMOVE
๊ทธ ์๋ฏธ๋ ์์ ์ํฐํฐ๋ฅผ ํฌํจํ๋ ํ ์ด๋ธ์ด ์๋ ๊ฒฝ์ฐ ๋ถ๋ชจ ์ํฐํฐ๊ฐ ํ ๋น๋ ๋ ๋ชจ๋ ์์์ ์ญ์ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์ด๋๊ฐ์ ์ ์ฅํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CONSTRAINT๋ฅผ ์ค์ ํ์ฌ ์ฌ์ฉ์๊ฐ ์ญ์ ๋๋ฉด ์ด ๋ฐ์ดํฐ๋ ์ญ์ ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ชจ๋ ํ์ ๊ฐ์ฒด๊ฐ ๊ธฐ๋ณธ ์์ค์์ ์ญ์ ๋ฉ๋๋ค.
User user = new User();
UserPrivateInfo info = new UserPrivateInfo();
user.setPrivateInfo(info);
session.persist(user); //add the object to the database, the info object will also be saved to the database
session.flush();
session.clear(); // close the session
user = (User) session.find(User.class, user.getId() ); //receive the object from the database
session.remove(user);
session.flush();
session.clear(); // close the session
// here the user and info objects are actually removed from the database.
๊ณ ์์ ์ํ ์ ๊ฑฐ
๊ณ ์ ์ ๊ฑฐ๋ผ๋ ๋ ๋ค๋ฅธ ์ ํ์ ์ ๊ฑฐ๋ ์์ต๋๋ค. ์ด์ ๋ฒ์ ๊ณผ ๋ค์ ๋น์ทํฉ๋๋ค. ์์ ์ํฐํฐ์์ ๊ด๊ณ๊ฐ ๋์ด์ง๋ฉด ํ์ ์ํฐํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ ์ํฐํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ญ์ ๋์ง ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์๊ณ ๊ฒ์๋ฌผ ๋ชฉ๋ก์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
User user = new User();
UserMessage message = new UserMessage();
user.getMessageList().add(message);
session.persist(user); //add the object to the database, the message object will also be saved to the database
session.flush();
session.clear(); // close the session
user = (User) session.find(User.class, user.getId() ); //receive the object from the database
UserMessage message2 = user.getMessageList().get(0); //get the user's message
user.getMessageList().remove(message2); //remove the message from the list
session.flush();
session.clear(); // close the session
// here the message2 object is actually removed from the database
๋ํ ์ค์ํ ๋์์ค๊ฐ ์์ต๋๋ค. Hibernate๊ฐ ์ด ๋์์ ๊ตฌํํ๋๋ก ํ๋ ค๋ฉด ์ฃผ์์ ์ฌ์ฉํ์ฌ ๋ ์ํฐํฐ๋ฅผ ์ฐ๊ฒฐํ ๋ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค.
@Entity
public class User {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<UserMessage> messageList = new ArrayList<UserMessage>();
}
JPQL์ ํตํด ์ญ์
๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ์ HQL(๋๋ JPQL) ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๋ง์ง๋ง์ executeUpdate() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค . ๊ทธ๋ ์ง ์์ผ๋ฉด Hibernate๊ฐ ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ ์์ฑํ๊ณ ์ญ์ ๋์ง ์์ต๋๋ค.
์:
User user = new User();
session.persist(user); // add an object to the database
session.flush();
session.clear(); // close the session
session.createQuery("delete from User where id = :id")
.setParameter("id", user.getId())
.executeUpdate();
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํด๋ ๊ธฐ์กด Entity ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
NativeQuery๋ฅผ ํตํ ์ญ์
๋ง์ฐฌ๊ฐ์ง๋ก NativeQuery๋ฅผ ์ญ์ ํ๊ณ ํธ์ถํ ์ ์์ต๋๋ค.
์:
User user = new User();
session.persist(user); // add an object to the database
session.flush();
session.clear(); // close the session
session.createNativeQuery("DELETE FROM user WHERE id = :id")
.setParameter("id", user.getId())
.executeUpdate();
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ์กด ์ํฐํฐ ๊ฐ์ฒด์ ์ด๋ค ์์ผ๋ก๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ผ์ ์ญ์
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๋์ ๋จ์ํ ์ญ์ ๋ ๊ฒ์ผ๋ก ํ์ํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ฐ์ดํฐ๋ ๋ค์ํ ์๋๋ฆฌ์ค์ ์ฐธ์ฌํ ์ ์์ต๋๋ค. ์ฒซ์งธ, ์ด๋ฌํ ์ญ์ ๋ ์ฝ๊ฒ ๋๋๋ฆด ์ ์์ต๋๋ค. ๋ผ์ธ์ ๋ค์ ๋ผ์ด๋ธ๋ก ํ์ํ ์ ์์ต๋๋ค.
๋์งธ, ์๋ฒ์ ๋์์ด ๋ฒ๋ฅ ๋ฑ์ ์ํด ๊ท์ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์๊ฒฉ ๋ฐ์ดํฐ๋ฅผ "์์นด์ด๋ธ"ํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ๋ ๊ฒ์ผ๋ก ํ์ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์์์ ์ ์ ์์ต๋๋ค. Hibernate๋ ์ฌ์ ํ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ ๋ ฌํ ๋ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ Hibernate์ ์ ์์๋ ๊ฐ์ฒด๋ฅผ ํ์ฑ ์ํ๋ก ํ์ํ ์ ์๋ ํน์ ์ฃผ์์ ๊ณ ์ํ์ต๋๋ค. ์:
@Entity
@Where(clause = "DELETED = 0") //in all WHEREs "AND DELETED = 0" will be added
public class User {
// mapping fields
@Column(name = "DELETED") // if the value in the DELETED column == 0, then the record is alive, if 1 - dead
private Integer deleted = 0;
//getters and setters
public void softDeleted() {
this.deleted = 1; //mark the post as dead
}
}
๊ฐ์ฒด๋ฅผ ์ญ์ ๋ ๊ฒ์ผ๋ก ํ์ํ๋ ค๋ฉด ๊ฐ์ฒด์์ softDeleted() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค .
User user = new User();
session.persist(user); // add an object to the database
session.flush();
session.clear(); // close the session
user = (User) session.find(User.class, user.getId() ); //receive the object from the database
user.softDeleted(); // mark the object as deleted
session.flush();
session.clear(); // close the session
//this object will no longer reside via Hibernate
GO TO FULL VERSION