对象导航查询
1、对象导航查询
查询一个对象的同时,通过此对象查询他的关联对象
案例:客户和联系人案例
2、测试案例
測試的模板
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class ObjectQueryTest {
@Autowired
private CustomerDao customerDao;
@Autowired
private LinkManDao linkManDao;
}
2.1、测试对象导航查询
//could not initialize proxy - no Session
//测试对象导航查询(查询一个对象的时候,通过此对象查询所有的关联对象)
@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);
}
}
查看結果:
立即加载配置
/*
* 对象导航查询:
* 默认使用的是延迟加载的形式查询的
* 调用get方法并不会立即发送查询,而是在使用关联对象的时候才会查询
* 延迟加载!
* 修改配置,将延迟加载改为立即加载
* fetch,需要配置到多表映射关系的注解上
* */
@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 : 配置关联对象的加载方式
* EAGER : 立即加载
* LAZY : 延迟加载
* */
@OneToMany(mappedBy = "customer",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private Set<LinkMan> linkMans = new HashSet<LinkMan>();
从联系人对象导航查询他的所属客户
/*
* 从联系人对象导航查询他的所属客户
* * 默认 :立即架子啊
* 延迟加载:
* fetch,需要配置到多表映射关系的注解上
* */
@Test
@Transactional
public void testQuery3(){
LinkMan linkMan = linkManDao.findOne(3l);
Customer customer = linkMan.getCustomer();
System.out.println(customer);
}