2013-09-28 2 views
2

최대 절전 모드 문제에 직면 :봄 + I 최대 절전 모드에 새로 온 사람과 java.lang.StackOverflowError의

@Transactional(readOnly=true) 
@Override 
public List<User> fetchListUsers() { 

    return sessionFactory.getCurrentSession().createQuery("select u from User u").list(); 
} 

내 use.hbm.xml

<hibernate-mapping> 

    <class name="demidov.pkg.domain.User" table="USER_DESC"> 

     <!-- Primary key ID will be generated depends on database configuration --> 
     <id name="userId" column="ID"> 
      <generator class="native"></generator> 
     </id> 

     <property name="userName" column="USER_NAME" unique="true" /> 

     <property name="userPassword" column="USER_PASS" /> 

     <property name="userPriveleges" column="USER_PRIVLG" /> 

     <property name="userEmale" column="USER_EMALE" unique="true"/> 

     <property name="userGender" column="USER_GENDER" /> 


     <!-- User is owner of relationships, all changes on user will effect UserMessage entity --> 
     <set name="userMessageList" inverse="true" lazy="false" fetch="select"> 

      <key> 
       <column name="USER_ID" not-null="true"/> 
      </key> 

      <one-to-many class="demidov.pkg.domain.UserMessage" /> 

     </set> 

    </class> 

</hibernate-mapping> 

UserMessage.hbm.xml

<hibernate-mapping> 


    <class name="demidov.pkg.domain.UserMessage" table="MESSAGES_CONTENT"> 

     <id name="messageId" column="ID"> 
      <generator class="native"></generator> 
     </id> 

     <property name="theMessage" column="MESSAGE" length="400"/> 

     <many-to-one name="theUser" class="demidov.pkg.domain.User" lazy="false" fetch="select" cascade="all"> 
      <column name="USER_ID" not-null="true" /> 
     </many-to-one> 


    </class> 


</hibernate-mapping> 

메인 클래스 :

public static void main(String[] args) { 

    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-context.xml"); 
    GuestBookDAOIF gustDAO = (GuestBookDAOIF) context.getBean("guestBookDAOImpl", GuestBookDAOIF.class); 


    List<User> uList = gustDAO.fetchListUsers(); 

    for(User u : uList) 
     System.out.println(u); 




} 

오류 스택 : 사용자로부터

@Override 
    public String toString() { 
     return "UserMessage [messageId=" + messageId + ", theMessage=" 
       + theMessage + ", theUser=" + theUser + "]"; 
    } 

내 toString UserMessage

에서

