java - Spring+hibernate java.lang.StackOverflowError

标签 java hibernate nhibernate-mapping

我是 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>

用户消息.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,则没有 session 。请帮助我了解发生了什么。

谢谢。

最佳答案

大多数 List 实现的 toString() 方法遍历 List 元素并调用 toString()在他们。所以调用

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

+ userMessageList 实际上是调用每个 UserMessagetoString() 调用 toString()在每个 User 上,令人作呕。

将您的 toString() 更改为不打印它们,或者只打印它们的某些值(例如 ID)。

关于java - Spring+hibernate java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069098/

相关文章:

Java 正则表达式 a-z、A-Z、0-9 和 (.)(_)(-)

java - Jackson 序列化列表实体(将字段添加到根列表)

java - JBOSS 5.1 可以在 JDK 1.4 中运行吗?

hibernate - 如何将继承策略与多个子类层相结合

nhibernate - 即使组件的所有属性都为空,我如何告诉 NHibernate 将组件加载为非空?

java - Elastic APM Java-记录了事务和跨度,但未报告给Elastic APM Server或Kibana

Hibernate.cfg.xml 与 Persistence.xml

java - JPA @ManyToOne - EntityNotFoundException 或 null 值?

NHibernate 使用复合键将两个表连接成一个实体

nhibernate - 使用 NHibernate 将属性映射到另一个表