[JPA] Entity 매핑(JPA 기본편 by 김영한)

su_y2on·2022년 1월 20일
0

JPA

목록 보기
4/17
post-thumbnail

Entity 매핑



객체와 테이블 매핑

@Entity가 붙은 클래스를 JPA가 entity로 관리합니다. 그리고 꼭 파라미터가 없는 생성자가 필수로 있어야합니다. 또 클래스를 이름이 다른 테이블과 매핑하고싶다면 @Table안에 name속성에 적어주면 됩니다. UNIQUE조건은 uniqueConstrains에 적어주면 됩니다. 컬럼수준에서도 unique조건을 달아줄 수 있지만 생성되는 이름이 더 복잡해지고 여러 컬럼에 unique조건을 걸어줄 수 없기 때문에 @Table로 하는 방식이 더 권장됩니다. 단 이기능은 DDL자동생성시에만 적용됩니다.

@Entity // JPA가 인식
@Table(name = "MBR", 
	uniqueConstraints={
		@UniqueConstraint(columnNames={"column1","column2"})} 
        )
public class Member {

	....
    
   public Member() {

    }
    
}




데이터베이스 스키마 자동생성

DDL(CREATE, DROP...)을 어플리케이션 실행 시점에 자동으로 생성해줍니다! 하지만 이렇게 생성된 DDL은 바로 사용하기에는 위험이 따르기때문에 수정을 해서 사용하거나 개발시에만 사용이 권장됩니다.
물론 무조건 DDL이 적용되는 것은 아니고 그 정도도 선택할 수 있습니다.

persistence.xml에서 hibernate.hbm2ddl.auto라는 옵션으로 설정이 가능합니다

  • create : drop + create
  • create-drop : drop + create + drop
  • update : 변경사항만 적용 alter
  • validate : 엔티티와 테이블이 잘 매핑 되었는지 확인

자동으로 DDL생성을 원하지 않으면 주석처리를 해주시거나 쓰지 않으면 됩니다🤗




DDL 생성기능

DDL 생성기능은 JPA 실행로직에 영향을 주지 않는 것들을 말합니다. 예를들면 unique나 length, nullable이 있습니다.




필드와 컬럼 매핑

필드차원에서의 매핑 어노테이션을 살펴보면 아래와 같습니다

 @Entity
 public class Member {
 
 @Id //pk매핑 
 private Long id;
 
 @Column(name = "name") // 컬럼 이름따로 매핑 
 private String username;
private Integer age;

 @Enumerated(EnumType.STRING) // enum 타입 매핑 
 private RoleType roleType;
 
 @Temporal(TemporalType.TIMESTAMP) // 날짜 타입 매핑 
 private Date createdDate;
 
 @Temporal(TemporalType.TIMESTAMP)
 private Date lastModifiedDate;
 
 @Lob // 용량 큰 데이터 
 private String description;
}

어노테이션 별로 자세히 살펴보겠습니다

@Column

  • name : 다른 이름의 컬럼과 매핑
  • insertable, updatable
  • nullable(DDL) : default = true
  • unique(DDL) : 간단하게 필드별로 적용 가능
  • length(DDL) : string에만 적용
    ....

@Enumerated

  • EnumType.ORDINAL : 순서로 저장(순서가 변경되었을 때 이전에 기록들 update되지 않기 때문에 쓰지말기)
  • EnumType.STRING : 문자로 저장 🍒

@Temporal

  • TemporalType.DATE : 날짜
  • TemporalType.TIME : 시간
  • TemporalType.TIMESTAMP : 날짜와 시간

@Lob

종류(옵션아니고 자동으로 이렇게 된다)

  • CLOB : 문자
  • BLOB : 나머지(바이트..)

0개의 댓글