3일차.
class Member {
private long id;
private List<Order> orders; // 회원 -> 주문
}
class Order {
private String id;
}
Member member = new Member();
Order order = meber.getOrders().get(0); // 회원 -> 주문에 참조가 가능하다.
order.getMember() // (X)
class Member {
private long id;
private List<Order> orders; // 회원 -> 주문
}
class Order {
private String id;
private Member member; // 주문 -> 회원
}
Member member = new Member();
Order order = member.getOrders().get(0); // 회원 -> 주문 참조 (O)
order.getMember(); // 주문 -> 회원 참조 (O)
SELECT * FROM member AS m JOIN orders AS o
ON m.id = o.member_id;
SELECT * FROM orders AS o JOIN member AS m
ON o.member_id = m.id
@Ingeritance()
를 사용한다.@Ingeritance(strategy = IngeritanceType.JOINED)
를 사용하면 추상클래스(abstract)로 바꾸어 주어야한다.@Ingeritance(strategy = IngeritanceType.SINGLE_TABLE)
@DiscriminatorColumnn(name= "DTYPE")
추가.@DiscriminatorValue()
을 추가해주어야함.@MappedSuperclass
를 써서 기본값들을 상속을 통해 많이 사용하고 있음.@MappedSuperclass
public class BaseEntity {
@Column(name = "created_by")
private String createdBy;
@Column(name = "created_at", columnDefinition = "TIMESTAMP")
private LocalDateTime cratedAt;
}
public class Member {
@Id
private String id1;
@Id
private String id2; // runtime error
}
@IdClass
로 명시하고 사용할 IdClass 객체를 명시할 수 있음. @Getter
@Setter
@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
private String id1;
@Id
private String id2;
}
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class ParentId implements Serializable {
private String id1;
private String id2;
}
ParnetId
의 키값으로 사용하겠다 하는 필드와 똑같은 값을 필드명을 명시해준다. Serializable
인터페이스를 구현해야한다.eqauls
hashCode
를 구현해야한다.public
이어야한다.@EmbeddedId
를 명시하고 식별자 객체를 추가한다.@Getter
@Setter
@Entity
public class Parent2 {
@EmbeddedId
private ParentId2 id;
}
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class ParentId2 implements Serializable {
private String id1;
private String id2;
}
Serializable
인터페이스를 구현해야 한다.eqauls, hashCode
를 구현해야 한다.@Embeddable
애노테이션이 있어야 한다.ArgsConstructor
@NoArgsConstructor
: 기본 생성자를 생성해준다.@NoArgsConstructor(force=true)
를 사용하면 null, 0 등 기본값으로 초기화된다.@AllArgsConstructor
: 전체 변수를 생성하는 생성자를 만들어준다.@Entity
@Table(name = "member")
public class Member extends BaseEntity {
...
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY(EAGER))
private List<Order> orders = new ArrayList<>(); // proxy
...
}
FetchType.
뒤에 LAZY와 EAGER를 사용할 수 있다.member.getOrder()
했을 때 오더를 오더테이블에서 셀렉트쿼리를 날려 가져옴.LazyInitializationException
예외가 발생한다.public enum CascadeType {
ALL,
PERSIST,
MERGE,
REMOVE,
REFRESH,
DETACH;
private CascadeType() {
}
}
@Entity
@Table(name = "member")
public class Member extends BaseEntity {
...
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Order> orders = new ArrayList<>();
...
}
orphanRemoval
를 true로 설정해주면 flush 순간 RDS에서도 삭제됨.