Hibernate学习笔记(3):典型的1+N问题

一,1+N问题也可以叫N+1问题,什么是1+N问题呢?

如果在一个对象里关联另一个对象,并且fetch = FetchType.EAGER。
比如说ManyToOne关联(OneToMany也存在这种问题,默认是Lazy,fetch = FetchType.EAGER就会出现1+N问题),本来只需要取Many里的对象属性,可是Many里关联的对象都会单独再发一条语句取关联对象的属性。
本来只用发一条就可以查出Many里的对象属性,可是它发了一条语句后,再发N条语句取关联对象的数据。

二,1+N问题的解决方法

1,设置fetch = FetchType.LAZY:在合适的时候才发出语句(按需要发语句)。

2,@BatchSize:在One对象设置(如@BatchSize(size=10))Size后,取出Many里的数据后,再发N/Size条语句取关联对象的数据,从而达到少发语句的目的。

3,Join Fetch:将Many与One做外连接,因此只要发一条语句就可以查出Many与其相关联的One对象数据,Criteria默认就是这种做法。

a)、from OrderItem oi left join fetch oi.order o

b)、使用QBC的 createCriteria(*.class)执行查询

 

三,如何选择解决办法

1),如果只要用Many里的对象,不用关联对象的属性,那就用方法1解决;
2),如果要Many里的对象属性,也想要关联的对象属性就用方法3解决。

你可能感兴趣的:(Hibernate,1+N问题)