按顺序从懒到积极的四种策略。

  • Lazy:一般人好像只会用这种策略。查询一批Order,只返回Order实例,当访问某个Order的items时,查询某个Order的Items。这种策略会产生著名的N+1查询,比如查询所有Order,再查询它们的Items时,会为每个Order的Items发出一条查询语句。(注意,只查一条Order,然后遍历它的所有item不会N+1)
  • Batch:查询一批Order,只返回Order实例,当访问某个Order的items时,批量查询一定数量Order的Items(如10个Order)。如果需要遍历所有Order的Items,需要N/10+1条语句。当然采用这种模式的前提是认为需要一些,但不是全部的Order的Items.
  • SubSelect:依然在查询一批Order时,只返回Order实例,当访问某个Order的items时,查询所有Order的Items,需要两条语句。适合在不一定需要Items,如果需要就全需要的情况。
  • Eager:只有一条语句,查询时返回Order与Items实例。适合一定全需要Items的情况。

看来Lazy,SubSelect,Eager的情况都很清晰。Batch介于Lazy与SubSelect之间,用得好时也不错。可惜不能在session级动态改变annotation,一设就是全局的了。