Hibernate: select usermessag0_.ID as ID1_0_, usermessag0_.MESSAGE as MESSAGE2_0_, usermessag0_.USER_ID as USER_ID3_0_ from MESSAGES_CONTENT usermessag0_ 
Hibernate: select user0_.ID as ID1_1_0_, user0_.USER_NAME as USER_NAM2_1_0_, user0_.USER_PASS as USER_PAS3_1_0_, user0_.USER_PRIVLG as USER_PRI4_1_0_, user0_.USER_EMALE as USER_EMA5_1_0_, user0_.USER_GENDER as USER_GEN6_1_0_ from USER_DESC user0_ where user0_.ID=? 
Hibernate: select user0_.ID as ID1_1_0_, user0_.USER_NAME as USER_NAM2_1_0_, user0_.USER_PASS as USER_PAS3_1_0_, user0_.USER_PRIVLG as USER_PRI4_1_0_, user0_.USER_EMALE as USER_EMA5_1_0_, user0_.USER_GENDER as USER_GEN6_1_0_ from USER_DESC user0_ where user0_.ID=? 
Hibernate: select user0_.ID as ID1_1_0_, user0_.USER_NAME as USER_NAM2_1_0_, user0_.USER_PASS as USER_PAS3_1_0_, user0_.USER_PRIVLG as USER_PRI4_1_0_, user0_.USER_EMALE as USER_EMA5_1_0_, user0_.USER_GENDER as USER_GEN6_1_0_ from USER_DESC user0_ where user0_.ID=? 
Hibernate: select usermessag0_.USER_ID as USER_ID3_1_1_, usermessag0_.ID as ID1_0_1_, usermessag0_.ID as ID1_0_0_, usermessag0_.MESSAGE as MESSAGE2_0_0_, usermessag0_.USER_ID as USER_ID3_0_0_ from MESSAGES_CONTENT usermessag0_ where usermessag0_.USER_ID=? 
Hibernate: select usermessag0_.USER_ID as USER_ID3_1_1_, usermessag0_.ID as ID1_0_1_, usermessag0_.ID as ID1_0_0_, usermessag0_.MESSAGE as MESSAGE2_0_0_, usermessag0_.USER_ID as USER_ID3_0_0_ from MESSAGES_CONTENT usermessag0_ where usermessag0_.USER_ID=? 
Hibernate: select usermessag0_.USER_ID as USER_ID3_1_1_, usermessag0_.ID as ID1_0_1_, usermessag0_.ID as ID1_0_0_, usermessag0_.MESSAGE as MESSAGE2_0_0_, usermessag0_.USER_ID as USER_ID3_0_0_ from MESSAGES_CONTENT usermessag0_ where usermessag0_.USER_ID=? 
Exception in thread "main" java.lang.StackOverflowError 
    at java.util.HashMap.keySet(HashMap.java:1000) 
    at java.util.HashSet.iterator(HashSet.java:170) 
    at java.util.AbstractCollection.toString(AbstractCollection.java:450) 
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327) 
    at java.lang.String.valueOf(String.java:2854) 
    at java.lang.StringBuilder.append(StringBuilder.java:128) 
    at demidov.pkg.domain.User.toString(User.java:95) 
    at java.lang.String.valueOf(String.java:2854) .... 

내 toString는

@Override 
    public String toString() { 
     return "User [userId=" + userId + ", userName=" + userName 
       + ", userPassword=" + userPassword + ", userPriveleges=" 
       + userPriveleges + ", userEmale=" + userEmale + ", userGender=" 
       + userGender + ", userMessageList=" + userMessageList + "]"; 
    } 

나는이 오류가 있어요 왜 나를 이해하는 데 도움이 바랍니다. 지연 컬렉션을 초기화하지 못했습니다. demidov.pkg.domain.User.userMessageList, 프록시를 초기화 할 수 없습니다. lazy를 true로 설정하면 Session이 없습니다. 무슨 일이 일어나는지 이해하게 도와주세요.

감사합니다.

+0

'toString()'메소드를 보여주십시오. –

+0

equals, hashCode, toString 등의 오버라이드 (override)했을 가능성이있는 메소드가이 효과를 발생시키는 순환 관계에 들어가고있는 가능성이 있습니다. 직원이있는 부서와 모든 직원은 부서가 있습니다. 따라서 equals와 hashCode를 사용하면 이러한 유형의 메서드가 끝나지 않고 순환 오버플로 오류가 발생하는 주기적 종속 관계가 발생할 수 있습니다. –

답변

4

ListList 요소를 반복하고 toString()을 호출합니다. 그래서 + userMessageList 실제로 각 User, 싫증에 toString()를 호출 할 때마다 UserMessagetoString()를 호출

@Override 
public String toString() { 
    return "User [userId=" + userId + ", userName=" + userName 
      + ", userPassword=" + userPassword + ", userPriveleges=" 
      + userPriveleges + ", userEmale=" + userEmale + ", userGender=" 
      + userGender + ", userMessageList=" + userMessageList + "]"; 
} 

를 호출.

변경하여 toString()을 인쇄하지 않거나 일부 값만 인쇄하십시오 (예 : ID).

+1

롬복을 사용하여 동일한 문제가 발생했습니다. 자동화 된 hashCode가 콜렉션에 의해 사용되었으므로 무한 호출이 실행됩니다. –

+0

@BrunoGuerra와 같은 문제가 발생합니까? – mleger45

+0

예 toString과 같은 메서드를 재정의합니다. 기억이 안납니다. 호출의 사이클을 제거하는 것뿐입니다. –

관련 문제