SpringData - 对象导航查询

对象导航查询: 查询一个对象的时候,通过此对象查询所有的关联对象.

基于 一对多表操作 的文章, 新建一个测试类:

一查多(根据客户查询客户关联的所有联系人)

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);
}

*** 推荐使用 一对多 查询

猜你喜欢

转载自blog.csdn.net/weixin_42629433/article/details/84816054
今日推荐