使用Hibernate时,1-N映射的思考
在使用Hibernate的时候,用到了1-N映射,假设有两个表,Brand和Model,Model表中的外键Brand_id是Brand表中的字段id。
那么,在Brand实体中,就会有一个Set字段models,在Model实体中就有一个字段Brand。
按照常理来说,查询Brand的时候就可以把所有属于这个Brand的Model一起查询出来了,查询Model的时候也可以查询到这个Model属于的Brand。那么我在猜想,如果在查询Brand的时候查询Model,在继续在Model中查询Brand,然后循环下去,会不会去出现死循环呢?
Brand<-->Model.
然后我试了下,
Java code
Brand b = testService.findBrand(1); // 查找数据中id=1的Brand数据
Set<Model> s = b.getModels();
String ss = "";
for(Model m : s){
ss = ((Model)((Model)m.getBrand().getModels().iterator().next()).getBrand().getModels().iterator().next()).getName();
}
然后在Model的setBrand方法里加了一句,
Java code
public void setBrand(Brand brand) {
System.out.println("1");
this.brand = brand;
}
按照上面的循环次数,这里应该打印4次1。
但是实际上控制台只打印了两次,我就在想,其实hibernate在查询数据库的时候,每一表只会对应实例化一个实体,当重复查询的时候只会对这个持久类作出查询,而不是在去查询数据库。
而且还有一个很奇妙的现象,在数据库中Model表只有两条记录,当我上面那段循环这样子写的时候,
Java code
ss = ((Model)m.getBrand().getModels().iterator().next()).getName();
查询出来的是第一条记录,然后这样子写的时候,
Java code
ss = ((Model)((Model)m.getBrand().getModels().iterator().next()).getBrand().getModels().iterator().next()).getName();
查询出来的就是第二条记录了,更是因为这个现象,我才有了上面的猜想。。
------解决方案--------------------
已经实例化的,是不会重复读取的。否则A里有B对象,B里有A对象,岂不是死循环了。