<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 |