Spring WebFlux + JPA学习笔记(二):@OneToOne懒加载与直接加载

项目地址:https://github.com/ludi-jiangtou/spring-learning-example

@OneToOne加载模式对查询Sql的影响

不管是直接加载还是懒加载,SQL语句都是按1+1(查询单条记录)或者1+n(查询n条件记录)的模式执行的。

三个相关联实体类:OneToOneFetchMain、OneToOneFetchLazy、OneToOneFetchEager

package com.wangkong.learning.jpa.domain.fetch;

import lombok.*;
import org.hibernate.annotations.LazyToOne;
import org.hibernate.annotations.LazyToOneOption;

import javax.persistence.*;

/**
 * @author 忘空
 * @version 1.0
 * @date 2019-09-14 16:59
 * 员工表
 */
@Entity
@Table(name = "ONE_TO_ONE_FETCH_MAIN")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = {"oneToOneFetchEager", "oneToOneFetchLazy"})
@EqualsAndHashCode(exclude = {"oneToOneFetchEager", "oneToOneFetchLazy"})
public class OneToOneFetchMain {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "fetch_main_id")
    private Long fetchMainId;

    @Column(name = "fetch_main_code", length = 40, updatable = false, nullable = false)
    private String fetchMainCode;

    @OneToOne(mappedBy = "oneToOneFetchMain", fetch = FetchType.LAZY)
    @JoinColumn(name = "fetch_main_id", referencedColumnName = "fetch_main_id", updatable = false, insertable = false)
    private OneToOneFetchLazy oneToOneFetchLazy;

    @OneToOne(mappedBy = "oneToOneFetchMain", fetch = FetchType.EAGER)
    @JoinColumn(name = "fetch_main_id", referencedColumnName = "fetch_main_id", updatable = false, insertable = false)
    private OneToOneFetchEager oneToOneFetchEager;



    public OneToOneFetchMain(String fetchMainCode) {
        this.fetchMainCode = fetchMainCode;
    }
}


package com.wangkong.learning.jpa.domain.fetch;

import lombok.*;

import javax.persistence.*;

/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-19 10:51
 * 懒加载扩展表
 */
@Entity
@Table(name = "ONE_TO_ONE_FETCH_LAZY")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = "oneToOneFetchMain")
@ToString(exclude = "oneToOneFetchMain")
public class OneToOneFetchLazy {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "fetch_lazy_id")
    private Long fetchLazyId;
    @Column(name = "fetch_main_id", nullable = false)
    private Long fetchMainId;

    private String dsc;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fetch_main_id", referencedColumnName = "fetch_main_id", updatable = false, insertable = false)
    private OneToOneFetchMain oneToOneFetchMain;


    public OneToOneFetchLazy(Long fetchMainId, String dsc) {
        this.fetchMainId = fetchMainId;
        this.dsc = dsc;
    }
}


package com.wangkong.learning.jpa.domain.fetch;

import lombok.*;

import javax.persistence.*;

/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-14 17:09
 * 员工信息扩展表
 */
@Entity
@Table(name = "ONE_TO_ONE_FETCH_EAGER")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = "oneToOneFetchMain")
@ToString(exclude = "oneToOneFetchMain")
public class OneToOneFetchEager {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "fetch_eager_id")
    private Long fetchEagerId;
    @Column(name = "fetch_main_id", nullable = false)
    private Long fetchMainId;

    private String dsc;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fetch_main_id", referencedColumnName = "fetch_main_id", updatable = false, insertable = false)
    private OneToOneFetchMain oneToOneFetchMain;

    public OneToOneFetchEager(Long fetchMainId, String dsc) {
        this.fetchMainId = fetchMainId;
        this.dsc = dsc;
    }
}

测试用例类:

package com.wangkong.learning.jpa.service;

import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchEager;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchLazy;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchMain;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-19 10:16
 * 测试不同获取对象路径下的SQL执行情况
 */
