关于hibernate 的问题

问题 有三个对象 tracker , topic , message .tracker 和 topic 一对多,topic 和message 一对多;现在需要为 tracker 添加一个主题topic 的同时还要为这个topic添加一个message消息

tk =(Tracker)session.load(Tracker.class,trackerid);
Topic tp=new Topic();
tp.setTopicId(topicid);
tp.setTopicOwner(owner);
tp.setTitle(title);
tp.setTracker(tk);
tp.setState(-1);
tp.setCreatedBy("paul");
tp.setCreatedTime(new Date());
tp.setLastUpdate(new Date());

Message ms=new Message();
ms.setMessageId(new Integer(0));
ms.setCreatedTime(new Date());
ms.setCreatedBy("paul");
ms.setBody(message);
ms.setTopic(tp);

tp.getMessages().add(ms);
tk.getTopics().add(tp);

session.save(tp);

报错:
java.lang.NullPointerException
at com.beaconsystem.catseye3.actions.SaveTopicAction.execute(SaveTopicAction.java:101)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:465)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1422)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:523)


把message那一段 删除后 就可以添加topic 不知道那里不对

看你的ExceptionStack,根本就没到Hibernate一级呀。

我把message那段删除 就可以 但只是添加了 topic 没有添加 message
怎么会是java.lang.NullPointerException这个错

还有 一般Query 返回的是list 和 Iterator
如果 我在 Struts action 中request.setAttribute("userlist",list);

在jsp中<jsp:useBean id="userlist" scope="request" class="java.util.List"/>

他报错 大概就是说list 是个接口 不能实例

怎么把list 和 iterator 返回到jsp中 不会是要写个类包装一下吧,有没有其他方法

最好把mapping文件贴出来吧。

request.setAttribute("userlist",list);是没问题的。


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

<!--
Created by Middlegen Hibernate plugin

http:
//boss.bekk.no/boss/middlegen/
http:
//hibernate.sourceforge.net/
-->

<class
name=
"com.beaconsystem.catseye3.hibs.Message"
table=
"message"
>
<id
name=
"messageId"
type=
"int"
column=
"Message_ID"
>
<generator class=
"assigned" />
</id>
<property
name=
"createdBy"
type=
"java.lang.String"
column=
"Created_By"
not-null=
"true"
length=
"11"
/>
<property
name=
"body"
type=
"java.lang.String"
column=
"Body"
not-null=
"true"
length=
"255"
/>
<property
name=
"createdTime"
type=
"java.sql.Date"
column=
"Created_Time"
not-null=
"true"
length=
"10"
/>

<!-- associations -->
<!-- bi-directional many-to-one association to Topic -->
<many-to-one
name=
"topic"
class=
"com.beaconsystem.catseye3.hibs.Topic"
not-null=
"true"
>
<column name=
"Topic_ID" />
</many-to-one>

</class>
</hibernate-mapping>



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

<!--
Created by Middlegen Hibernate plugin

http:
//boss.bekk.no/boss/middlegen/
http:
//hibernate.sourceforge.net/
-->

<class
name=
"com.beaconsystem.catseye3.hibs.Topic"
table=
"topic"
>
<id
name=
"topicId"
type=
"int"
column=
"Topic_ID"
>
<generator class=
"assigned" />
</id>
<property
name=
"title"
type=
"java.lang.String"
column=
"Title"
not-null=
"true"
length=
"255"
/>
<property
name=
"createdBy"
type=
"java.lang.String"
column=
"Created_By"
not-null=
"true"
length=
"255"
/>
<property
name=
"topicOwner"
type=
"java.lang.String"
column=
"Topic_Owner"
length=
"255"
/>
<property
name=
"state"
type=
"int"
column=
"State"
not-null=
"true"
length=
"11"
/>
<property
name=
"priority"
type=
"java.lang.String"
column=
"Priority"
length=
"255"
/>
<property
name=
"createdTime"
type=
"java.sql.Date"
column=
"Created_Time"
not-null=
"true"
length=
"10"
/>
<property
name=
"lastUpdate"
type=
"java.sql.Date"
column=
"Last_Update"
length=
"10"
/>

<!-- associations -->
<!-- bi-directional one-to-many association to Message -->
<set
name=
"messages"
lazy=
"true"
inverse=
"true"
>
<key>
<column name=
"Topic_ID" />
</key>
<one-to-many
class=
"com.beaconsystem.catseye3.hibs.Message"
/>
</set>
<!-- bi-directional one-to-many association to Tracetopic -->
<!--<set
name=
"tracetopics"
lazy=
"true"
inverse=
"true"
>
<key>
<column name=
"Topic_ID" />
</key>
<one-to-many
class=
"com.beaconsystem.catseye3.hibs.Tracetopic"
/>
</set>-->

<set
name=
"users"
table=
"tracetopic"
>
<key column=
"Topic_ID"/>
<many-to-many class=
"com.beaconsystem.catseye3.hibs.User" column="User_ID"/>
</set>


<!-- bi-directional many-to-one association to Tracker -->
<many-to-one
name=
"tracker"
class=
"com.beaconsystem.catseye3.hibs.Tracker"
not-null=
"true"
>
<column name=
"Tracker_ID" />
</many-to-one>

</class>
</hibernate-mapping>

struts action 中request.setattribties("userlist",userlist)
jsp中


<jsp:useBean id="userlist" scope="request" class="java.util.List"/>

他就报错 说java.util.List是借口不能实例

你的mapping中没有一个cascade="..."

一般好像对于bidirectional reference,
<set>设为cascade="all",或者"save-update"
<many-to-one>设为cascade="save-update",或不设(看具体情况)

如果track和topic中的<set>都设为cascade="all",或者"save-update",那你更本不需要session.save(tp),直接session.commit()就行了。

>把message那一段 删除后 就可以添加topic 不知道那里不对<
看你的程序,好像无论如何,tp总是应该可以insert进去的。
而message是肯定不会insert进去的(没设cascade="all"或"save-update")

><jsp:useBean id="userlist" scope="request" class="java.util.List"/>


他就报错 说java.util.List是借口不能实例 <
====>
<%java.util.List userlist=(java.util.List)request.getAttribute("userlist");%>

btw,我看过你提过的好几个问题,让我觉得你好像对hibernate的很多工作细节都不是很清楚就开始写程序了,其实你提的很多问题在hibernate的那份文档上都有答案的,磨刀不误砍柴工,也许我多嘴了。

怎么老贴不上去

List userlist=(List)request.getAttribute("userlist");

恩 边做边学吗 那有时间给你一直看文档阿 呵呵

我添加了cascade="all" 但 问题依旧存在


<set
name="messages"
lazy=
"true"
inverse=
"true"
cascade=
"all"
>
<key>
<column name=
"Topic_ID" />
</key>
<one-to-many
class=
"com.beaconsystem.catseye3.hibs.Message"
/>
</set>

我看了 是因为tp.getMessages().add(ms); 这一句话的原因 抛出java.lang.NullPointerException 是不是这里的tp有问题,但如果我不是load tracker 加 topic ,topic加message 而是直接load一个topic 加message 这样可以 ,没有道理啊

你的tp.messages属性有没有初始化呀,比如messages=new HashSet();


tp.setMessages(new HashSet());
tp.getMessages().add(ms);

恩 的确就是这个原因 现在没有这个错误了,但是message还是没有保存到数据库中 topic保存了!


session.save(tp);
session.save(ms);

这样也没用

错误在这里,你的tp还没有持续
tp.getMessages().add(ms);
tp.getMessages()==null