我建了两个表board和forum,对应的映射文件内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping>
<class name="Board" table="board" lazy="false"> <id name="boardid" type="java.lang.Integer" column="boardid" unsaved-value="0">
<generator class="identity" />
</id> <property name="boardname" type="java.lang.String" column="boardname"
not-null="true" length="50" /> <list name="forums" lazy="true" inverse="true" cascade="all">
<key>
<column name="boardid" />
</key>
<index column="forumid" type="java.lang.Integer" />
<one-to-many class="Forum" />
</list> </class>
</hibernate-mapping>
==================================
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping>
<class name="Forum" table="forum" lazy="false">
<id name="forumid" type="java.lang.Integer" column="forumid" unsaved-value="0">
<generator class="identity" />
</id> <property name="forumname" type="java.lang.String" column="forumname"
not-null="true" length="50" />
<many-to-one name="board" class="Board"
not-null="true">
<column name="boardid" />
</many-to-one>
</class>
</hibernate-mapping>当执行测试类的时候,Board中的forums属性中存在若干null值。
public class test {
public static void main(String[] args) {
Session s=HibernateSessionFactory.getSession();
List<Board> b=s.createQuery("from Board").list();
System.out.println(b.get(0).getForums());
System.out.println(b.get(1).getForums());
System.out.println(b.get(2).getForums());
}
}输出结果:
[null, Forum@131c89c[forumid=1],Forum@1e9c82e[forumid=2], Forum@1554d32[forumid=3], Forum@13f136e[forumid=4]]
[null, null, null, null, null, Forum@a89ce3[forumid=5], Forum@1d439fe[forumid=6], Forum@2b7db1[forumid=7], Forum@148f8c8[forumid=8]]
[null, null, null, null, null, null, null, null, null,Forum@1815338[forumid=9], Forum@17e845a[forumid=10]]
虽然通过!=null判断忽略过去,但引起这个结果的具体原因一直不清楚,哪位大虾有这方面的见解,敬请赐教。