@Service
public interface OneToOneFetchService {

    List<OneToOneFetchMain> listFetchMain();

    /**
     * 直接通过oneToOneFetchMainRepository查询OneToOneFetchMain
     */
    OneToOneFetchMain findFetchMain(String fetchMainCode);
    /**
     * 先查询OneToOneFetchLazy,再从通过getOneToOneFetchMain()方法获取OneToOneFetchMain
     */
    OneToOneFetchMain getFetchMainByLazy(Long fetchMainId);
    /**
     * 先查询OneToOneFetchEager,再从通过getOneToOneFetchMain()方法获取OneToOneFetchMain
     */
    OneToOneFetchMain getFetchMainByEager(Long fetchMainId);

    /**
     * 直接通过oneToOneFetchLazyRepository查询OneToOneFetchLazy
     */
    OneToOneFetchLazy findOneToOneFetchLazy(Long fetchMaiId);
    /**
     * 查询OneToOneFetchMain,再从通过getOneToOneFetchLazy()获取OneToOneFetchLazy
     */
    OneToOneFetchLazy getFetchLazyByMain(String fetchMainCode);


    /**
     * 直接通过oneToOneFetchEagerRepository查询OneToOneFetchEager
     */
    OneToOneFetchEager findOneToOneFetchEager(Long fetchMaiId);

    /**
     * 查询OneToOneFetchMain,再从通过getOneToOneFetchEager()获取OneToOneFetchEager
     */
    OneToOneFetchEager getFetchEagerByMain(String fetchMainCode);

}

package com.wangkong.learning.jpa.service.impl;

import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchEager;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchLazy;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchMain;
import com.wangkong.learning.jpa.repository.OneToOneFetchEagerRepository;
import com.wangkong.learning.jpa.repository.OneToOneFetchLazyRepository;
import com.wangkong.learning.jpa.repository.OneToOneFetchMainRepository;
import com.wangkong.learning.jpa.service.OneToOneFetchService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-19 10:17
 */
@Log4j2
@Service
public class OneToOneFetchServiceImpl implements OneToOneFetchService {


    @Resource
    private OneToOneFetchMainRepository oneToOneFetchMainRepository;

