I'm new in Hibernate and facing the problem:
@Transactional(readOnly=true)
@Override
public List<User> fetchListUsers() {
return sessionFactory.getCurrentSession().createQuery("select u from User u").list();
}
My 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>
Class with Main:
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);
}
Error stack:
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) ....
My toString from UserMessage
@Override
public String toString() {
return "UserMessage [messageId=" + messageId + ", theMessage="
+ theMessage + ", theUser=" + theUser + "]";
}
My toString from User
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", userPassword=" + userPassword + ", userPriveleges="
+ userPriveleges + ", userEmale=" + userEmale + ", userGender="
+ userGender + ", userMessageList=" + userMessageList + "]";
}
Please help me to understand why I'm having this error. Some time I have failed to lazily initialize a collection of role: demidov.pkg.domain.User.userMessageList, could not initialize proxy - no Session if i switch lazy to true. Please help me to understand what's going on.
Thank you.
The toString()
method for most List
implementations iterates through the List
elements and calls toString()
on them. So calling
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", userPassword=" + userPassword + ", userPriveleges="
+ userPriveleges + ", userEmale=" + userEmale + ", userGender="
+ userGender + ", userMessageList=" + userMessageList + "]";
}
the + userMessageList
is actually calling the toString()
of each UserMessage
which is calling toString()
on each User
, ad nauseam.
Change your toString()
to not print them, or print just some value of them (like an ID).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With