문제

API에서 프록시와 관련이있는 것을 볼 수있었습니다. 하지만 프록시에 대한 많은 정보를 찾을 수 없었고 전화의 차이점을 이해하지 못합니다. session.get 그리고 session.load. 누군가 나를 참조 페이지로 설명하거나 안내해 주시겠습니까?

고맙습니다!!

도움이 되었습니까?

해결책

로부터 최대 절전 모드 포럼:

이것은 책에서 동 최대 절전 모드에서 나온 것입니다. 이걸 읽어 ..


식별자 별 객체 검색 다음 최대 절전 모드 Snippet 데이터베이스에서 사용자 객체를 검색합니다.

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

식별자가 클래스의 단일 인스턴스를 고유하게 식별하기 때문에 get () 메소드는 특별합니다. 따라서 응용 프로그램이 식별자를 지속적인 객체의 편리한 핸들로 사용하는 것이 일반적입니다. 식별자에 의한 검색은 객체를 검색 할 때 캐시를 사용할 수 있으며, 객체가 이미 캐시 된 경우 데이터베이스 히트를 피할 수 있습니다. Hibernate는 또한 load () 메소드를 제공합니다.

User user = (User) session.load(User.class, userID);

로드 () 메소드는 더 오래되었습니다. 사용자 요청으로 인해 get ()가 Hibernate의 API에 추가되었습니다. 차이점은 사소한 것입니다.

로드 ()가 캐시 나 데이터베이스에서 객체를 찾을 수없는 경우 예외가 발생합니다. load () 메소드는 NULL을 반환하지 않습니다. 객체를 찾을 수없는 경우 get () 메소드를 반환합니다.

로드 () 메소드는 실제 인스턴스 대신 프록시를 반환 할 수 있습니다. 프록시는 처음으로 액세스 할 때 실제 물체의 로딩을 트리거하는 자리 표시 자입니다. 반면에 get ()는 프록시를 반환하지 않습니다. get ()와 load ()을 선택하는 것은 쉽습니다. 지속적인 객체가 존재하고 존재하지 않는 것으로 확인되면 록 ()가 좋은 옵션입니다. 주어진 식별자에 지속적 인 인스턴스가 있는지 확실하지 않은 경우 get ()를 사용하고 리턴 값을 테스트하여 NULL인지 확인하십시오. Load ()를 사용하면 추가 의미가 있습니다. 응용 프로그램은 데이터베이스에 닿지 않고 지속적인 인스턴스에 유효한 참조 (프록시)를 검색하여 지속적인 상태를 검색 할 수 있습니다. 따라서로드 ()는 캐시 나 데이터베이스에서 지속적인 객체를 찾지 못하면 예외를 던질 수 없습니다. 프록시에 액세스 할 때 예외는 나중에 발생합니다. 물론 식별자별로 객체를 검색하는 것은 임의의 쿼리를 사용하는 것만 큼 유연하지 않습니다.

다른 팁

NHIBERNATE에서 최소한 Session.Get (ID)은 데이터베이스에서 객체를로드하고 Session.Load (ID)는 서버를 떠나지 않고 프록시 객체 만 생성합니다. Pocos (또는 Pojos :)의 다른 게으른로드 속성과 마찬가지로 작동합니다. 그런 다음이 프록시를 객체 자체에 대한 참조로 사용하여 관계를 만들 수 있습니다.

신분증을 유지하는 객체가있는 것처럼 생각하십시오. ID가 필요하면 나머지를로드 할 것입니다. FKS와 같은 관계를 만들기 위해 주변을 전달한다면 ID 만 있으면됩니다.

session.load ()는 데이터베이스에 도달하지 않고 항상 "프록시"(hibernate term)를 반환합니다. 최대 절전 모드에서 프록시는 주어진 식별자 값을 가진 객체이며, 그 속성은 아직 초기화되지 않았으며, 임시 가짜 객체처럼 보입니다. 발견 된 행이 없으면 ObjectNotFoundException이 발생합니다.

