강의

멘토링

커뮤니티

Inflearn Community Q&A

gch039151411's profile image
gch039151411

asked

Java ORM Standard JPA Programming - Basics

Proxy

Httpsession 에서 getAttribute 를 이용해 가져올때 타입캐스팅 문제

Written on

·

656

0

안녕하세요.

HttpSession 에서 세션값을 가져올때 프록시 문제가 발생하는 것 때문에 질문을 남깁니다.

현재 Member 라는 Entity에는 '값 타입 컬렉션'이 정의되어 있는 상태입니다.

문제는 이 값타입 컬렉션은 지연로딩이 디폴트값이라서 세션값을 가져올때 Object -> Member 객체로 타입캐스팅 할때 proxy 객체인 상태에서 시도하려고 하여 에러가 발생해버립니다.

이런 상황에서 eager로 설정해주는 방법이 있겠지만 별로 좋지 못한 해결방안이라고 생각되어 어떻게 하면 더 좋은 방법으로 해결할 수 있는지 궁금하여 질문을 드립니다.

감사합니다.

javaJPA

Answer 1

1

yh님의 프로필 이미지
yh
Instructor

안녕하세요. gch03915님

HttpSession은 트랜잭션 범위를 넘어가고 영속성 컨텍스트도 제거됩니다. 따라서 엔티티를 저장하면 안됩니다.

HttpSession에는 엔티티를 보관하면 안되고, DTO로 변환해서 저장해야 합니다.

감사합니다.

gch03915님의 프로필 이미지
gch03915
Questioner

아...

선생님이 말씀하신대로 해결하였습니다 ㅠㅠㅠ 감사합니다.

지금껏 문제가 영속성 컨텍스트에서 get으로 조회한 값을 그대로 HttpSession 에 넣었던 것이 문제였습니다....트랜잭션 범위를 벗어나서 영속성 컨텍스트도 제거되는 바람에

Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception. 이런 에러가 발생했던 것이였네요.

dto객체를 하나 선언해 준 후에 바로 get으로 조회한 값을 넣지 않고 값들을 받아와서 새롭게 생성한 dto 에 넣어주어서 해결할 수 있었습니다.

너무 감사합니다 ㅎㅎ 행복하네요

HttpSession session = request.getSession();
SessionMemberDto memberDto = transferLoginMember(loginMember);
session.setAttribute(SessionConst.LOGIN_MEMBER,memberDto);

 

private SessionMemberDto transferLoginMember(Member loginMember) {
SessionMemberDto memberDto = new SessionMemberDto();
memberDto.setMemberId(loginMember.getMemberId());
Map<Long,MemberStatus> statusMap = new HashMap<>();
for(Map.Entry<Long,MemberStatus> u : loginMember.getMemberStatus().entrySet()){
Long key = u.getKey();
MemberStatus value = u.getValue();
statusMap.put(key,value);
}
memberDto.setMemberStatus(statusMap);
return memberDto;
}
yh님의 프로필 이미지
yh
Instructor

ㅎㅎ 다행입니다^^

gch039151411's profile image
gch039151411

asked

Ask a question