멍두의 개발새발
[JPA] Entity에서 사용되는 Annotation 정리 (@Table, @Entity, @Column, @Enumerated, @Temporal .. ) 본문
Programming/Spring
[JPA] Entity에서 사용되는 Annotation 정리 (@Table, @Entity, @Column, @Enumerated, @Temporal .. )
멍두 2025. 5. 26. 03:08반응형
@Table
- DB에 지정되는 Table의 이름
@Entity
- Entity로 관리
- name을 지정해주면 JPQL에서 해당 명으로 사용할 수 있음
참고 : [JPA] Entity에서 @Table, @Entity, @Column의 name을 정의해주어야할까?
@Id
- PrimaryTable의 PrimaryKey를 지정해준다
@GeneratedValue
- primary 생성 전략 제공
- @Id에 @GeneratedValue 없으면 insert할 때 반드시 id도 직접 넣어주어야함
이름 | 종류 | 기능 |
startegy | AUTO(default) | JPA가 알아서 DBMS에 따라 하위 4가지 전략중 택 1 |
TABLE | @TableGenerator로 함께 쓰인다. 모든 DBMS에서 사용가능하지만 ID가 필요할 때마다 select, update를 해야하고 Lock로 필요하므로 성능이 좋지 않음 | |
IDENTITY | DB가 기본키를 관리한다. AUTO_INCREMENT를 통해 생성한다.(MySQL, SQL server) | |
SEQUENCE | DB가 기본키를 관리한다. Sequence 객체를 통해 생성함(Oralce, PostgreSQL .. ) 얘는 메모리 수준에서의 연산으로 매우 매우 매우 빠르다 (락, io 이런거 다 없음) | |
UUID | 만약 기본키가 UUID이고, AUTO라면 이 방식을 선택한다. UUID는 애플리케이션 코드에서 생성되므로 빠르다. |
@Column
이름 | 기능 | 정의해주지 않은 경우 |
name | column name 정의 | “” |
table | table name 정의 | @Entity가 매핑되는 기본 테이블로 지정됨 |
nullable | null 값 가능 / 불가능 | true(널 가능) |
unique | unique 속성 추가 | false |
columnDefinition | DDL문 추가하고 싶은 내용 ex default value | “” |
length | 최대 길이 (String value에만 적용) | 255 |
insertable | insert문에서 제외 / 포함 | true (insert문에 해당 field 포함) |
updatable | update문에서 제외 / 포함 | true (update문에 해당 field 포함) |
@NotNull
- @NotNull은 Jakarata.validation의 어노테이션이다.
- 하지만 Entity의 column에 달려있으면 NotNull을 DDL에도 반영해준다
참고 :@NotNull VS @Column(nullable = false)
@Enumerated
- enum 타입 field를 DB에 어떻게 저장할지 지정
EnumType | 정의해주지않으면 | |
.ORDINAL | enum을 선언한 순서대로 저장됨 | Ordinal |
.STRING | enum 이름을 저장 |
- Ordinal은 enum선언순서가 변경되면 데이터가 불일치될 수 있어서 권장되지 않음
@Embedded, @Embadable
- 클래스가 참조하고 있는 클래스를 평면화하여 현재 엔티티 테이블의 컬럼으로 추가할 수 있음
- 평면화 되는 테이블은 반드시 @Embeddable을 선언해주어야함
@Embeddable
public class EmploymentPeriod {
private Date startDate;
private Date endDate;
}
@Entity
public class Employee {
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "startDate", column = @Column(name = "EMP_START")),
@AttributeOverride(name = "endDate", column = @Column(name = "EMP_END"))
})
private EmploymentPeriod employmentPeriod;
// ...
}
// → 위의 employmentPeriod 필드는 Employee 테이블의 두 컬럼 EMP_START, EMP_END에 매핑됨
@Temporal
- java의 시간정보가 포함된 필드를 DB에 어떤 값으로 매핑할건지 지정해준다
- Date, Calendar 타입일때만 사용할 수 있는데, JPA 2.2이상에서는 LocalDate, LocalTime, Instant등 사용가능
public enum TemporalType {
DATE, //java.sql.Date (날짜)
TIME, //java.sql.Time (시간)
TIMESTAMP //java.sql.Timestamp (날짜 + 시간)
}
출처
https://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#naming
https://www.baeldung.com/hibernate-notnull-vs-nullable
https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1.html
반응형
'Programming > Spring' 카테고리의 다른 글
[JPA] @NotNull VS @Column(nullable = false) (1) | 2025.05.26 |
---|---|
[JPA] Entity에서 @Table, @Entity, @Column의 name을 정의해주어야할까? (2) | 2025.05.26 |
[스프링] DTO에 @NoArgsConstructor와 @Gettter이 필요한 이유 (2) | 2024.07.30 |
[스프링] - findByIN절, jdbc batchUpdate (bulk Insert)로 쿼리 개선 (0) | 2024.05.29 |
[스프링] [에러해결] 모든 http response의 한글 깨짐을 한방에 해결하기 (2) | 2024.04.30 |