최대 절전 모드 문제에 직면 :봄 + 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이 없습니다. 무슨 일이 일어나는지 이해하게 도와주세요.
감사합니다.
'toString()'메소드를 보여주십시오. –
equals, hashCode, toString 등의 오버라이드 (override)했을 가능성이있는 메소드가이 효과를 발생시키는 순환 관계에 들어가고있는 가능성이 있습니다. 직원이있는 부서와 모든 직원은 부서가 있습니다. 따라서 equals와 hashCode를 사용하면 이러한 유형의 메서드가 끝나지 않고 순환 오버플로 오류가 발생하는 주기적 종속 관계가 발생할 수 있습니다. –