我做的这个SSH,刚开始的时候,只有一个表User,能够正常CRUD,然而我现在又增加了一个成绩表进行一对一关联,结果也要求显示成绩,这个时候就出问题了,查询出来总是空值,
我的User类如下:
private Integer id;
private String username;
private String password;
private String sex;
private Score score;
  //get,set省略,
 Score类如下:
private Integer id;
private Integer score;
private Sshuser user;
 // get,set省略 主键都是ID,并且一对一关联。
 User.hbm.xml如下:
  <hibernate-mapping>
    <class name="com.hibernate.Sshuser" table="sshuser" catalog="ssh">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="30" />
        </property>
        
        <property name="password" type="java.lang.String">
            <column name="password" length="20" />
        </property>
        
        <property name="sex" type="java.lang.String">
            <column name="sex" length="10" />
        </property>
        
        <one-to-one name="score" class="com.hibernate.Score" cascade="all"/>
    </class>
</hibernate-mapping>
Score.hbm.xml如下:
  <hibernate-mapping>
    <class name="com.hibernate.Score" table="score" catalog="ssh">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="foreign" >
             <param name="property">user</param>
            </generator>
        </id>
        
        <property name="score" type="java.lang.Integer">
            <column name="score" />
        </property>      
        <one-to-one name="user" class="com.hibernate.Sshuser" constrained="true" />
    </class>
</hibernate-mapping>
 我的查询是这样用的
  return getHibernateTemplate().find("from com.hibernate.Score a," +
"com.hibernate.Sshuser s where s.id=a.id");
页面显示的代码是:
   <s:iterator value="userList">
         <tr>
             <td><s:property value="id" /></td>
             <td><s:property value="username" /></td>
             <td><s:property value="password" /></td>
             <td><s:property value="score" /></td>
             <td><s:property value="sex" /></td>
             <td><a href='deleteAction.action?id=${id}'>删除</a>
             &nbsp;<a href='EditAction.action?id=${id}'>修改</a></td>
        </tr>
        </s:iterator>applicationContext.xml应该没有问题,太长了,就不发了
现在的问题是,如果只查询一个表,不管是User还是Score,都可以,可是级联起来后,就不行了,我应该如何改,如果还有什么地方不清楚,请说,我再补上来。谢谢

解决方案 »

  1.   

    return getHibernateTemplate().find("from com.hibernate.Sshuser");这样就可以了吧
    <one-to-one name="score" class="com.hibernate.Score" cascade="all"/>
    因为这里你已经设置了one-to-one了,你直接把Sshuser读取来,score就可以直接用了
      

  2.   

    按照老紫竹的做法改了,并在显示成绩的地方改成
    <td><s:property value="score.score" /></td>
    就可以了,CRUD也都可以了,不过还有一个问题,如果我把User和Score放在applicationContext.xml中做成Bean,像这样
       <bean id="User" class="com.hibernate.Sshuser">
       </bean>
       <bean id="Score" class="com.hibernate.Score">
       </bean>然后在类的配置文件中这样写
     <one-to-one name="user" class="User" constrained="true" />
    也就是通过spring来管理Bean,为什么会报以下错误呢?org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource 
    [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table score refers to an unmapped class: User
    Caused by: 
    org.hibernate.MappingException: An association from the table score refers to an unmapped class: User
      

  3.   

    An   association   from   the   table   score   refers   to   an   unmapped   class:   User
    和明显,你的一个Score并没有一个对应的User,检查你的Score数据库的数据吧,有没主的!你没有建立数据库的外键哦!
      

  4.   

    有俩问题
    1.<s:property value="score" /> 此score在User类中是个对象,应改成score.score
    2.你默认用到延迟加载,要用openSessionInView在页面将session打开
      

  5.   

    我才刚学,好象是与数据库表相对应的都应该有个bean且必须有个主键吧,若没主键的话,程序怎样能区分数据呢.
      

  6.   

    检查score 里面的id外键,是不是每个Id在在User里面都有?
    谁让你检查主键了。
      

  7.   

    User表里面有5行数据,score里只有一行,但它的id和User表里的一个id是对应的
      

  8.   

    按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