对象导航查询: 查询一个对象的时候,通过此对象查询所有的关联对象.
基于 一对多表操作 的文章, 新建一个测试类:
一查多(根据客户查询客户关联的所有联系人)
1. getOne(Long id) 默认为 延迟加载
@Test
@Transactional //解决在java代码中的no session问题
public void testQuery1() {
//查询id为 1 的客户
Customer customer = customerDao.getOne(1L);
//对象导航查询,此客户下的所有联系人
Set<LinkMan> linkMans = customer.getLinkMans();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
}
2. findOne(Long id) 默认为 立即加载
在一的一方类中配置一对多表关系映射 立即加载(fetch = FetchType.EAGER)
/**
* fetch : 配置关联对象的加载方式
* EAGER :立即加载
* LAZY :延迟加载
*/
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<LinkMan> linkMans = new HashSet<>();
@Test
@Transactional //解决在java代码中的no session问题
public void testQuery2() {
//查询id为 1 的客户
Customer customer = customerDao.findOne(1L);
//对象导航查询,此客户下的所有联系人
Set<LinkMan> linkMans = customer.getLinkMans();
System.out.println(linkMans.size());
}
多查一(根据联系人查询该联系人关联的客户) 默认为 立即加载
可在多的一方类中配置多对一表关系映射 懒加载(fetch = FetchType.LAZY):
@ManyToOne(targetEntity = Customer.class, fetch = FetchType.LAZY)
@JoinColumn(name = "lkm_cust_id", referencedColumnName = "cust_id")
private Customer customer;
@Test
@Transactional // 解决在java代码中的no session问题
public void testQuery3() {
//查询id为 1 的联系人
LinkMan linkMan = linkManDao.findOne(1L);
//对象导航查询所属的客户
Customer customer = linkMan.getCustomer();
System.out.println(customer);
}
*** 推荐使用 一对多 查询