이상이있을 경우 수정하십시오.DAO, Spring 및 Hibernate
이제 ORM 템플릿 용 Spring DAO를 사용할 때 @Transactional 특성을 사용하면 메서드 내에서가 아니라 메서드가 호출 될 때 트랜잭션 및/또는 세션을 제어 할 수 없습니다.
지연로드는 리소스를 절약 해줍니다. 데이터베이스에 쿼리하는 횟수가 줄어들어 모든 컬렉션을 앱 메모리에 가져올 수 있습니다.
lazy = false이면 모든 관련 콜렉션이 페치됩니다. 즉, 연결된 세트에 10,000 개의 레코드가있는 경우 효과적이지 않습니다.
이제 사용자 개체를 반환해야하는 DAO 클래스에 메서드가 있습니다. 데이터베이스의 연결된 테이블을 나타내는 컬렉션이 있습니다. ID로 개체를 가져온 다음 컬렉션에 쿼리해야합니다.
Hibernate는 "DAO 메소드가 리턴하는 링크 된 콜렉션에 액세스하려고 할 때 예외적으로 콜렉션을 초기화하지 못했습니다"예외가 발생합니다.
설명해주십시오. 해결 방법은 무엇입니까?
업데이트 : 알겠습니다. DAO는 추상 레이어이므로 "getUserById (Integer id)"메서드는 Object를 반환해야합니다.
어떤 경우에는 User 개체의 이러한 연결된 컬렉션이 필요하고 다른 상황에서는 해당 컬렉션이 필요한 경우 어떻게합니까? getUserByIdWithTheseCollections(), getUserByIdWithOtherCollections() 및 그 방법 안에 당신의 접근 방식을 사용 2) 다른 방법을 만들 = 거짓 1) 지연로드 :
는 두 가지 방법이 있습니까?
내 말은 단지 2 가지 밖에 없으며 더 좋은 점은없는 것입니까?
업데이트 2 : 설명해주십시오. SESSIONFACTORY를 명시 적으로 사용하게하려면 어떻게해야합니까? 실제로 어떻게 보이나요? 우리는 DAO 객체의 인스턴스 인 을 세션 팩토리에 삽입합니다. 그러면 두 개의 결과적으로 DAO에 대한 메서드 호출이 동일한 트랜잭션 내에서 실행됩니다. 어쨌든, DAO는 그것을 사용하는 수업에서 분리됩니다!
논리와 트랜잭션은 DAO 내에 캡슐화됩니다. 맞습니까? BalusC가 지적했듯이
이User user = sessionFactory.getCurrentSession().get(User.class, userId);
user.getLinkedCollection().size();
return user;
, 당신은 Hibernate.initialize()
대신 size()
사용할 수 있습니다 : 당신이 트랜잭션 내에서 여전히있는 동안
@Konrad Garus 질문에 대한 내 포스트 스크립트를 참조하십시오. 여기 텍스트는 읽기 쉽지 않으므로 거기에서 묻습니다. – EugeneP
@EugeneP 업데이트 된 답변보기. –