JPA/JPA

OneToOne Entity

lovineff 2020. 6. 9. 10:36

부모 Entity 조회

// OneToOne 관계의 경우 Lazy 로딩이 정상 동작하지 않는 경우가 많다.
// lazy 로딩이 정상동작하기 위해선 특정 조건을 충족해야한다.
// lazy 로딩 발생
jpaUserRepository.findAll()
    .stream()
    .map(user ->
        // Model 데이터 매핑
        User.builder()
            .userId(user.getId())
            .name(user.getName())
            .build();
    ).forEach(user -> System.out.println(user.toString()));

// Lazy 로딩이 발생하지 않는다.(JPQL 사용)
em.createQuery(
        "select new com.test.react.Model.User(u.id, u.name) from User u", User.class    // Entity로 조회하여 Model에 결과 반환(Model에 해당 파라미터를 받는 생성자가 필요하다)
    ).getResultList()
    .forEach(user -> System.out.println(user.toString()));

 

부모 데이터 수정

jpaUserRepository.findById(1L)     // 회원 정보 조회
    .ifPresent(user -> {
        user.changeName("aaaaaa");  // 조회된 회원 정보 수정
    });
jpaUserRepository.flush();  // 변경 내용 저장

 

자식 데이터 수정 또는 생성

jpaUserRepository.findById(4L)     // 회원 정보 조회
    .ifPresent(user ->{
        if(user.getUserDetail() != null){   // UserDetail 테이블에 값이 있으면 연관된 데이터 수정
            user.getUserDetail().changeAddress("address Change");
        }else{                              // UserDetail 테이블에 값이 없으면 신규 데이터 생성
            // 부모 Entity에 cascade 옵션이 없으면 save the transient instance before flushing 에러가 발생한다.
            user.setUserDetail(UserDetail.builder()
                .age(1000)
                .address("testasdf")
                .build());
        }
    });
jpaUserRepository.flush();  // 변경 내용 저장

 

'JPA > JPA' 카테고리의 다른 글

Auditing  (0) 2020.06.09
컬렉션 조회(OneToMany)  (0) 2020.06.09
변경 감지와 병합(merge)  (0) 2020.06.09
JPA에서 사용하는 다양한 API  (0) 2020.06.09
JPA 의 데이터 타입 분류  (0) 2020.06.09