2013-09-28 7 views
2

Я новичок в спящий режим и сталкивается с проблемой:Весна + спящий режим 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); 




} 
стек

Ошибка:

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 от UserMessage

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

Мой 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, не удалось инициализировать прокси-сервер - нет сеанса, если я переключу ленивый на true. Пожалуйста, помогите мне понять, что происходит.

спасибо.

+0

Пожалуйста, покажите свой метод 'toString()'. –

+0

Скорее всего, методы, которые вы, возможно, переопределили как равные, hashCode или toString попадают в циклические отношения, которые могут вызвать этот эффект. Как отдел, у которого есть сотрудники, и у каждого сотрудника есть отдел. Таким образом, если вы делаете на них равные и hashCode, вы можете столкнуться с циклическим отношением зависимостей, которое сделает эти типы методов никогда не законченными и не столкнется с ошибками переполнения стека. –

ответ

4

toString() метод для большинства List реализаций Перебирает List элементов и вызывает toString() на них. Так называя

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

+ userMessageList фактически вызов toString() каждого UserMessage который звонит toString() на каждом User, объявления оскомину.

Измените свой toString(), чтобы не печатать их, или печатать только какое-либо их значение (например, ID).

+1

Имейте такую ​​же проблему, используя lombok, с вашей автоматикой, ganerated hashCode использовался в коллекции, так что бесконечные вызовы –

+0

У меня такая же проблема, @BrunoGuerra, вы решили? – mleger45

+0

Да, я переопределяю методы вроде toString, и я не помню, чтобы это вообще было, но просто удалял цикл вызовов –

Смежные вопросы