본문 바로가기

Spring

@OneToMany (fetch type) , @ManyToOne

반응형

OrderDetail 입장에서 
자신은 N이고 User는 1.

@ManyToOne

연관 관계 설정시에는 객체로 표시해야 함.

자신이 1 상대가 Many인 경우

@OneToMany이고 
List로 받아올 수 있음.

@OneToMany(fetch = FetchType.LAZY , mappedBy = "user")
어떤 칼럼으로 매핑할 것 인지 정할 때는 Many입장의 객체에서 
자신을 1로 두고 매핑한 그 객체의 이름과 같게 해야 함.

 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = {"user","item"}) //lombok사용시 toString을 자동지정 해 주는데
//현재 OrderDetatil과 User,Item이 서로 상호 참조 하고 있기 때문에 오류 발생.

public class OrderDetail {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)


private Long id ;
private LocalDateTime orderAt;


@ManyToOne
private User user; // User의 OneToMany에서 옵션에 mappedBy에 같은 값이 들어가야 함.


@ManyToOne
private Item item
;

}

 

 

 

public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //데이터 베이스에 기본키 생성 위임. Mysql


private Long id;
private String account;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
private String createdBy;
private LocalDateTime updatedAt;
private String updatedBy;

//1:N
@OneToMany(fetch = FetchType.LAZY,mappedBy = "user")

private List<OrderDetail> orderDetailList;



}

 

 

 

@OneToMany

fetch  타입
-LAZY : 지연 로딩 -> 명시되지 않는한 연관관계가 설정된 다른 테이블에 대해서 조인하지 않음. (1:Many 사용)

Select * From item where id = ?

_EAGER : 즉시 로딩 -> 연관관계가 설정된 모든 테이블에 대해 조인이 일어남 (1:1 에서 사용)
item_id  = order_detail.item_id
user_id = order_detail.user_id
where item id = ?


관계 테이블에서 두 객체의 키를 foreign key로 사용시에
두 Entity이름 뒤에 _id를 붙인 형태로 써야 됨.

 

 

User Entity와 Item Entity에 대한 Relation인데 각각의 키를 여러개 가질 수 있음. 

 

 

 

One에 해당하는 Entity는 자신의 기존 변수들에 대해 그대로 저장하고 단지 Many의 Entity를 담을 List를 추가할 뿐이다.

Many에 해당하는 Entity 입장에서 creat()를 하는 방법은 One에 해당하는 Entity를 멤버로 갖고 해당 멤버를 set한 후에 save하는 방식.

Optional로 해당 Entity를 찾아서 get()으로 객체를 반환 받고 이를 set한다.

그러면 해당 Entity_id라고 지정된 칼럼에 Entity의 id값이 들어감.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
    public void create()
    {
 
 
 
       Optional<User> user = userRepository.findByAccount("TestUser04");
       Optional<Item> item = itemRepository.findById(1L);
 
 
 
 
 
 
        OrderDetail orderDetail = new OrderDetail();
 
        orderDetail.setUser(user.get());
        orderDetail.setItem(item.get());
 
        orderDetail.setOrderAt(LocalDateTime.now());
 
 
        //orderDetail.setItemId(1L);
        //orderDetail.setUserId(1L);
 
 
    }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs
반응형

'Spring' 카테고리의 다른 글

연관 관계 설정.  (0) 2019.11.12
다양한 find 지원.  (0) 2019.11.10
ERD  (0) 2019.11.10
@Autowired , Bean  (0) 2019.11.10
Assertions & Transactional 어노테이션  (0) 2019.11.10