<table border="0" cellspacing="0" cellpadding="0" width="900" class="pic_bg" style="font-size:12px;border-collapse:collapse;border-spacing:0px;color:#404040;font-family:Gulim;line-height:20.003999710083px;"><tbody><tr><td align="left" style="font-size:9pt;padding:0px 8px;"> <table width="100%" style="font-size:inherit;border-collapse:collapse;border-spacing:0px;"><tbody><tr><td style="font-size:9pt;color:#404040;"> <table border="0" cellspacing="0" cellpadding="0" width="100%" align="left" style="font-size:inherit;border-collapse:collapse;border-spacing:0px;table-layout:fixed;"><tbody><tr><td align="left" valign="top" class="han" style="font-size:9pt;color:#505050;font-family:'굴림';">안녕하세요. 하이버네이트+spring을 하고있는데,<br><br>MVC패턴부터 하이버네이트 사용까지 아직 미숙합니다..ㅠ<br>이런 제가 사용하는 방식이 맞는 방식인지, 아니면 잘못된 방식인지 알고싶어서 질문올립니다.<br><br><br><br><br>제가 읽은 책에서는<br><br>Controller : 리퀘스트 처리<br>Service+Transaction : 데이터 읽기 및 정보 합산<br>Dao : CRUD<br><br><br>이렇게 하라고 하더라고요. (제가 잘못 이해했을수도있지만..)<br><br><br><br><br><br>그런데 하이버네이트 릴리즈모드를 after_transaction으로해서 그런지 문제가 좀 생겨서요. (on_close나 default옵션에서도 똑같더군요;)<br><br><br>/* 어노테이션 및 코드는 문법과관계없습니다.. */<br>------ TestSession -------<br>public class TestSession {<br><br> @Eager<br> public Account getAccount(){<br> return ...;<br> }<br>}<br><br>----- Account ----------<br>public class Account {<br> @ManyToMany Lazy<br> public List getFriendList(){<br> return ...;<br> }<br>}<br><br>도메인은 이렇고요.<br><br><br><br><br><br>---- Controller ---------- No Transaction<br>public void controller(){<br><br> TestSession test = sessionService.getSession(request,response); // DB에서 세션에 연결된 정보를 불러와서,<br><br> test.getAccount().getFriendList().get(0); // lazy인 리스트를 읽는 시나리오입니다.<br><br>}<br><br><br>---- Session Service ------------ Transaction<br>public TestSession getSession() {<br><br> db조회 <br> hibernate에서 testSession을 만들면서 eager로 Account를 불러옴<br> return 세션<br><br>}<br><br><br>--------------------------------------<br><br><br>이런식으로 작성했을 경우. <br><br>릴리즈모드가 after_transaction이기 때문에, <br>Controller에서 Lazy nosession예외가 나오더라고요.<br>(그런데 on_close나 default에서도 예외가 ;; 나오더군요;; on_close는 당연히 after_transaction의 반대이니 릴리즈가 안될거라고 생각했네요..)<br><br>그래서 여러가지 테스트를 해보니, Transaction을 빠져나오면서 ProxyList에 저장된 세션이 삭제되나보더군요.<br><br>그래서 이걸 StackOverflow에 질문했더니, "너는 하이버네이트를 잘 이해하지 못한 것 같다"라는 대답을 들었습니다. ㄷㄷ;<br>그런데 질문을 다시해보니 이번엔 네가 무슨질문을하는지 모르겠다는겁니다.. 제가 영어능력이 딸리는데 후회를하며.. <br><br>Transaction내에서 모든걸 처리하기위해 아래와 같은 대안을 만들었습니다.<br><br><br><br><br>---- Controller ---------- No Transaction<br>public void controller {<br><br> service.procIndex(request,response);<br><br>}<br><br><br>---- Session Service ------------ Transaction<br>public void procIndex () {<br> TestSession test = getSession(request,response);<br><br> test.getAccount().getFriendList().get(0);<br>}<br><br>public TestSession getSession() {<br><br> db조회 <br> hibernate에서 testSession을 만들면서 eager로 Account를 불러옴<br> return 세션<br><br>}<br><br><br><br><br><br>이런식으로 쓰고있어요.<br><br><br>그런데 이 사용법이 맞는지 아닌지도 햇갈리고요..; <br><br><br><br>Controller에 Transaction을 붙이는 방법도 있겠지만, 원칙에 어긋나는 것 같고요.<br><br><br>제가 쓰고 있는 방식이 맞는건지, 아니면 다른 방식을 써야하는건지 조언좀 해주실 수 있을까요?</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table><br>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.