简体   繁体   English

Hibernate One-To-Many无法初始化集合

[英]Hibernate One-To-Many Could Not Initialise Collection

I have two database tables, User and PageComment. 我有两个数据库表,User和PageComment。 Using Hibernate, I'm trying to store a Set of PageComment objects in the User comment (comments made to that user), by using one-to-many relationship in the hbm XML files. 使用Hibernate,我试图通过在hbm XML文件中使用一对多关系,在User注释(对该用户发表的注释)中存储一组PageComment对象。

The problem is, I seem to be able to retrieve the set from a User object, but as soon as I try to access any of the objects stored within the set, or even access on of the methods included in the set class (ie size()), the JVM throws "org.hibernate.exception.GenericJDBCException: could not initialize a collection". 问题是,我似乎能够从User对象中检索集合,但是一旦我尝试访问集合中存储的任何对象,甚至访问集合类中包含的方法(即大小) ()),JVM抛出“org.hibernate.exception.GenericJDBCException:无法初始化集合”。 I'm at a loss on this one. 我对此感到茫然。

HBM For User Table: 用户表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 For PageComment: HBM For PageComment:

<?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>

I'm trying to test the mapping with this method: 我正在尝试使用此方法测试映射:

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());
}

I spot that there are some problems in the relationship mapping 我发现关系映射存在一些问题

HBM For User Table: 用户表HBM:

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

HBM For PageComment: HBM For PageComment:

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

The value XXXXX represents the column name on the "many" side (ie PageComment table in your case) that associates to its "One" side. XXXXX表示与“One”侧相关联的“many”侧的列名(即您的案例中的PageComment表)。 It should have the same value in both mapping hbm. 它在映射hbm时应该具有相同的值。

Try to change the hbm for user table to: 尝试将用户表的hbm更改为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM