休眠 - 一对多

时间:2013-04-24 10:25:32

标签: spring hibernate session collections one-to-many

欢迎,

我使用property-ref将此外键与我的类的其他列而不是主键相关联。主键以外的列不是唯一的。现在,当我尝试获取此集合时,我得到了异常:

org.hibernate.HibernateException: collection is not associated with any session

数据库:

T_GI_ALARM
-ALARM_ID (PK)
-METHOD_PARAM_NR (FK)

T_QC_METHOD_IN
-METHOD_IN_ID (PK)
-METHOD_PARAM_NR

结构:

public class Alarm implements Serializable {
        private static final long serialVersionUID = 1L;

        private Integer id; 
        private Set <QCMethodIN> methodINList = new HashSet <QCMethodIN>(0);
}

public class QCMethodIN implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer id;
    private Integer methodNr;

}

映射:

<hibernate-mapping>
    <class name="gestint.data.model.Alarm" 
        table="DWH1.T_GI_ALARM">
        <id name="id" type="java.lang.Integer">
            <column name="ALARM_ID" />            
            <generator class="assigned" />            
        </id>

        <property name="qcMethode" type="java.lang.Integer">
            <column name="METHOD_PARAM_NR" not-null="true" />
        </property>   
        <set name="methodINList" table="DWH1.T_QC_METHOD_IN" inverse="true" lazy="false" fetch="select">
            <key property-ref="qcMethode">
                <column name="METHOD_PARAM_NR" not-null="false" />
            </key>
            <one-to-many class="gestint.data.model.QCMethodIN" />        
        </set>

</hibernate-mapping>

<hibernate-mapping>
    <class name="gestint.data.model.QCMethodIN" 
        table="DWH1.T_QC_METHOD_IN">
        <id name="id" type="java.lang.Integer">
            <column name="METHOD_IN_ID" />            
            <generator class="assigned" />            
        </id>    
        <property name="methodNr" type="java.lang.Integer">
            <column name="METHOD_PARAM_NR" not-null="true" />
        </property>          

    </class>
</hibernate-mapping>

我从hibernate加载数据(会话由spring设置),如下所示:

public List<Alarm> listAll() {      
    return this.sessionFactory.getCurrentSession().createQuery("from Alarm").list();
}

当我对外国人Key有不同的值时,一切都有效,例如:

T_GI_ALARM
ID  METHOD_PARAM_NR
10021   79
10022   80
10020   91

T_QC_METHOD_IN
METHOD_IN_ID    METHOD_PARAM_NR
1   79
2   80
3   91 

但是当我对外国人Key有一个相同的值(例如T_GI_ALARM上的值为79):

T_GI_ALARM
ID  METHOD_PARAM_NR
10021   79 <--!!
10022   80
10020   79 <--!!

T_QC_METHOD_IN
METHOD_IN_ID    METHOD_PARAM_NR
1   79 <--is call 2 times
2   80
3   91

我收到此错误:

org.hibernate.HibernateException: collection is not associated with any session

我真的不明白发生了什么,我想是因为我们没有具有唯一ID的对象。 ?!?

1 个答案:

答案 0 :(得分:0)

您应该在QCMethodIN类中设置 methodINList ,因为您的Alarm类与QCMethodIN有关系,因此它是QCMethodIN和Alarm之间的一对多关系。

相关问题