get() 메서드

ID(또는 기본 키)로 개체를 가져오려는 경우 Hibernate에는 이를 위한 세 가지 방법이 있습니다.

  • 짐()
  • 얻다()
  • 찾다()

그들은 같은 일을 하지만 뉘앙스가 있습니다. get() 메서드 의 일반적인 형식은 다음과 같습니다.

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

get() 메서드는 반환해야 하는 개체의 ID(기본 키)를 두 번째 매개 변수로 사용합니다. 그런 다음 데이터베이스에서 해당 개체를 로드하고 반환합니다. 예:

User user = session.get(User.class, 2);

이 ID를 가진 레코드가 데이터베이스에서 발견되지 않으면 메서드는 null을 반환합니다.

load() 메서드

객체를 로드하는 두 번째 메서드는 load() 메서드입니다 . load() 메서드 의 일반 형식은 동일합니다.

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

그러나 그 동작은 get() 메서드와 다릅니다 .

첫째, 이 메서드는 실제 개체가 아니라 프록시인 가상 스텁을 반환합니다.

둘째, load() 메서드를 사용할 때 데이터베이스에 해당 항목이 있는지 여부를 확인하지 않습니다. 대신 Hibernate는 전달된 ID로 프록시 객체를 즉시 생성하고 반환합니다.

셋째, 데이터베이스에 대한 모든 작업은 프록시 개체의 메서드를 호출할 때 발생합니다. 예를 들어 getName() 메서드를 호출하려고 하면 데이터베이스에 대한 첫 번째 호출이 발생합니다. 예:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

데이터베이스에 객체가 있는지 확인하는 데 load() 메서드를 사용해서는 안 됩니다. 단순히 이를 표시하지 않습니다. 또한 null과 같은 유효하지 않은 ID를 전달하면 단순히 null을 반환합니다.

find() 메소드

find() 메소드는 JPA 표준에서 세션 인터페이스 로 전달되었습니다. 그리고 아시다시피 이 표준은 메서드의 시그니처를 설명할 뿐만 아니라 동작을 규제합니다.

이 메서드는 get() 메서드 와 똑같이 작동합니다 . 전달된 키로 개체를 찾지 못한 경우 메서드는 단순히 null을 반환합니다.

User user = session.find(User.class, -2); //method will return null

새로고침() 메서드

데이터베이스에서 객체를 로드하는 것과 관련된 또 다른 유용한 방법은 refresh() 방법입니다 .

전달된 객체를 기반으로 데이터베이스의 데이터를 업데이트한 persist() 메서드를 기억하십니까 ? 따라서 refresh() 메서드는 정반대로 작동합니다. 즉, 데이터베이스의 데이터를 기반으로 기존 개체를 업데이트합니다.

이 동작은 예를 들어 데이터베이스에 개체를 쓸 때 작성된 데이터를 수정하는 다양한 저장 프로시저가 호출되는 경우에 필요합니다.

이러한 경우 개체가 변경되었을 가능성이 있는 경우 데이터베이스에서 개체를 다시 읽는 것이 유용할 수 있습니다. 예:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object