项目地址: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不加载。