您好我有一个具有复合键和关联对象的实体模型。以下是它的 hbm.xml
<hibernate-mapping>
<class name="com.mytrits.admin.Mtmdmsgqna" table="mtmdmsgqna" catalog="mtmdadmin">
<composite-id name="id" class="com.mytrits.admin.MtmdmsgqnaId">
<key-property name="messageId" type="int">
<column name="MessageId" />
</key-property>
<key-property name="qserialNo" type="java.lang.Integer">
<column name="QSerialNo" />
</key-property>
<key-property name="qsenderId" type="java.lang.Integer">
<column name="QSenderID" />
</key-property>
<key-property name="qtext" type="string">
<column name="QText" length="1000" />
</key-property>
<key-property name="aserialNo" type="java.lang.Integer">
<column name="ASerialNo" />
</key-property>
<key-property name="asenderId" type="java.lang.Integer">
<column name="ASenderID" />
</key-property>
<key-property name="atext" type="string">
<column name="AText" length="1000" />
</key-property>
</composite-id>
<many-to-one name="mtmduser" class="com.mytrits.admin.Mtmduser" update="false" insert="false" fetch="select">
<column name="QSenderID" />
</many-to-one>
<many-to-one name="mtmdmessages" class="com.mytrits.admin.Mtmdmessages" update="false" insert="false" fetch="select">
<column name="MessageId" not-null="true" />
</many-to-one>
</class>
我正在使用 namedQuery 获取列表,下面是查询
<query name="getQNAforMsg">
<![CDATA[from Mtmdmsgqna where messageId = :msgId order by qserialNo, aserialNo]]>
</query>
在我的托管 bean 中,我试图遍历列表但得到 NullPointerException。实体列表的 size() > 0,但是当我尝试访问该对象(在同一个会话中)时,它失败并给了我一个 NullPointerException。从列表中获取的初始对象本身为 NULL。下面是我的 bean 代码
private void buildQATree() {
try {
MtmdmsgqnaHome qnasHome = new MtmdmsgqnaHome();
HibernateUtil.beginTransaction();
qnaList = qnasHome.findQNAbyMsg(messageId.intValue());
Iterator it = qnaList.iterator();
while (it.hasNext()) {
Mtmdmsgqna mqna = (Mtmdmsgqna) it.next();
mqna.getId().getMessageId();
System.out.println("Success");
}
HibernateUtil.commitTransaction();
} catch (Exception ex) {
if (HibernateUtil.isTransactionActive()) HibernateUtil.rollbackTransaction();
log.error("Exception fetching Entity Types"+ex);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Getting Message Detail", "Error Getting Message Detail"));
}
}
我在项目的另一部分有类似的案例,但那里的类似代码没有问题。我不确定这里有什么问题。我也尝试了以下方法进行迭代,但遇到了同样的问题。
/*
for (Mtmdmsgqna mqna : qnaList) {
Hibernate.initialize(mqna);
Hibernate.initialize(mqna.getId());
Hibernate.initialize(mqna.getMtmduser());
}
*/
/*
for (int i = 0; i < qnaList.size(); i++) {
Hibernate.initialize(qnaList.get(i));
Hibernate.initialize(qnaList.get(i).getId());
Hibernate.initialize(qnaList.get(i).getMtmduser());
}
*/
我怀疑,由于复合键本身是一个单独的类,因此不会获取它(因为 Lazy='true')并且由于除了多对一之外我没有任何其他元素,因此没有急切地获取任何内容。因此,即使您在 DB 中有数据,该对象也是空的。由于主实体对象本身为空,因此我无法通过关联对象进一步导航以进行初始化。我怀疑我至少必须急切地获取复合 ID 数据。我是 Hibernate 的新手,找不到在 hbm 文件中的复合键上设置惰性渴望属性的方法。让我知道这是否可能。也让我知道是否还有其他问题。任何帮助都会很棒。