JPA Entity - 테이블 매핑

목차

Entity 매핑에 사용하는 어노테이션

  • 객체와 테이블 매핑 : @Entity , @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관 관계 매핑 : @ManyToOne, @JoinColumn

@Entity

JPA 가 관리하는 클래스
JPA 를 사용하기 위해서는 반드시 Entity 어노테이션을 붙여줘야 한다.

  • 파라미터가 없는 기본 생성자를 반드시 생성해줘야 한다.
  • final 클래스, enum, interface, inner 클래스 에는 사용이 불가능 하다.
  • 저장할 field 에 final 키워드는 사용이 불가능하다.

@Table

Table 어노테이션은 Entity 와 매핑할 Database Table 을 지정한다.

이름 기능 기본 값
name 매핑할 테이블 이름 Entity 이름을 사용
catalog DataBase 에 catalog 매핑
schema DataBase 에 schema 매핑
uniqueConstraints DDL 생성시에 유니크 제약 조건 생성

DataBase 스키마 자동 생성

DDL 을 애플리케이션 실행 시점에 자동 생성

  • 운영 서버에서는 create, create-drop, update 속성을 사용해서는 안된다.
  • 테이블 중심 –> 객체 중심
  • 데이터 베이스 방언을 활용해서 데이터 베이스에 적절한 DDL 을 생성한다.
옵션 설명
create 기존 테이블을 DROP 한 후 CREATE 한다. (어플리케이션 종료한 후에도 테이블 유지)
create-drop 기존 테이블을 DROP 한 후 CREATE 한다. (어플리케이션 종료시점에 테이블 DROP)
update 기존 테이블을 DROP 하지 않고 변경된 부분만 반영 (ALTER)
validate Entity 와 Table 이 정상적으로 매핑 됐는지 확인한다.
none 아무 작업도 진행하지 않는다.

create

기존 테이블을 DROP 한 후 CREATE 한다.

Hibernate: 

drop table Member if exists
Hibernate:

create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)

create-drop

기존 테이블을 DROP 한 후 CREATE 한다. (어플리케이션 종료시점에 테이블 DROP)

Hibernate: 

drop table Member if exists
Hibernate:

create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
Hibernate:
/* select
m
from
Member as m */ select
member0_.id as id1_0_,
member0_.name as name2_0_
from
Member member0_ limit ? offset ?
Hibernate:

drop table Member if exists

update

기존 테이블을 DROP 하지 않고 변경된 부분만 반영 (ALTER)

Hibernate: 

alter table Member
add column age integer not null

validate

Entity 와 Table 이 정상적으로 매핑 됐는지 확인한다.

SchemaManagementException

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1016)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:942)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at hellojpa.JpaMain.main(JpaMain.java:13)
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [location] in table [Member]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:136)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
... 4 more
Share