merge() 메서드의 뉘앙스

데이터베이스에 이미 저장된 개체를 변경하기 위해 Hibernate를 사용하려는 경우 이를 위한 몇 가지 방법도 있습니다.

첫 번째는 전달된 객체를 기반으로 데이터베이스의 정보를 업데이트하는 merge() 메서드 입니다 . 그러면 SQL UPDATE 쿼리가 호출됩니다. 예:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

여기에는 몇 가지 중요한 뉘앙스가 있습니다.

먼저 merge() 메서드는 업데이트된 객체인 결과를 반환합니다. 이 개체는 지속 상태를 가지며 세션 개체에 연결됩니다. merge() 메서드 에 전달된 개체는 변경되지 않습니다.

user와 user2 사이에 차이가 없는 것처럼 보일 수 있지만 그렇지 않습니다. POJO 객체를 merge() 메서드 에 전달할 수 있으며 결과적으로 메서드는 프록시를 반환할 수 있습니다(Hibernate 설정에 따라 다름). 따라서 merge() 메서드는 전달된 객체를 변경하지 않는다는 점만 기억하세요.

둘째, merge() 에 전달된 객체가 임시 상태(그리고 ID가 없음)이면 데이터베이스에 별도의 줄이 생성됩니다. 즉, persist() 명령이 실행됩니다 .

셋째, 세션에 이미 연결된 객체(Persist 상태)가 merge() 메서드에 전달되면 아무 일도 일어나지 않습니다. 메서드는 단순히 동일한 객체를 반환합니다. 왜? 트랜잭션이 커밋되면 어쨌든 데이터가 데이터베이스에 기록되기 때문입니다.

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

변경 후 매번 개체를 저장할 필요가 없습니다. 이 개체가 Persist 상태에 있으면 Hibernate가 모든 작업을 자체적으로 수행합니다. "베이스에 부착된" 개체를 변경하면 모든 변경 사항이 베이스에 기록됩니다.

update() 메서드의 뉘앙스

Hibernate는 또한 save() 메소드 처럼 이전 버전에서 상속된 update() 메소드를 가지고 있습니다. 이 방법을 사용하면 이미 저장된 개체의 데이터만 업데이트할 수 있습니다. 그러면 SQL UPDATE 쿼리가 호출됩니다. 예:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

이 메서드는 아무 것도 반환하지 않으며 기존 개체를 변경하지 않습니다.

새 객체에서 이 메서드를 호출하면 예외가 발생합니다.

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

saveOrUpdate() 메서드

JPA가 등장하기 전에는 persist() 메서드 의 기능이 saveOrUpdate() 메서드 에 의해 수행되었습니다 . 그의 임무는 데이터베이스의 기존 개체에 대한 정보를 업데이트하고 없는 경우 새로 만드는 것이었습니다. 이것은 거의 항상 save()update() 메서드 대신 사용됩니다 .

update() 메소드 와 달리 전달된 객체를 변경할 수 있습니다. 예를 들어, 데이터베이스에 저장할 때 할당된 ID로 설정합니다. 예:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

작동 방식:

  • 전달된 개체에 ID가 있으면 UPDATE SQL 메서드가 호출됩니다.
  • 전달된 개체의 ID가 설정되지 않은 경우 INSERT SQL 메서드가 호출됩니다.