
출처 : 인프런 > 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 듣고 작성한 글입니다.
강의 링크 : 자바 ORM 표준 JPA 프로그래밍 - 기본편

@Entity
@Table(name = "MBR") // 매핑할 MBR 테이블 지정
- DDL(Data Definition Language)
: 데이터 정의어란? 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어이다.
- create : 데이터베이스, 테이블등을 생성
- alter : 테이블을 수정
- drop : 데이터베이스, 테이블을 삭제
- truncate : 테이블을 초기화
<property name="hibernate.hbm2ddl.auto" value="create"/>


@Id
private Long id;
private String name;
private int age; // age 컬럼 추가

컬럼을 추가할 때 일일이 컬럼을 추가 하는 것이 아니라 hibernate.hbm2ddl.auto가 알아서 컬럼을 추가해준다.
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>

방언을 oracle로 설정시 가변 문자인 varchar2로 생성이 된다.
✅ 결론 : 자기 로컬PC에서만 자유롭게 사용하고 여러 명이 쓰는 개발 서버, 스테이징, 운영 서버에는 가급적이면 쓰지 않는다!
src\main\java\hellojpa\Member.java
package hellojpa;
import jakarta.persistence.*;
import java.util.Date;
@Entity
public class Member {
// PK mapping
@Id
private Long id;
// 객체에는 username, DB에는 name이라 쓰고 싶음 -> Column 속성 사용
@Column(name = "name")
private String username;
private Integer age;
// 객체에는 enum 타입을 쓰고 싶음, but DB에는 enum 타입이 없음 -> @Enumerated 사용
@Enumerated(EnumType.STRING)
private RoleType roleType;
// 날짜 타입 : DATE = 날짜, TIME = 시간, TIMESTAMP = 날짜 + 시간
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate; // 생성 일자
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate; // 수정 일자
// varchar를 넘어서는 큰 컨텐츠 -> Lob 사용
@Lob
private String description;
public Member () {
}
}







@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
@SequenceGenerator(name = "member_seq_generator",
sequenceName = "member_seq", // 매핑할 DB 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
// PK mapping
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_generator")
private Long id;
...
}

@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
...
}




src\main\java\jpabook\jpashop\JpaMain.java
// Order를 찾았음
Order order = em.find(Order.class, 1L);
// Order한 member를 찾고 싶음 -> getMemberId
Long memberId = order.getMemberId();
// MemberId를 찾은 다음 또 Member를 찾아야 함
Member member = em.find(Member.class, memberId);
// 위 코드는 객체 지향스럽지 않음
// Order에서 바로 Member를 바로 찾을 수 있어야 함
Member findMember = order.getMember();
src\main\java\jpabook\jpashop\domain\Member.java
package jpabook.jpashop.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
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;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
src\main\java\jpabook\jpashop\domain\Order.java
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "ORDERS") // DB에 "ORDER BY"기 예약어로 설정되어 있는 경우가 있어서
public class Order {
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@Column(name = "MEMBER_ID")
private Long memberId;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public LocalDateTime getOrderDate() {
return orderDate;
}
public void setOrderDate(LocalDateTime orderDate) {
this.orderDate = orderDate;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
}
src\main\java\jpabook\jpashop\domain\OrderItem.java
package jpabook.jpashop.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
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 orderPrice;
private int count;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Long getItemId() {
return itemId;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public int getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(int orderPrice) {
this.orderPrice = orderPrice;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
src\main\java\jpabook\jpashop\domain\Item.java
package jpabook.jpashop.domain;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStockQuantity() {
return stockQuantity;
}
public void setStockQuantity(int stockQuantity) {
this.stockQuantity = stockQuantity;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}