知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

 找回密码
 建立账号
查看: 7421|回复: 6

[求助] Spring 多对一引用另一个对象出错。

[复制链接]
发表于 2007-1-4 17:10:40 | 显示全部楼层 |阅读模式
郁闷的,调的二天的。
JSP页面

      <table  border="1">
       <tr>
           <td width="120" class="tdtitle">标题</td>
           <td width="60" class="tdtitle">发布人</td>
           <td width="250" class="tdtitle">内容</td>
           <td width="80" class="tdtitle">操作</td>
        </tr>
        <%
           List msgs=(List)request.getAttribute("msgs");
           
           for(int i=0;i<msgs.size();i++)
           {
             Message msg=(Message)msgs.get(i);
            
         %>
          <tr>
            <td><%=msg.getTitle()%></td>
            <td><%=msg.getUserinfo().getName()%></td> //执行到这出错 !!注:Message中有一个Userinfo 属性对象  
            <td><%=msg.getContent()%></td>
            <td>
              修改
            </td>
          </tr>
         <%
          }
          %>
    </table>

Action 文件
       
        public ActionForward loginin(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response) {
                LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
               
                Userinfo u=getUserService().getUser("name", loginForm.getName());
                if (u==null)
                {
                        System.out.println("用户不存在!");
                        return mapping.getInputForward();
                }
               
                if(!u.getPassword().equals(loginForm.getPassword()))
                {
                        System.out.println("密码错误!");
                        return mapping.getInputForward();
                }
               
                List msgs=getMessageService().getMessages(); //得到所有留言信息
                            request.setAttribute("msgs", msgs);
                return mapping.findForward("messagelist");
        }

applicationContext.xml 文件

        <bean id="UserService"
                class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
                abstract="false" singleton="true" lazy-init="default"
                autowire="default" dependency-check="default">
                <property name="transactionManager">
                  <ref local="myTransactionManager"/>
                </property>
                <property name="target">
                  <ref local="UserTarget"/>
                </property>
               
                <property name="transactionAttributes">
                  <props>
                     <prop key="save*">
                       PROPAGATION_REQUIRED
                     </prop>
                     <prop key="get*">
                       PROPAGATION_REQUIRED
                     </prop>
                  </props>
                </property>
               
        </bean>
       
        <bean id="UserTarget"
                class="org.message.service.impl.UserDAOServiceImpl" abstract="false"
                singleton="true" lazy-init="default" autowire="default"
                dependency-check="default">
                <property name="userDAO">
                  <ref local="UserDAO"/>
                </property>
        </bean>
       
       
        <bean id="UserDAO" class="org.message.dao.impl.UserDAOImpl"
                abstract="false" singleton="true" lazy-init="default"
                autowire="default" dependency-check="default">
                <property name="sessionFactory">
                        <ref bean="sessionFactory" />
                </property>
        </bean>
       
       
       
        <bean id="MessageService"
                class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
                abstract="false" singleton="true" lazy-init="default"
                autowire="default" dependency-check="default">
                <property name="transactionManager">
                  <ref local="myTransactionManager"/>
                </property>
                <property name="target">
                  <ref local="MessageTarget"/>
                </property>
               
                <property name="transactionAttributes">
                  <props>
                    <prop key="save*">
                      PROPAGATION_REQUIRED
                    </prop>
                    <prop key="get*">
                      PROPAGATION_REQUIRED,readOnly
                    </prop>
                    <prop key="update*">
                      PROPAGATION_REQUIRED
                    </prop>
                    <prop key="delete*">
                      PROPAGATION_REQUIRED
                    </prop>
                  </props>
                </property>
        </bean>
       
        <bean id="MessageTarget"
                class="org.message.service.impl.MessageDAOServiceImpl"
                abstract="false" singleton="true" lazy-init="default"
                autowire="default" dependency-check="default">
                <property name="messageDAO">
                  <ref local="MessageDAO"/>
                </property>
        </bean>
       
       
        <bean id="MessageDAO" class="org.message.dao.impl.MessageDAOImpl"
                abstract="false" singleton="true" lazy-init="default"
                autowire="default" dependency-check="default">
                <property name="sessionFactory">
                        <ref bean="sessionFactory" />
                </property>
        </bean>

