Entity 예시
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
@Column(nullable = false, updatable = false, unique = true)
private String email;
@Column(length = 100, nullable = false)
private String name;
@Column(length = 13, nullable = false, unique = true)
private String phone;
@Column(nullable = false)
private LocalDateTime createdAt = LocalDateTime.now();
@Column(nullable = false, name = "LAST_MODIFIED_AT")
private LocalDateTime modifiedAt = LocalDateTime.now();
@Transient
private String age;
public Member(String email) {
this.email = email;
}
public Member(String email, String name, String phone) {
this.email = email;
this.name = name;
this.phone = phone;
}
}
Entity, Id 관련 Annotation
@Entity : (Necessary) JPA 관리 대상 Entity가 됨 (DB의 Table과 mapping이 된다.)
@Table : (Optional) DB 테이블의 이름 설정 가능
@Id : (Necessary) 해당 field 값을 DB의 PK(Primary Key) 값으로 지정
@GeneratedValue : 기본키 자동 생성 지원 (없을시에는 수동으로 지정해주어야 함)
Entity의 필드와 Table의 컬럼과의 매핑 Annotation
@Column
@Column attrbute 설정사항
@Transient : 테이블 컬럼과 매핑하지 않음
@Enumerated : enum 타입과 매핑할 때 사용하는 애너테이션
연관 관계 구현 방법
연관 관계 종류
1:N 연관 관계
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
...
@ManyToOne // 다대일의 관계를 명시
@JoinColumn(name = "MEMBER_ID") // 외래키에 해당하는 컬럼명을 적어줌
private Member member;
public void addOrder(Order order) {
orders.add(order);
}
}
// Java mappedBy 오류 내용
mappedBy reference an unknown target entity property:
com.codestates.order.Order.ORDERS in com.codestates.member.Member.orders
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {
....
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
public void addMember(Member member) {
this.member = member;
}
}
public class Order {
...
@OneToMany(mappedBy = "order")
private List<OrderCoffee> orderCoffees = new ArrayList<>();
}
public class OrderCoffee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long orderCoffeeId;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "COFFEE_ID")
private Coffee coffee;
@Column(nullable = false)
private int quantity;
}
일대일 연관관계
@Entity // 일부 어노테이션 생략
public class Member extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
...
@OneToOne(mappedBy = "member", cascade = CascadeType.PERSIST)
private Stamp stamp;
}
@Entity // 일부 어노테이션 생략
public class Stamp extends Auditable {
...
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
cascade = CascadeType.PERSIST : 영속성 컨텍스트에 한번에 저장
cascade = CascadeType.REMOVE : 이 정보 지우면 참조한 정보와 연결 관계를 끊음
cascade 참고자료
fetch = FetchType.EAGER
fetch = FetchType.LAZY
일대다 매핑는 단방향 연관 관계로 사용하지 않음
우선 적으로 다대일 단방향 매핑을 적용