Let's say you have a collection of Car
objects (database rows), and each Car
has a collection of Wheel
objects (also rows).
(假设您有一个Car
对象(数据库行)的集合,而每个Car
都有Wheel
对象(也行)的集合。)
In other words, Car
→ Wheel
is a 1-to-many relationship. (换句话说, Car
→ Wheel
是一对多关系。)
Now, let's say you need to iterate through all the cars, and for each one, print out a list of the wheels.
(现在,假设您需要遍历所有汽车,并为每辆汽车打印出车轮清单。)
The naive O/R implementation would do the following: (天真的O / R实现将执行以下操作:)
SELECT * FROM Cars;
And then for each Car
:
(然后为Car
:)
SELECT * FROM Wheel WHERE CarId = ?
In other words, you have one select for the Cars, and then N additional selects, where N is the total number of cars.
(换句话说,您对汽车有一个选择,然后有N个附加选择,其中N是汽车总数。)
Alternatively, one could get all wheels and perform the lookups in memory:
(或者,可以让所有的轮子都可以在内存中执行查找:)
SELECT * FROM Wheel
This reduces the number of round-trips to the database from N+1 to 2. Most ORM tools give you several ways to prevent N+1 selects.
(这样可以将到数据库的往返次数从N + 1减少到2。大多数ORM工具都提供了几种防止N + 1选择的方法。)
Reference: Java Persistence with Hibernate , chapter 13.
(参考: Java持久性Hibernate ,第13章。)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…