가능한 객체 상태 옵션
알다시피, 객체가 Hibernate에 연결될 때 그 상태는 Persistent 또는 Managed 라고 합니다 . 얼마나 맞습니까? 지속 또는 관리?
가능합니다. JPA 사양에 따르면 객체는 Persist 상태를 가지며 Hibernate 사양에 따르면 해당 상태를 Managed라고 합니다.
Hibernate에서 데이터베이스 작업은 org.hibernate.Session 유형의 객체를 통해 수행됩니다 . JPA에 따르면 클래스는 javax.persistence.EntityManager라고 해야 합니다. 두 유형 모두 인터페이스이기 때문에 이것은 큰 문제가 아닙니다.
org.hibernate.Session 인터페이스는 다음과 같이 선언됩니다.
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
따라서 Session 인터페이스에는 EntityManager 인터페이스 에 있는 모든 메서드가 있습니다 . 그러나 아직 JPA 사양이 없었을 때 이전 버전의 Hibernate에서 물려받은 고유한 기능도 있습니다.
이 전체 상황은 다음과 같이 설명됩니다.
![](https://cdn.codegym.cc/images/article/c4cc3931-5115-471e-aec1-812c863f7c4a/1024.jpeg)
세션 인터페이스에 있는 모든 방법과 작업의 뉘앙스를 살펴보겠습니다.
persist() 메서드의 뉘앙스
개체를 데이터베이스에 저장할 때 두 가지를 기억해야 합니다.
첫째, 개체를 저장하면 결국 SQL 명령(INSERT 또는 UPDATE) 중 하나가 실행됩니다. 둘째, 이러한 작업은 개체의 메서드를 호출한 직후에 발생하지 않습니다.세션, 하지만 트랜잭션을 종료한 후에만 가능합니다.
예를 들어 User 클래스 가 있다고 가정해 보겠습니다 .
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
persist() 메서드를 사용하여 개체를 데이터베이스에 저장해 보겠습니다 .
User user = new User();
user.setName("Kolyan");
session.persist(user);
이 방법의 목적은 새 개체를 데이터베이스에 저장하는 것입니다. 그러한 개체가 아직 없으면 INSERT SQL 메서드를 호출하여 데이터베이스에 추가됩니다 .
객체가 이미 데이터베이스에 있으면 아무 일도 일어나지 않습니다. 그러나 세 번째 경우도 가능합니다. 분리됨 상태의 개체를 데이터베이스에 저장하려는 시도입니다. 이 경우 예외가 발생합니다. 예:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
save() 메서드의 뉘앙스
save() 메서드는 이전 버전에서 현재 Hibernate에 의해 상속되었습니다. 본질적으로 이는 persist() 메소드와 매우 유사하며 INSERT 메소드를 사용하여 테이블에 새 레코드를 추가합니다. 그러나 몇 가지 흥미로운 뉘앙스가 있습니다.
먼저 이 메서드는 개체의 새 ID인 값을 반환합니다 . 이미 알고 있듯이 개체는 일반적으로 데이터베이스에 추가되기 전에 ID가 없으며 데이터베이스에서 이미 할당됩니다. 따라서 세션 개체의 save() 메서드 는 저장된 개체에 할당된 ID를 반환합니다.
중요한! Hibernate ID 명세에 따르면 그것은 단지 숫자가 아니라 어떤 직렬화 가능한 객체도 될 수 있다. 문자열, 숫자, 열거형 등 일반적으로 데이터베이스 테이블의 한 열에 완전히 넣을 수 있는 모든 것이 될 수 있습니다.
save() 메서드에는 직렬화된 결과 유형이 있으므로 해당 결과를 올바른 유형으로 캐스트해야 합니다.
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
또한 save() 메서드는 개체의 Detached 상태인 경우 다른 동작을 합니다. 이러한 객체를 새로운 것으로 간주하고 단순히 다른 항목을 추가합니다.
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
id 및 id2 변수는 다릅니다. 각 save() 작업 에 대해 하나씩 두 개의 레코드가 데이터베이스의 테이블에 추가됩니다 .