✍️
이런 걸
배워요!
JPA의 기본기를 탄탄하게 다질 수 있습니다.
JPA의 내부 동작 방식을 이해할 수 있습니다.
객체와 DB 테이블을 올바르게 설계하고 매핑할 수 있습니다.
실무에서 자신있게 JPA를 사용할 수 있습니다.
인프런 강의 : https://www.inflearn.com/course/ORM-JPA-Basic
강의 자료 :
https://github.com/braverokmc79/jpa-basic-lecture-file
소스 :https://github.com/braverokmc79/ex1-hello-jpa-common
https://github.com/braverokmc79/ex1-hello-jpa
[3] 엔티티 매핑
8. 객체와 테이블 매핑
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21691&tab=curriculum
목차
• 객체와 테이블 매핑
• 데이터베이스 스키마 자동 생성
• 필드와 컬럼 매핑
• 기본 키 매핑
• 실전 예제 - 1. 요구사항 분석과 기본 매핑
엔티티 매핑 소개
• 객체와 테이블 매핑: @Entity, @Table
• 필드와 컬럼 매핑: @Column
• 기본 키 매핑: @Id
• 연관관계 매핑: @ManyToOne,@JoinColumn
@Entity
• @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
• JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
• 주의
• 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
• final 클래스, enum, interface, inner 클래스 사용X
• 저장할 필드에 final 사용 X
9. 데이터베이스 스키마 자동 생성
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21692&tab=curriculum
데이터베이스 스키마 자동 생성
• DDL을 애플리케이션 실행 시점에 자동 생성
• 테이블 중심 -> 객체 중심
• 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한
DDL 생성
• 이렇게 생성된 DDL은 개발 장비에서만 사용
• 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬
은 후 사용
<property name="hibernate.hbm2ddl.auto" value="create" />
package hellojap; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity //@Table(name="USER") public class Member { @Id private Long id; @Column(unique = true , length=10) private String name; public Member() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
10. 필드와 컬럼매핑
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21693&tab=curriculum
RoleType
package hellojap; public enum RoleType { USER, ADMIN }
Member
package hellojap; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @Entity public class Member { @Id private Long id; @Column(name="name" , nullable = false, columnDefinition = "varchar(100) default 'EMPT' ") private String username; private Integer age; //기본값은 ORDINAL 이다 숫자로 등록처리된다. //EnumType은 무조건 String 타입으로 사용해야 한다. @Enumerated(EnumType.STRING) private RoleType roleType; //타임스탬프 과거 버전 @Temporal(TemporalType.TIMESTAMP) private Date createDate; //타임스탬프 과거 버전 @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @CreationTimestamp private LocalDate localDate; @UpdateTimestamp private LocalDateTime localDateTime; //문자타입인경우 기본 clob @Lob private String description; @Transient private int temp; public Member() { } }
11. 기본키 매핑
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21694&tab=curriculum
Member
package hellojap; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.SequenceGenerator; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @Entity @SequenceGenerator(name="member_seq_generator", sequenceName = "member_seq") public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_generator") private Long id; @Column(name="name" , nullable = false, columnDefinition = "varchar(100) default 'EMPT' ") private String username; private Integer age; //기본값은 ORDINAL 이다 숫자로 등록처리된다. //EnumType은 무조건 String 타입으로 사용해야 한다. @Enumerated(EnumType.STRING) private RoleType roleType; //타임스탬프 과거 버전 @Temporal(TemporalType.TIMESTAMP) private Date createDate; //타임스탬프 과거 버전 @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @CreationTimestamp private LocalDate localDate; @UpdateTimestamp private LocalDateTime localDateTime; //문자타입인경우 기본 clob @Lob private String description; @Transient private int temp; public Member() { } }
12. 실전 예제 1 - 요구사항 분석과 기본 매핑
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21695&tab=curriculum
소스 :
https://github.dev/braverokmc79/jpa-basic-shop
Member
package jpashop.home.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; private String name; private String city; private String street; private String zipcode; }
Item
package jpashop.home.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Item { @Id @GeneratedValue @Column(name="ITEM_ID") private Long id; private String name; private String price; private int stockQuantity; }
Order
package jpashop.home.domain; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter @Table(name="ORDERS") //ORDER DB 에서 예약어로 사용되는 경우 많아서 ORDERS public class Order { @Id @GeneratedValue @Column(name="ORDER_ID") private Long id; private Long memberId; private LocalDateTime orderDate; //ORDINAL 숫자 타입으로 하면 순서가 꼬이므로 무저건 String 한다 @Enumerated(EnumType.STRING) private OrderStatus status; }
OrderItem
package jpashop.home.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column(name="ORDER_ITEM_ID") private Long id; @Column(name="ORDER_ID") private Long orderId; @Column(name="ITEM_ID") private Long itemId; private int oderPrice; private int count; }
OrderStatus
package jpashop.home.domain; public enum OrderStatus { ORDER, CANCEL }
댓글 ( 4)
댓글 남기기