休眠一对多不能初始化集合 [英] Hibernate One-To-Many Could Not Initialise Collection

查看:86
本文介绍了休眠一对多不能初始化集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



问题是,我似乎能够从User对象中检索集合,但只要尝试访问集合中存储的任何对象,或者甚至访问包含在集合中的方法set class(即size()),JVM会抛出org.hibernate.exception.GenericJDBCException:无法初始化集合。我在这一个损失。



HBM用户表:

 <?xml version =1.0encoding =UTF-8?> 
<!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate映射DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"> ;
< hibernate-mapping>
< class name =Usertable =user>
< generator class =assigned>< / generator>
< / id>
< property name =passwordcolumn =Passwordtype =string>< / property>
< property name =firstnamecolumn =Firstnametype =string>< / property>
< property name =surnamecolumn =Surnametype =string>< / property>
< property name =emailcolumn =Emailtype =string>< / property>
< property name =admincolumn =Admintype =integer>< / property>

< set name =commentsMadeToinverse =true>
< key column =userMadeTo/>
<一对多课程=PageComment/>
< / set>
< / class>
< / hibernate-mapping>

HBM For PageComment:

 <?xml version =1.0encoding =UTF-8?> 
<!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate映射DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"> ;
< hibernate-mapping>
< class name =PageCommenttable =PageComment>
< composite-id>
< key-property name =userMadeBycolumn =UserMadeBytype =string/>
< key-property name =userMadeTocolumn =UserMadeTotype =string/>
< key-property name =timecolumn =Timetype =integer/>
< generator class =assigned>< / generator>
< / composite-id>
< property name =commentTextcolumn =CommentTexttype =string>< / property>

< / class>
< / hibernate-mapping>

我试图用这个方法测试映射:

  Session session = sessionFactory.openSession(); 
User theUser =(User)session.createQuery(FROM User WHERE Username ='Samat')。uniqueResult();
System.out.println(试图打印出所有对'Samat'的评论);
Set< PageComment> theComments = theUser.getCommentsMadeTo();
for(PageComment p:theComments){
System.out.println(p.getAllData());


解决方案

关系映射中的问题

HBM For User Table:

 < ; set name =commentsMadeToinverse =true> 
< key column =XXXXXXXX/>
<一对多课程=PageComment/>
< / set>

HBM For PageComment:

 < many-to-one name =userMadeTocolumn =XXXXXXXnot-null =trueclass =User/> 

XXXXX 代表many一侧的列名称即您的案例中的PageComment表)与其一个方关联。它应该在映射hbm中具有相同的值。



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

 < set name =commentsMadeToinverse =true> 
< key column =用户名/>
<一对多课程=PageComment/>
< / set>


I have two database tables, User and 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.

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 (i.e. size()), the JVM throws "org.hibernate.exception.GenericJDBCException: could not initialize a collection". I'm at a loss on this one.

HBM For User Table:

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

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

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

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 (i.e PageComment table in your case) that associates to its "One" side. It should have the same value in both mapping hbm.

Try to change the hbm for user table to:

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

这篇关于休眠一对多不能初始化集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