1) 映射 T_CUSTOMER DB 表的客户实体类:
@Entity
@Table(name= “T_CUSTOMER”)
public class Customer {
@Id
@Column (name=“cust_id”)
private Long id;
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn (name=“cid”)
private Set<Address> addresses;
…
…
…
}
2) 映射T_ADDRESS DB表的地址实体类:
@Entity
@Table(name= “T_ADDRESS”)
public class Address {
// Fields and Properties
}
考虑这个客户表:
----------------------------------------------------------------------------
| Cust_id | Cust_firstname | Cust_lastname | Cust_email | Cust_mobile |
----------------------------------------------------------------------------
| 101 | XXXX | YYYYY |xxx@xyz.com | 8282263131 |
----------------------------------------------------------------------------
上述客户表有一条 cust_id 为 101 的记录。
现在考虑这个地址表:
----------------------------------------------------------------------------
| id | street | suburb | city | zipcode | cid |
----------------------------------------------------------------------------
| 1 | streetX | AreaY | cityZ | 54726 | 101 |
----------------------------------------------------------------------------
| 2 | streetXA | AreaYB | cityZS | 60660 | 101 |
----------------------------------------------------------------------------
现在当你调用时:
Customer cust = (Customer)session.get(Customer.class, 101);
然后 Hibernate 将触发 SQL 查询,例如:
1). 在 EAGER LOADING 的情况下:
SELECT * FROM T_CUSTOMER cust JOIN T_ADDRESS add ON cust.cust_id=add.cid
即,它将加载与 T_CUSTOMERS 表及其关联表相关的所有数据,在本例中为 T_ADDRESS 表。
2). LAZY LOADING 的情况:
SELECT * FROM T_CUSTOMER WHERE cust_id=101;
因此,它只获取与 T_CUSTOMER 表对应的数据,并使用 @Radim Köhler 上面所说的 T_ADDRESS 表的代理。只有当您调用时,它才会从 T_ADDRESS TABLE 中获取数据:
cust.getAddresses();