    @Resource
    private OneToOneFetchEagerRepository oneToOneFetchEagerRepository;
    @Resource
    private OneToOneFetchLazyRepository oneToOneFetchLazyRepository;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public List<OneToOneFetchMain> listFetchMain() {
        return oneToOneFetchMainRepository.findAll()
                .stream()
                .peek(oneToOneFetchMain -> {
                    log.info(oneToOneFetchMain.getOneToOneFetchEager().getDsc());
                    log.info(oneToOneFetchMain.getOneToOneFetchEager().getDsc());
                })
                .collect(Collectors.toList());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchMain findFetchMain(String fetchMainCode) {
        log.info("oneToOneFetchMainRepository直接查询FetchMain对象开始");
        Optional<OneToOneFetchMain> optional = oneToOneFetchMainRepository.findByFetchMainCode(fetchMainCode);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchMain oneToOneFetchMain = optional.get();


        log.info("oneToOneFetchMainRepository直接查询FetchMain对象结束");

        return oneToOneFetchMain;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchLazy findOneToOneFetchLazy(Long fetchMainId) {
        log.info("oneToOneFetchLazyRepository直接查询FetchLazy对象开始");
        Optional<OneToOneFetchLazy> optional = oneToOneFetchLazyRepository.findByFetchMainId(fetchMainId);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchLazy oneToOneFetchLazy = optional.get();


        log.info("oneToOneFetchLazyRepository直接查询FetchLazy对象结束");

        return oneToOneFetchLazy;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchEager findOneToOneFetchEager(Long fetchMainId) {
        log.info("oneToOneFetchEagerRepository直接查询FetchEager对象开始");
        Optional<OneToOneFetchEager> optional = oneToOneFetchEagerRepository.findByFetchMainId(fetchMainId);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchEager oneToOneFetchEager = optional.get();

        log.info("oneToOneFetchEagerRepository直接查询FetchEager对象结束");


        return oneToOneFetchEager;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchMain getFetchMainByLazy(Long fetchMainId) {
        log.info("从oneToOneFetchLazy获取oneToOneFetchMain对象开始");
        Optional<OneToOneFetchLazy> optional = oneToOneFetchLazyRepository.findByFetchMainId(fetchMainId);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchLazy oneToOneFetchLazy = optional.get();

        OneToOneFetchMain oneToOneFetchMain = oneToOneFetchLazy.getOneToOneFetchMain();

        log.info(oneToOneFetchMain.toString());
        log.info("从oneToOneFetchLazy获取oneToOneFetchMain对象结束");

        return oneToOneFetchMain;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchMain getFetchMainByEager(Long fetchMainId) {
        log.info("从oneToOneFetchEager获取oneToOneFetchMain对象开始");
        Optional<OneToOneFetchEager> optional = oneToOneFetchEagerRepository.findByFetchMainId(fetchMainId);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchEager oneToOneFetchEager = optional.get();

        OneToOneFetchMain oneToOneFetchMain = oneToOneFetchEager.getOneToOneFetchMain();

        log.info(oneToOneFetchMain.toString());
        log.info("从oneToOneFetchEager获取oneToOneFetchMain对象结束");

        return oneToOneFetchMain;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchLazy getFetchLazyByMain(String fetchMainCode) {
        log.info("从oneToOneFetchMain获取oneToOneFetchLazy对象开始");
        Optional<OneToOneFetchMain> optional = oneToOneFetchMainRepository.findByFetchMainCode(fetchMainCode);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchMain oneToOneFetchMain = optional.get();

        OneToOneFetchLazy oneToOneFetchLazy = oneToOneFetchMain.getOneToOneFetchLazy();

        log.info(oneToOneFetchLazy.toString());
        log.info("从oneToOneFetchMain获取oneToOneFetchLazy对象结束");

        return oneToOneFetchLazy;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public OneToOneFetchEager getFetchEagerByMain(String fetchMainCode) {
        log.info("从oneToOneFetchMain获取oneToOneFetchEager对象开始");
        Optional<OneToOneFetchMain> optional = oneToOneFetchMainRepository.findByFetchMainCode(fetchMainCode);
        if (optional.isEmpty()) {
            throw new RuntimeException("找不到fetch信息");
        }
        OneToOneFetchMain oneToOneFetchMain = optional.get();

        OneToOneFetchEager oneToOneFetchEager = oneToOneFetchMain.getOneToOneFetchEager();

        log.info(oneToOneFetchEager.toString());
        log.info("从oneToOneFetchMain获取oneToOneFetchEager对象结束");

        return oneToOneFetchEager;
    }


}


package com.wangkong.learning.jpa.service.impl;

import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchEager;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchLazy;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchMain;
import com.wangkong.learning.jpa.service.OneToOneFetchService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

import java.util.List;


/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-19 12:04
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class OneToOneFetchServiceImplTest {


    private final Logger logger = LogManager.getLogger(OneToOneFetchServiceImplTest.class);

    @Resource
    private OneToOneFetchService oneToOneFetchService;


    @Test
    public void listFetchMain() {

        List<OneToOneFetchMain> fetchMainList = oneToOneFetchService.listFetchMain();

        long size = fetchMainList.stream()
                .peek(fetchMain -> {
                    assert fetchMain.getOneToOneFetchEager() != null;
                    logger.info(fetchMain.getOneToOneFetchEager().getDsc());
                }).count();

        assert size == 3;
    }


    @Test
    public void findFetchMain() {
        String fetchMainCode = "001";
        OneToOneFetchMain oneToOneFetchMain = oneToOneFetchService.findFetchMain(fetchMainCode);
        Long fetchMainId = oneToOneFetchMain.getFetchMainId();
        OneToOneFetchMain oneToOneFetchMain1 = oneToOneFetchService.getFetchMainByLazy(fetchMainId);
        OneToOneFetchMain oneToOneFetchMain2 = oneToOneFetchService.getFetchMainByEager(fetchMainId);

        OneToOneFetchLazy oneToOneFetchLazy = oneToOneFetchService.findOneToOneFetchLazy(fetchMainId);
        OneToOneFetchLazy oneToOneFetchLazy1 = oneToOneFetchService.getFetchLazyByMain(fetchMainCode);


        OneToOneFetchEager oneToOneFetchEager = oneToOneFetchService.findOneToOneFetchEager(fetchMainId);
        OneToOneFetchEager oneToOneFetchEager1 = oneToOneFetchService.getFetchEagerByMain(fetchMainCode);


        assert oneToOneFetchMain.getFetchMainCode() != null;
        assert oneToOneFetchMain1.getFetchMainCode() != null;
        assert oneToOneFetchMain2.getFetchMainCode() != null;
        assert oneToOneFetchLazy.getDsc() != null;
        assert oneToOneFetchLazy1.getDsc() != null;
        assert oneToOneFetchEager.getDsc() != null;
        assert oneToOneFetchEager1.getDsc() != null;

    }
}

数据初始化

package com.wangkong.learning.jpa.support;

import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchEager;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchLazy;
import com.wangkong.learning.jpa.domain.fetch.OneToOneFetchMain;
import com.wangkong.learning.jpa.repository.OneToOneFetchEagerRepository;
import com.wangkong.learning.jpa.repository.OneToOneFetchLazyRepository;
import com.wangkong.learning.jpa.repository.OneToOneFetchMainRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @author 忘空
 * @version 1.20190914.001
 * @date 2019-09-19 10:21
 */
@Component
public class InitTestDataUtil {

    @Resource
    private OneToOneFetchMainRepository oneToOneFetchMainRepository;

    @Resource
    private OneToOneFetchLazyRepository oneToOneFetchLazyRepository;
    @Resource
    private OneToOneFetchEagerRepository oneToOneFetchEagerRepository;


    @PostConstruct
    @Transactional(rollbackFor = Exception.class)
    public void initTestData() {
        OneToOneFetchMain fetchMain1 = new OneToOneFetchMain("001");
        oneToOneFetchMainRepository.save(fetchMain1);
        OneToOneFetchEager fetchEagerExt1 = new OneToOneFetchEager(fetchMain1.getFetchMainId(), "测试1直接加载");
        oneToOneFetchEagerRepository.save(fetchEagerExt1);
        OneToOneFetchLazy fetchLazyExt1 = new OneToOneFetchLazy(fetchMain1.getFetchMainId(), "测试1懒加载");
        oneToOneFetchLazyRepository.save(fetchLazyExt1);

        OneToOneFetchMain fetchMain2 = new OneToOneFetchMain("002");
        oneToOneFetchMainRepository.save(fetchMain2);
        OneToOneFetchEager fetchEagerExt2 = new OneToOneFetchEager(fetchMain2.getFetchMainId(), "测试2直接加载");
        oneToOneFetchEagerRepository.save(fetchEagerExt2);
        OneToOneFetchLazy fetchLazyExt2 = new OneToOneFetchLazy(fetchMain2.getFetchMainId(), "测试2懒加载");
        oneToOneFetchLazyRepository.save(fetchLazyExt2);

        OneToOneFetchMain fetchMain3 = new OneToOneFetchMain("003");
        oneToOneFetchMainRepository.save(fetchMain3);
        OneToOneFetchEager fetchEagerExt3 = new OneToOneFetchEager(fetchMain3.getFetchMainId(), "测试3直接加载");
        oneToOneFetchEagerRepository.save(fetchEagerExt3);
        OneToOneFetchLazy fetchLazyExt3 = new OneToOneFetchLazy(fetchMain3.getFetchMainId(), "测试3懒加载");
        oneToOneFetchLazyRepository.save(fetchLazyExt3);
    }
}

oneToOneFetchMain测试情况

2019-09-21 10:44:42.771  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchMainRepository直接查询FetchMain对象开始
2019-09-21 10:44:42.792  INFO 4548 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select onetoonefe0_.fetch_main_id as fetch_ma1_4_, onetoonefe0_.fetch_main_code as fetch_ma2_4_ from ONE_TO_ONE_FETCH_MAIN onetoonefe0_ where onetoonefe0_.fetch_main_code=?
Hibernate: select onetoonefe0_.fetch_eager_id as fetch_ea1_2_0_, onetoonefe0_.dsc as dsc2_2_0_, onetoonefe0_.fetch_main_id as fetch_ma3_2_0_ from ONE_TO_ONE_FETCH_EAGER onetoonefe0_ where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_0_, onetoonefe0_.dsc as dsc2_3_0_, onetoonefe0_.fetch_main_id as fetch_ma3_3_0_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.930  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchMainRepository直接查询FetchMain对象结束

2019-09-21 10:44:42.931  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchLazy获取oneToOneFetchMain对象开始
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_, onetoonefe0_.dsc as dsc2_3_, onetoonefe0_.fetch_main_id as fetch_ma3_3_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_main_id as fetch_ma1_4_0_, onetoonefe0_.fetch_main_code as fetch_ma2_4_0_, onetoonefe1_.fetch_eager_id as fetch_ea1_2_1_, onetoonefe1_.dsc as dsc2_2_1_, onetoonefe1_.fetch_main_id as fetch_ma3_2_1_ from ONE_TO_ONE_FETCH_MAIN onetoonefe0_ left outer join ONE_TO_ONE_FETCH_EAGER onetoonefe1_ on onetoonefe0_.fetch_main_id=onetoonefe1_.fetch_main_id where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.955  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : OneToOneFetchMain(fetchMainId=1, fetchMainCode=001)
2019-09-21 10:44:42.955  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchLazy获取oneToOneFetchMain对象结束

2019-09-21 10:44:42.957  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchEager获取oneToOneFetchMain对象开始
Hibernate: select onetoonefe0_.fetch_eager_id as fetch_ea1_2_, onetoonefe0_.dsc as dsc2_2_, onetoonefe0_.fetch_main_id as fetch_ma3_2_ from ONE_TO_ONE_FETCH_EAGER onetoonefe0_ where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_main_id as fetch_ma1_4_0_, onetoonefe0_.fetch_main_code as fetch_ma2_4_0_, onetoonefe1_.fetch_eager_id as fetch_ea1_2_1_, onetoonefe1_.dsc as dsc2_2_1_, onetoonefe1_.fetch_main_id as fetch_ma3_2_1_ from ONE_TO_ONE_FETCH_MAIN onetoonefe0_ left outer join ONE_TO_ONE_FETCH_EAGER onetoonefe1_ on onetoonefe0_.fetch_main_id=onetoonefe1_.fetch_main_id where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_0_, onetoonefe0_.dsc as dsc2_3_0_, onetoonefe0_.fetch_main_id as fetch_ma3_3_0_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.966  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : OneToOneFetchMain(fetchMainId=1, fetchMainCode=001)
2019-09-21 10:44:42.966  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchEager获取oneToOneFetchMain对象结束

oneToOneFetchLazy测试情况

2019-09-21 10:44:42.967  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchLazyRepository直接查询FetchLazy对象开始
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_, onetoonefe0_.dsc as dsc2_3_, onetoonefe0_.fetch_main_id as fetch_ma3_3_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.969  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchLazyRepository直接查询FetchLazy对象结束

2019-09-21 10:44:42.970  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchMain获取oneToOneFetchLazy对象开始
Hibernate: select onetoonefe0_.fetch_main_id as fetch_ma1_4_, onetoonefe0_.fetch_main_code as fetch_ma2_4_ from ONE_TO_ONE_FETCH_MAIN onetoonefe0_ where onetoonefe0_.fetch_main_code=?
Hibernate: select onetoonefe0_.fetch_eager_id as fetch_ea1_2_0_, onetoonefe0_.dsc as dsc2_2_0_, onetoonefe0_.fetch_main_id as fetch_ma3_2_0_ from ONE_TO_ONE_FETCH_EAGER onetoonefe0_ where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_0_, onetoonefe0_.dsc as dsc2_3_0_, onetoonefe0_.fetch_main_id as fetch_ma3_3_0_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.981  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : OneToOneFetchLazy(fetchLazyId=1, fetchMainId=1, dsc=测试1懒加载)
2019-09-21 10:44:42.982  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchMain获取oneToOneFetchLazy对象结束

oneToOneFetchEager测试情况

2019-09-21 10:44:42.983  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchEagerRepository直接查询FetchEager对象开始
Hibernate: select onetoonefe0_.fetch_eager_id as fetch_ea1_2_, onetoonefe0_.dsc as dsc2_2_, onetoonefe0_.fetch_main_id as fetch_ma3_2_ from ONE_TO_ONE_FETCH_EAGER onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.985  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : oneToOneFetchEagerRepository直接查询FetchEager对象结束

2019-09-21 10:44:42.987  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchMain获取oneToOneFetchEager对象开始
Hibernate: select onetoonefe0_.fetch_main_id as fetch_ma1_4_, onetoonefe0_.fetch_main_code as fetch_ma2_4_ from ONE_TO_ONE_FETCH_MAIN onetoonefe0_ where onetoonefe0_.fetch_main_code=?
Hibernate: select onetoonefe0_.fetch_eager_id as fetch_ea1_2_0_, onetoonefe0_.dsc as dsc2_2_0_, onetoonefe0_.fetch_main_id as fetch_ma3_2_0_ from ONE_TO_ONE_FETCH_EAGER onetoonefe0_ where onetoonefe0_.fetch_main_id=?
Hibernate: select onetoonefe0_.fetch_lazy_id as fetch_la1_3_0_, onetoonefe0_.dsc as dsc2_3_0_, onetoonefe0_.fetch_main_id as fetch_ma3_3_0_ from ONE_TO_ONE_FETCH_LAZY onetoonefe0_ where onetoonefe0_.fetch_main_id=?
2019-09-21 10:44:42.993  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : OneToOneFetchEager(fetchEagerId=1, fetchMainId=1, dsc=测试1直接加载)
2019-09-21 10:44:42.993  INFO 4548 --- [           main] c.w.l.j.s.impl.OneToOneFetchServiceImpl  : 从oneToOneFetchMain获取oneToOneFetchEager对象结束

结语

直接查询OneToOneFetchMain时

直接加载对象OneToOneFetchEager的的SQL查询语句都会执行
懒加载对象OneToOneFetchLazy查询语句都会执行,即懒加载 在此处无效。因为OneToOneFetchMain不保存关系的外键,无从知道是否存在外键关联对象。

获取OneToOneFetchLazy时

若单获取OneToOneFetchLazy,懒加载对象OneToOneFetchMain不加载。

获取OneToOneFetchEager时

若单获取OneToOneFetchEager,懒加载对象OneToOneFetchMain不加载。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,735评论 0 30
  • 一. Java基础部分.................................................
    wy_sure阅读 3,812评论 0 11
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,327评论 0 9
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,524评论 0 4
  • 原题 给定一个未排序的整数数组,找到其中位数。中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组...
    Jason_Yuan阅读 440评论 0 0