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