【问题标题】:Hibernate One-To-Many Could Not Initialise CollectionHibernate 一对多无法初始化集合
【发布时间】:2011-11-11 18:51:54
【问题描述】:

我有两个数据库表,User 和 PageComment。使用 Hibernate,我试图通过在 hbm XML 文件中使用一对多关系,将一组 PageComment 对象存储在用户评论(为该用户制作的 cmets)中。

问题是,我似乎能够从用户对象中检索集合,但是一旦我尝试访问存储在集合中的任何对象,甚至访问集合类中包含的方法(即 size()),JVM 抛出“org.hibernate.exception.GenericJDBCException: could not initialize a collection”。我在这方面不知所措。

用户表的 HBM:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="User" table="user">
    <id name="username" column="Username" type="string">
        <generator class="assigned"></generator>
    </id>
    <property name="password" column="Password" type="string"></property>
    <property name="firstname" column="Firstname" type="string"></property>
    <property name="surname" column="Surname" type="string"></property>
    <property name="email" column="Email" type="string"></property>
    <property name="admin" column="Admin" type="integer"></property>

    <set name="commentsMadeTo" inverse="true">
        <key column="userMadeTo"/>
        <one-to-many class="PageComment"/>
    </set>
</class>
</hibernate-mapping>

用于页面评论的 HBM:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="PageComment" table="PageComment">
    <composite-id>
        <key-property name="userMadeBy" column="UserMadeBy" type="string" />
        <key-property name="userMadeTo" column="UserMadeTo" type="string" />
        <key-property name="time" column="Time" type="integer" />
        <generator class="assigned"></generator>
    </composite-id>
    <property name="commentText" column="CommentText" type="string"></property>

    <many-to-one name="userMadeTo" column="Username" not-null="true" class="User" />
</class>
</hibernate-mapping>

我正在尝试使用此方法测试映射:

Session session = sessionFactory.openSession();
User theUser = (User)session.createQuery("FROM User WHERE Username='Samat'").uniqueResult();
System.out.println("Trying to print out all comments made to 'Samat'");
Set<PageComment> theComments = theUser.getCommentsMadeTo();
for(PageComment p: theComments){
    System.out.println(p.getAllData());
}

【问题讨论】:

  • 您可能需要显示完整的堆栈跟踪,尤其是 GenericJDBCException 的根本原因。

标签: java sql xml hibernate orm


【解决方案1】:

我发现关系映射存在一些问题

用户表的 HBM:

 <set name="commentsMadeTo" inverse="true">
        <key column="XXXXXXXX"/>
        <one-to-many class="PageComment"/>
  </set>

用于页面评论的 HBM:

<many-to-one name="userMadeTo" column="XXXXXXX" not-null="true" class="User" />

XXXXX 表示与“一”侧相关联的“多”侧(即您的情况下为 PageComment 表)上的列名。它在两个映射 hbm 中应该具有相同的值。

尝试将用户表的 hbm 更改为:

<set name="commentsMadeTo" inverse="true">
    <key column="Username"/>
    <one-to-many class="PageComment"/>
</set>

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2021-06-15
    • 2021-03-13
    • 2017-08-30
    相关资源
    最近更新 更多