IT虾米网

java之Hibernate 一对多无法初始化集合

银河舰队 2023年11月15日 编程语言 127 0

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

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

用户表的 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 用于 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> 

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

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

请您参考如下方法:

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

用户表的 HBM:

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

HBM 用于 PageComment:

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!