关于hibernate 的问题

03-08-28 newpaul
问题 有三个对象 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 不知道那里不对

yehs220
2003-08-28 15:53
看你的ExceptionStack,根本就没到Hibernate一级呀。

newpaul
2003-08-28 17:58
我把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中 不会是要写个类包装一下吧,有没有其他方法

yehs220
2003-08-28 18:57
最好把mapping文件贴出来吧。

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

newpaul
2003-08-28 20:34
<?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>
<p class="indent">

newpaul
2003-08-28 20:35

<?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>
<p class="indent">

newpaul
2003-08-28 20:39
struts action 中request.setattribties("userlist",userlist)
jsp中

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


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

yehs220
2003-08-28 21:28
你的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的那份文档上都有答案的,磨刀不误砍柴工,也许我多嘴了。

yehs220
2003-08-28 21:31
怎么老贴不上去

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

newpaul
2003-08-28 22:00
恩 边做边学吗 那有时间给你一直看文档阿 呵呵

newpaul
2003-08-29 11:03
我添加了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 这样可以 ,没有道理啊

yehs220
2003-08-29 11:24
你的tp.messages属性有没有初始化呀,比如messages=new HashSet();

bruce
2003-08-29 11:46


tp.setMessages(new HashSet());
tp.getMessages().add(ms); 
<p class="indent">

newpaul
2003-08-29 13:02
恩 的确就是这个原因 现在没有这个错误了,但是message还是没有保存到数据库中 topic保存了!

session.save(tp);
session.save(ms);
<p class="indent">


这样也没用

ruilau
2003-08-29 20:58
错误在这里,你的tp还没有持续
tp.getMessages().add(ms);
tp.getMessages()==null

2Go 1 2 下一页