我建了两个表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判断忽略过去,但引起这个结果的具体原因一直不清楚,哪位大虾有这方面的见解,敬请赐教。
<?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判断忽略过去,但引起这个结果的具体原因一直不清楚,哪位大虾有这方面的见解,敬请赐教。
他们之间没代码吗?
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();
}
}
改成<list name="forums" lazy="false" inverse="true" cascade="all">
这样当你b.get(0)时forums就会被初始化了。2. 在b.get(0).getForums()之前可以b.get(0).getForums().size()
这样也会初始化forums
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]]
<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>
<key>
<column name="boardid" />
</key>
<one-to-many class="Forum" />
</set>
<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> 当然,九楼的方法也是可以的。
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。
做一个java文件实时监视着数据库好了
看情况到底如何
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等都是有初始长度的。往里面添加元素的时候,省略了开辟内存空间的步骤,效率会高一些。
<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
你可以试试
[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]]
<key column="boardid" />
<one-to-many class="Forum" />
</set>
Set是支持排序的。hibernate用了一个自己实现的set。
<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>