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