본문 바로가기

개발공부/Java(JPA)

JPA 연관 관계 설정

<User> 추가

// 1:N
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")   
                                  // 어떤 컬럼에 매핑? OrderDetail의 user 변수와 매핑
                                  // OrderDetail의 변수명과 동일해야함
private List<OrderDetail> orderDetailList;              // N이므로 List형

/* FetchType
       LAZY : 지연 로딩. 
              따로 변수에 대해 get method를 호출하지 않으면
              연관관계가 설정된 테이블에 대해 select 하지 않는다.
              여러가지 데이터의 로딩이 일어날 때는 LAZY 추천
       EAGER : 즉시 로딩.
               연관관계가 설정된 모든 테이블에 대해 JOIN 일어남.
               한가지 데이터만 select해도 모든 데이터를 가져옴.
               1:1 또는 한 건의 데이터만 존재할 때 추천       
*/

<OrderDetail>

@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = {"user","item"})  //상호 연결이 되어 있어서 overflow 발생
@Data
@Entity
public class OrderDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private LocalDateTime orderAt;

    // N : 1
    @ManyToOne
    private User user;   // hibernate를 이용한 연관 관계 설정 -> 반드시 객체 타입.
                         // 알아서 user_id로 찾아감

    @ManyToOne
    private Item item;

}

<Item> 추가

@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
private List<OrderDetail> orderDetailList;

<UserRepositoryTest> 수정

@Test
@Transactional
public void read(){

    Optional<User> user = userRepository.findById(1L); 

    user.ifPresent(selectUser -> {                    
                /*System.out.println(selectUser);
                System.out.println(selectUser.getEmail());*/

                selectUser.getOrderDetailList().stream().forEach(detail -> {
                                                                 //List이기 때문에 stream
                    Item item = detail.getItem();
                    System.out.println(item);
                });
            });

}
  • 1번 user를 가져와서 select, 1:N 관계에 있는 orderDetailList 가져오고,
  • 각각의 detail이 가지고 있는 Item 출력

Query Method

Optional<User> user = userRepository.findById(1L); 로는 Id로만 검색 가능.

account 또는 email 로 찾는 방법?

<UserRepository>

@Repository                                     // 데이터타입, pk의 타입
public interface UserRepository extends JpaRepository<User, Long> {

    // select * from user where account = ?
    // account 와 변수가 매칭될 때 이름 달라도 괜찮음. 순서대로 매칭됨.
    // 하지만 변수명과 컬럼명을 맞춰주는 것을 추천
    Optional<User> findByAccount(String account);

		// select * from user where account = ? and email = ?
    Optional<User> findByAccountAndEmail(String account, String email);

}

'개발공부 > Java(JPA)' 카테고리의 다른 글

[Java] String VS StringBuilder 차이점  (0) 2025.02.17
JPA 란?  (1) 2025.02.13
Entity  (0) 2025.02.13
Repository  (0) 2025.02.13
JPA 자동 설정 기능  (0) 2023.06.18