드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
hibernate에 대해서 제가 제대로 쓰고 있는건지 궁굼합니다
게시물ID : programmer_6199짧은주소 복사하기
작성자 : S시온스S★
추천 : 0
조회수 : 624회
댓글수 : 2개
등록시간 : 2014/10/27 17:13:12
안녕하세요. 하이버네이트+spring을 하고있는데,
MVC패턴부터 하이버네이트 사용까지 아직 미숙합니다..ㅠ 이런 제가 사용하는 방식이 맞는 방식인지, 아니면 잘못된 방식인지 알고싶어서 질문올립니다.
제가 읽은 책에서는
Controller : 리퀘스트 처리 Service+Transaction : 데이터 읽기 및 정보 합산 Dao : CRUD
이렇게 하라고 하더라고요. (제가 잘못 이해했을수도있지만..)
그런데 하이버네이트 릴리즈모드를 after_transaction으로해서 그런지 문제가 좀 생겨서요. (on_close나 default옵션에서도 똑같더군요;)
/* 어노테이션 및 코드는 문법과관계없습니다.. */ ------ TestSession ------- public class TestSession {
@Eager public Account getAccount(){ return ...; } }
----- Account ---------- public class Account { @ManyToMany Lazy public List getFriendList(){ return ...; } }
도메인은 이렇고요.
---- Controller ---------- No Transaction public void controller(){
TestSession test = sessionService.getSession(request,response); // DB에서 세션에 연결된 정보를 불러와서,
test.getAccount().getFriendList().get(0); // lazy인 리스트를 읽는 시나리오입니다.
}
---- Session Service ------------ Transaction public TestSession getSession() {
db조회 hibernate에서 testSession을 만들면서 eager로 Account를 불러옴 return 세션
}
--------------------------------------
이런식으로 작성했을 경우.
릴리즈모드가 after_transaction이기 때문에, Controller에서 Lazy nosession예외가 나오더라고요. (그런데 on_close나 default에서도 예외가 ;; 나오더군요;; on_close는 당연히 after_transaction의 반대이니 릴리즈가 안될거라고 생각했네요..)
그래서 여러가지 테스트를 해보니, Transaction을 빠져나오면서 ProxyList에 저장된 세션이 삭제되나보더군요.
그래서 이걸 StackOverflow에 질문했더니, "너는 하이버네이트를 잘 이해하지 못한 것 같다"라는 대답을 들었습니다. ㄷㄷ; 그런데 질문을 다시해보니 이번엔 네가 무슨질문을하는지 모르겠다는겁니다.. 제가 영어능력이 딸리는데 후회를하며..
Transaction내에서 모든걸 처리하기위해 아래와 같은 대안을 만들었습니다.
---- Controller ---------- No Transaction public void controller {
service.procIndex(request,response);
}
---- Session Service ------------ Transaction public void procIndex () { TestSession test = getSession(request,response);
test.getAccount().getFriendList().get(0); }
public TestSession getSession() {
db조회 hibernate에서 testSession을 만들면서 eager로 Account를 불러옴 return 세션
}
이런식으로 쓰고있어요.
그런데 이 사용법이 맞는지 아닌지도 햇갈리고요..;
Controller에 Transaction을 붙이는 방법도 있겠지만, 원칙에 어긋나는 것 같고요.
제가 쓰고 있는 방식이 맞는건지, 아니면 다른 방식을 써야하는건지 조언좀 해주실 수 있을까요? |
|
|
댓글 분란 또는 분쟁 때문에
전체 댓글이 블라인드 처리되었습니다.
새로운 댓글이 없습니다.