我是Hibernate的新手并面临这个问题:
@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>
使用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);
}
错误堆栈:
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) ....
来自UserMessage的我的toString
@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 :(得分:5)
大多数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()
的{{1}},UserMessage
在每个toString()
上调用User
,令人作呕。
将toString()
更改为不打印,或只打印一些值(如ID)。