Message.hbm.xml 文件

<hibernate-mapping>
    <class name="org.message.model.Message" table="MESSAGE" >
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid.hex" />
        </id>
        <many-to-one name="userinfo" class="org.message.model.Userinfo" fetch="select" lazy="false">
            <column name="USER_ID" length="32" />
        </many-to-one>
        <property name="title" type="java.lang.String">
            <column name="TITLE" length="32" not-null="true" />
        </property>
        <property name="content" type="java.lang.String">
            <column name="CONTENT" length="2000" />
        </property>
    </class>
</hibernate-mapping>


Userinfo.hbm.xml 文件


<hibernate-mapping>
    <class name="org.message.model.Userinfo" table="USERINFO" >
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid.hex" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="32" not-null="true" unique="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="32" not-null="true" />
        </property>
        <set name="messages" inverse="true" lazy="false" cascade="save-update">
            <key>
                <column name="USER_ID" length="32" />
            </key>
            <one-to-many class="org.message.model.Message" />
        </set>
    </class>
</hibernate-mapping>



出错如下


org.apache.jasper.JasperException
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
        org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:386)
        org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229)
        org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
        org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause

java.lang.NullPointerException
        org.apache.jsp.messagelist_jsp._jspService(messagelist_jsp.java:82)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
        org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:386)
        org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229)
        org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
        org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
发表于 2007-1-4 17:43:20 | 显示全部楼层
哈哈。。。这个问题我在点评hibernate2.2时候说过喽。。。

默认情况下一对多映射时候hibernate是不把多的一方数据取来地。。。

你应该在getMessage后用一下message.getUserInfors()这样hibernate才取多的一方。取完直接把一的一方放入request的属性中就可以了。。。


因为没看到你DAO代码,所以初步推测就是这么回事。。。
我做的使用struts+Hibernate做的。所以看这个spring还真是小晕一下。哈哈。。。

要是说错了请大家指正哦。。。

[ 本帖最后由 adamed 于 2007-1-4 17:50 编辑 ]
 楼主| 发表于 2007-1-4 18:03:53 | 显示全部楼层
下面这个是DAO
public class MessageDAOImpl extends GenericDAOImpl implements IMessageDAO{

       
        public List getMessages()
        {
                final String hsql=" from Message";
                return getHibernateTemplate().executeFind(new HibernateCallback(){

                        public Object doInHibernate(Session session) throws HibernateException, SQLException {
                               
                                Query query=session.createQuery(hsql);
                               
                                return query.list();
                        }
                       
                });
               
                 
        }


}

MessageDAOServiceImpl是业务类
public class MessageDAOServiceImpl implements IMessageDAOService{

        private  IMessageDAO messageDAO;
       
       
        public List getMessages() {
               
                return getMessageDAO().getMessages();
        }



        public IMessageDAO getMessageDAO() {
                return messageDAO;
        }

        public void setMessageDAO(IMessageDAO messageDAO) {
                this.messageDAO = messageDAO;
        }

}
发表于 2007-1-4 20:52:15 | 显示全部楼层
<td><%=msg.getUserinfo().getName()%></td> //执行到这出错 !!注:Message中有一个Userinfo 属性对象  

我看错了。呵呵。。。这个写的没问题啊。。。

我在JAVA项目下模拟了这个程序没有问题啊。。。

你用断点调试下看看哪个变量为空

[ 本帖最后由 adamed 于 2007-1-4 22:44 编辑 ]
 楼主| 发表于 2007-1-4 21:07:50 | 显示全部楼层
TO: adamed
      可以看下Message.hbm.xml 、Userinfo.hbm.xml 这两个文件吧。
      假如要是Set ,请问下一条留言可以由多个人的发吗?
发表于 2007-1-4 22:44:55 | 显示全部楼层
 楼主| 发表于 2007-1-5 10:13:31 | 显示全部楼层
问题已决的。是Message 记录中,少的user_id 字段。
在此感谢陈天河老师。他写的书确实不错,希望他的另一本新书大买。
每次有问必答,不会超过三天。
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2025-5-7 17:03

Powered by Discuz!

© 2001-2025 eimhe.com.

快速回复 返回顶部 返回列表