解决方案 »

  1.   

    <one-to-many class="Forum" /> 
    他们之间没代码吗?
      

  2.   

    忘了贴代码了,sorry
    import java.io.Serializable;
    import java.util.List;
    import org.apache.commons.lang.builder.ToStringBuilder;
    public class Board implements Serializable {
        private Integer boardid;
        private String boardname;
        private List forums;
        public Board(String boardname, List forums) {
            this.boardname = boardname;
            this.forums = forums;
        }
        public Board() {
        }    public Integer getBoardid() {
            return this.boardid;
        }    public void setBoardid(Integer boardid) {
            this.boardid = boardid;
        }    public String getBoardname() {
            return this.boardname;
        }    public void setBoardname(String boardname) {
            this.boardname = boardname;
        }    public List getForums() {
            return this.forums;
        }    public void setForums(List forums) {
            this.forums = forums;
        }    public String toString() {
            return new ToStringBuilder(this)
                .append("boardid", getBoardid())
                .toString();
        }
    }================================================
    import java.io.Serializable;
    import org.apache.commons.lang.builder.ToStringBuilder;
    public class Forum implements Serializable {
        private Integer forumid;
        private String forumname;
        private Board board;
        public Forum(String forumname, Board board) {
            this.forumname = forumname;
            this.board = board;
        }    public Forum() {
        }    public Integer getForumid() {
            return this.forumid;
        }    public void setForumid(Integer forumid) {
            this.forumid = forumid;
        }    public String getForumname() {
            return this.forumname;
        }    public void setForumname(String forumname) {
            this.forumname = forumname;
        }    public Board getBoard() {
            return this.board;
        }    public void setBoard(Board board) {
            this.board = board;
        }    public String toString() {
            return new ToStringBuilder(this)
                .append("forumid", getForumid())
                .toString();
        }
    }
      

  3.   

    这个问题有两个方案:1. 将<list name="forums" lazy="true" inverse="true" cascade="all"> 
       改成<list name="forums" lazy="false" inverse="true" cascade="all"> 
       这样当你b.get(0)时forums就会被初始化了。2. 在b.get(0).getForums()之前可以b.get(0).getForums().size()
       这样也会初始化forums
      

  4.   

    没这么简单,我就是写web程序的时候试了上述方法没通过,才写了个测试代码。在测试代码中写入如下代码,结果仍然是错误的(lazy已经改为false):
    Session s=HibernateSessionFactory.getSession();
    List<Board> b=s.createQuery("from Board").list();
    System.out.println(b.get(0).getForums().size());
    System.out.println(b.get(0).getForums());
    System.out.println(b.get(1).getForums());
    System.out.println(b.get(2).getForums());
    结果为:
    5
    [null, Forum@131c89c[forumid=1],Forum@1e9c82e[forumid=2], Forum@1554d32[forumid=3], Forum@13f136e[forumid=4]] 
    [null, null, null, null, null, Forum@a89ce3[forumid=5], Forum@1d439fe[forumid=6], Forum@2b7db1[forumid=7], Forum@148f8c8[forumid=8]] 
    [null, null, null, null, null, null, null, null, null,Forum@1815338[forumid=9], Forum@17e845a[forumid=10]] 
      

  5.   

    下面的配置不知是楼主贴错了还是本来就这样:
    <list name="forums" lazy="true" inverse="true" cascade="all"> 
    <key> 
    <column name="boardid" /> 
    </key> 
    <index column="forumid" type="java.lang.Integer" /> 
    <one-to-many class="Forum" /> 
    </list> 感觉应该是:
    <list name="forums" lazy="true" inverse="true" cascade="all"> 
    <key> 
    <column name="forumid" /> 
    </key> 
    <index column="position" type="java.lang.Integer" /> 
    <one-to-many class="Forum" /> 
    </list> 
      

  6.   

     <set name="forums" inverse="true">
                <key>
                    <column name="boardid" />
                </key>
                <one-to-many class="Forum" />
            </set>
      

  7.   

    刚才有点晕了,只要将:<list name="forums" lazy="true" inverse="true" cascade="all"> 
    <key> 
    <column name="boardid" /> 
    </key> 
    <index column="forumid" type="java.lang.Integer" /> 
    <one-to-many class="Forum" /> 
    </list> 改成:<list name="forums" cascade="all"> 
    <key> 
    <column name="boardid" /> 
    </key> 
    <list-index column="forum_position"/>  
    <one-to-many class="Forum" /> 
    </list> 当然,九楼的方法也是可以的。
      

  8.   

    首先谢谢各位。10楼所说list-index的结果和index一样,9楼的方法是用set,可是我的forum内容需要按forumid排序的,所以必须要用list。改成set确实不存在null,但是没有铺排序,不符合要求。这两个表的结构和关系是这样:
    CREATE TABLE `board` (
      `boardid` int(4) NOT NULL AUTO_INCREMENT,
      `boardname` varchar(50) NOT NULL,
      PRIMARY KEY (`boardid`)
    );
    CREATE TABLE `forum` (
      `forumid` int(4) NOT NULL AUTO_INCREMENT,
      `forumname` varchar(50) NOT NULL,
      `boardid` int(4) NOT NULL,
      PRIMARY KEY (`forumid`),
      KEY `forum_ibfk1` (`boardid`),
      CONSTRAINT `forum_ibfk1` FOREIGN KEY (`boardid`) REFERENCES `board` (`boardid`)
    );
    我用的数据库是mysql。
      

  9.   

    代码冗余正常
    做一个java文件实时监视着数据库好了
    看情况到底如何
      

  10.   

    集合类好像就是这样。如下这段代码:
    public static void main(String[] args) throws Exception {
    List<String> list = new ArrayList<String>();
    for(String temp : list){
    System.out.print(temp);
    }
    }
    把断点放在for那一行,看看内存中的list就明白了。内存中的list的长度是10。
    这是java的一种优化策略。默认new出来的ArrayList或者Map等都是有初始长度的。往里面添加元素的时候,省略了开辟内存空间的步骤,效率会高一些。
      

  11.   

    原因是对象在List中是有顺序的,在xml中
    <list name="forums" cascade="all">
    <key column="boardid"></key>
    <list-index column="position" base="1"></list-index>
    <one-to-many class="Forum" />
    </list>column="position" 就是代表forum对象在List中的位置,
    如果你的数据是通过java代码插入的话,position列会以‘1’的增长方式插入到数据库中,
    你读出来的数据就不会有null,你现在的原因就是数据是手工插入,而且没有定义position列,
    按照上面的添加到对应xml中,用hibernate的自动建表(hibernate.cfg.xml中添加<property name="hbm2ddl.auto">create</property>,但建完后记着改成none),或在建表时加入position字段。
    手工插入数据时,如下
    insert into board value(1,'xx1');
    insert into board value(2,'xx2');
    insert into board value(3,'xx3');insert into forum value(1,'aa1',1,1);
    insert into forum value(2,'aa2',1,2);insert into forum value(3,'aa3',2,1);
    insert into forum value(4,'aa4',2,2);
    insert into forum value(5,'aa5',2,3);insert into forum value(6,'aa6',3,1);
    insert into forum value(7,'aa',3,2);
    在forum的最后一列是postion 如果postion不连续,就会出现null
    你可以试试
      

  12.   

    你的代码加我说得结果是Hibernate: select forums0_.boardid as boardid1_, forums0_.forumid as forumid1_, forums0_.forum_position as forum4_1_, forums0_.forumid as forumid1_0_, forums0_.forumname as forumname1_0_, forums0_.boardid as boardid1_0_ from forum forums0_ where forums0_.boardid=?
    [csdnivoke.Forum@c39a20[forumid=1], csdnivoke.Forum@125fefa[forumid=2], csdnivoke.Forum@186df0f[forumid=3]]
    Hibernate: select forums0_.boardid as boardid1_, forums0_.forumid as forumid1_, forums0_.forum_position as forum4_1_, forums0_.forumid as forumid1_0_, forums0_.forumname as forumname1_0_, forums0_.boardid as boardid1_0_ from forum forums0_ where forums0_.boardid=?
    [csdnivoke.Forum@589e56[forumid=4], csdnivoke.Forum@3411a[forumid=5]]
    Hibernate: select forums0_.boardid as boardid1_, forums0_.forumid as forumid1_, forums0_.forum_position as forum4_1_, forums0_.forumid as forumid1_0_, forums0_.forumname as forumname1_0_, forums0_.boardid as boardid1_0_ from forum forums0_ where forums0_.boardid=?
    [csdnivoke.Forum@472d48[forumid=6]]
      

  13.   

      private Set forums;   <set name="forums" inverse="true" order-by="forumid asc"> 
        <key column="boardid" /> 
        <one-to-many class="Forum" /> 
      </set>
    Set是支持排序的。hibernate用了一个自己实现的set。
      

  14.   

    18楼的应该是正解,我确实是手工建表,手工添加的记录。我把list改成如下方式,结果的get(0)没有null,get(1)以后还是存在null。如果在表中特意增加position列有点画蛇添足的感觉,我再试试支持排序的set。
      

  15.   

    忘贴代码了:
    <list name="forums" cascade="all">
    <key>
    <column name="boardid" />
    </key>
    <list-index column="forumid" base="1"/> <one-to-many class="org.ultimania.model.Forum" />
    </list>
      

  16.   

    解决了,用排序的set,不过还是uitl.Set,再用iterator,谢谢各位了,明天结贴。