2013-10-09 1 views
1

내가org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 더 Session.After 디버그 조회는 미세하지만

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name = "CNTRY_ID") 
private Country country; 

Country.java 이런 일을 가지고이 관계가있는 클래스 ContactAddress.java이 작동하지 않습니다

ContactAddressAction.java에서

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "CNTRY_ID") 
private Integer id; 

@Column(name = "NM") 
private String name; 

@Column(name = "ISO_CD") 
private String isoCode; 

@Column(name = "SRT_ORDR") 
private Integer sortOrder; 

@OneToMany(mappedBy="country") 
private List<State> states = new ArrayList<State>(); 
나는 방법 저장 호출

public String save() throws Exception { 
    // Add the relationship 
    contactAddress.setAccount(getAccount()); 

    // Is this an update? 
    if (index != null) { 
     getAccount().getContactAddresses().set(index, contactAddress); 
    } else { 

     List<ContactAddress> contactAddressList = getAccount().getContactAddresses(); 
     contactAddressList.add(contactAddress); 
     //getAccount().getContactAddresses().add(contactAddress); 
     getAccount().setContactAddresses(contactAddressList); 



    } 

    return SUCCESS; 
} 

WHI 이 메서드를 호출하면 위의 예외가 발생합니다. 연락처 adrreses 목록은 데이터베이스에 저장되지만 저장 후 즉시 표시되지 않습니다. 내가 코드를 디버깅 변수를 통해 목록 변수를 보면

JSP 코드

또한
c:forEach items="${addresses}" var="address" varStatus="stat"> 
       <s:url id="updateAddressUrl" action="update" namespace="/account/address"> 
        <s:param name="index" value="${stat.index}" /> 
       </s:url> 
       <s:url id="deleteAddressUrl" action="delete" namespace="/account/address"> 
        <s:param name="index" value="${stat.index}" /> 
       </s:url> 
       <tr class="address deletable"> 
        <td>${address.type}</td> 
        <td>${address.primary ? 'Yes' : 'No'}</td> 
        <td>${address.active ? 'Yes' : 'No'}</td> 
        <td>${address.companyName}</td> 
        <td> 
         <v:address value="${address}"/> 
         <hr> 
         <table class="info"> 
          <tr> 
           <th>Best Contact Time:</th> 
           <td>${address.bestContactTime}</td> 
          </tr> 
          <tr> 
           <th>Office Hours:</th> 
           <td> 
            Monday: <span class="value">${address.officeHourMonday}</span>&nbsp; 
            Tuesday:<span class="value">${address.officeHourTuesday}</span>&nbsp; 
            Wednesday:<span class="value">${address.officeHourWednesday}</span>&nbsp; 
            Thursday:<span class="value">${address.officeHourThursday}</span>&nbsp; 
            Friday:<span class="value">${address.officeHourFriday}</span> 
           </td> 
          </tr> 
          <tr> 
           <th>Lunch Time:</th> 
           <td>${address.officeLunchTime}</td> 
          </tr> 
         </table> 
        </td> 
        <td class="actions"> 
         <a href="${updateAddressUrl}" class="popup-link button-link"><strong>Edit</strong></a> 
         <c:if test="${user.primaryAddressManageable}"> 
          <a href="${deleteAddressUrl}" class="deletelink button-link"><strong>Delete</strong></a> 
         </c:if>    
        </td> 
       </tr> 
      </c:forEach> 

는, 그것은 잘 작동하고 저장 한 후 목록을 표시합니다.

것은 내가 구글을 검색 한 후 모든 노력을하지만 누군가가 알려 주시기 바랍니다 helping.Can하지 않은 나는 어디하지 advanve :)에서 correct.Thanks

답변

0

당신이 게으른 초기화 유형이있을 때 오류가 이런 종류의 JPA에서 발생 객체 DemoObject가 이미 목록없이 가져온 때문에

demoObject.getDemoList().add() 

같은 목록을 업데이트하려고하고, JPA 데이터베이스 세션은 이미 폐쇄되었다.

이에 대한 해결 방법은

demoObject.getDemoList().size() 

이 목록을 검색 할 강제로 개체를 쿼리 서비스에 호출된다.

+0

가 작동하는 것 같군 : ( – user2820678

+0

하지만 저장 방법을 변경하지 말고, 검색 방법을 변경하십시오. 개체. 아니면 EAGER – Carlos487

+0

과의 관계를 변경해 테스트 해 볼 수 있습니다. 두 가지 일을 모두 시도했는데 ..하지만 didnt work .. – user2820678

0

web.xml에서 OpenSessionInViewFilter를 사용 했습니까? 당신의 web.xml에

<filter> 
<filter-name>hibernateFilter</filter-name> 
<filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class> 
<init-param> 
    <param-name>sessionFactoryBeanName</param-name> 
    <param-value>sessionFactory</param-value> 
    </init-param> 

</filter> 

<filter-mapping> 
<filter-name>hibernateFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html

또는 자신의 클래스를 생성하고 예를

public class MyFilter extends OpenSessionInViewFilter { 
public void closeSession(Session session, SessionFactory sessionFactory){ 
session.flush(); 
super.closeSession(session,sessionFactory); 
} 

에 대한 OpenSessionInViewFilter를 확장하고 설정 필터 그것은 그나마

<filter> 
    <filter-name>hibernateFilter</filter-name> 
    <filter-class>your class package.MyFilter</filter-class> 
    <init-param> 
     <param-name>sessionFactoryBeanName</param-name> 
     <param-value>sessionFactory</param-value> 
    </init-param> 

</filter> 

<filter-mapping> 
    <filter-name>hibernateFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

오류가 발생합니다. – user2820678

+0

어떤 오류를 게시 할 수 있습니까? 서블릿의 기본에 대한 – ssm

+0

의 Servlet.service()이 예외를 org.springframework.beans.factory.NoSuchBeanDefinitionException을 던졌다 없습니다 : 이름 없음 콩 '을 sessionFactory에'org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition (DefaultListableBeanFactory.java에서 \t을 정의 : 387) – user2820678

관련 문제