我正在使用 Hibernate 3.6
User 是一个实体类
Contact 是一个实体类
User 有一个 Set<Contact>
关系是单向的,并且映射为一对多。
我已经尝试了以下延迟加载和获取组合。这是我的理解和实际结果的列表
使用 session.get(User.class, <some userId>) 或 session.load(User.class, <some userId>)
lazy fetch result
* true join ignores lazy loading
* 1 select for retrieving the User and his contacts with a left outer join
* select 1 select for a User record
* 1 select for all contacts of the user
* subselect 1 select for a User record
* 1 select for all contacts of the user
* false join 1 select for retrieving the User and his contacts with a left outer join
* select 1 select for a User record
* 1 select for all contacts of the user
* subselect 1 select for a User record
* 1 select for all contacts of the user
使用 session.createQuery(来自用户)
lazy fetch result
* true join 1 select for all User records
* 1 select for each User record to retrieve their contacts
* respect lazy loading
* probable n + 1
* select 1 select for all User records
* 1 select for each User record to retrieve their contacts
* probable n + 1
* subselect 1 select for all User records
* 1 sub-select to retrieve all contact records in one go
* false join 1 select for all User records
* 1 select for each User record to retrieve their contacts
* probable n + 1
* select 1 select for all User records
* 1 select for each User record to retrieve their contacts
* probable n + 1
* subselect 1 select for all User records
* 1 sub-select to retrieve all contact records in one go
以下是我的几个问题:
- 我的理解正确吗?
- 使用 session.get() 当 lazy=true, fetch=subselect 为什么 Hibernate 不执行 subselect ?我想这是因为它绝对没有必要。我对么 ?
- 使用 session.get() when lazy=false, fetch=subselect 为什么 Hibernate 不执行 subselect ?它应该在这里执行一个,但它没有。我想知道为什么 ?
- 使用 session.createQuery() when lazy=true, fetch=join 为什么 Hibernate 延迟加载?session.get() 之前没有这样做
- 使用 session.createQuery() when lazy=false, fetch=join 为什么 Hibernate 不使用 join ?
提前致谢