session.get ()는 항상 데이터베이스를 누르고 프록시가 아닌 데이터베이스 행을 나타내는 객체 인 실제 개체를 반환합니다. 줄이 없으면 NULL을 반환합니다.

이 방법의 성능도 차이가됩니다. 둘 사이에 ...

한 가지 추가 포인트 ::

객체가 캐시와 데이터베이스에서 찾을 수없는 경우 최대 절전 모드 세션 클래스를 반환합니다. 로드 () 메소드는 캐시와 데이터베이스에서 개체를 찾을 수 없지만 NULL을 반환하지 않으면 ObjectNotFoundException을 던집니다.

"get"대신 "로드"를 사용한 간접적 인 결과 중 하나는 버전 속성을 사용하여 낙관적 잠금이 예상대로 작동하지 않을 수 있다는 것입니다. 로드가 단순히 프록시를 생성하고 데이터베이스에서 읽지 않으면 버전 속성이로드되지 않습니다. 버전은 나중에 객체의 속성을 참조하여 SELECT를 트리거 할 때만로드됩니다. 그 동안 다른 세션은 객체를 업데이트 할 수 있으며 세션에는 낙관적 잠금 확인을 수행하는 데 필요한 원래 버전이 없으므로 세션의 업데이트는 다른 세션의 업데이트를 경고없이 덮어 씁니다.

다음은 동일한 식별자가있는 객체로 작업하는 두 세션 으로이 시나리오를 스케치하려는 시도입니다. DB의 객체의 초기 버전은 10입니다.

Session 1                  Session 2
---------                  ---------
Load object
Wait a while..   
                           Load object
                           Modify object property
                           [triggers db 'select' -
                            version read as 10]
                           Commit
                           [triggers db update,
                            version modified to 11]
Modify object property
  [triggers db 'select' -
  version read as 11]
Commit
  [triggers db update,
  version modified to 12]

우리는 실제로 낙관적 잠금 예외로 세션 1의 커밋을 원하지만 여기서는 성공할 것입니다.

"로드"대신 "get"을 사용하면 문제가 발생합니다. Get은 즉시 선택을 발행하고 낙관적 잠금 확인을 위해 올바른 시간에 버전 번호가로드되기 때문입니다.

또한 하중을 사용하는 동안 객체가 없으면 예외가 발생하므로 조심해야합니다. 우리는 객체가 존재한다고 확신 할 때만 사용해야합니다.

훌륭한 설명이 있습니다 http://www.mkyong.com/hibernate/different-bet-seession-get-and-session-load
session.load () :
데이터베이스에 도달하지 않고 항상 "프록시"(hibernate term)를 반환합니다.
최대 절전 모드에서 프록시는 주어진 식별자 값을 가진 객체이며, 그 속성은 아직 초기화되지 않았으며, 임시 가짜 객체처럼 보입니다.
주어진 ID 값이있는 프록시 객체를 항상 반환 할 것입니다. 심지어 ID 값조차도 데이터베이스에 존재하지 않습니다. 그러나 데이터베이스에서 속성을 검색하여 프록시를 초기화하려고하면 SELECT 문으로 데이터베이스에 도달합니다. 행이없는 경우 ObjectNotFoundException이 던져집니다.
session.get () :
항상 데이터베이스를 누르고 (캐시에서 찾을 수없는 경우) 프록시가 아닌 데이터베이스 행을 나타내는 객체 인 실제 개체를 반환합니다.
줄이 없으면 NULL을 반환합니다.

로드 ()는 캐시 나 데이터베이스에서 객체를 찾을 수 없으며 예외가 발생하고 load () 메소드는 NULL을 반환하지 않습니다.

get () 메소드는 객체를 찾을 수없는 경우 null을 반환합니다. load () 메소드는 실제 인스턴스 인스턴스 대신 프록시를 반환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top