springframework/Spring Data JPA

엔티티타입 맵핑

Jungsoomin :) 2020. 11. 13. 17:42
  • 도메인 모델을 어떻게 테이블에 맵핑시킬지 하이버네이트에게 알려주는 작업이다.
  • 2가지로 분류되며, 어노테이션, xml 설정으로 나뉜다.

 


@Entity

  • 엔티티는 객체 세상에서 부르는 이름이다.
  • @Table 이라는 어노테이션이 생략되어있는 것과 같다.
  • 속성 값의 이름은 객체의 이름이며, @Table 의 속성 값으로 이름을 변경해야한다.
  • 아무런 설정을 주지 않을경우 엔티티 이름이 테이블 이름이 된다.
  • @Entity 에서 아무런 속성 값을 주지 않을 경우 클래스이름이 객체의 이름이 된다.
  • 즉 @Entity 에서 이름을 주거나 주지 않을 경우 객체의 이름이 정해지며, 객체의 이름이 @Table에 아무런 속성 값을 주지 않을 경우 테이블의 이름이 된다.

@Id

  • 엔티티의 PK 를 맵핑할때 사용
  • 자바의 원시 타입랩퍼타입 사용가능
  • Date, BigDecimal, BigInteger 사용가능
  • 원시타입은 기본 값이 0, 랩퍼타입은 null 이므로 명시적인 랩퍼타입을 사용하는게 좋음.
  • 여러개의 컬럼을 합친 복합키도 생성가능하다.

@GenerateValue

  • 자동생성 값을 만들어내는 어노테이션
  • DB에 따라 생성 전략생성기가 다름.
  • 기본 값은 Auto : 사용하는 DB에 따라 자동 선택

strategy 속성 

  • 생성 전략을 다르게 지정할때 사용
  • Table, Sequence, Identity 중 선택

@Column

  • unique : 유니크 제약조건 여부
  • nullabe : 널 제약조건 여부
  • length : 길이
  • columnDefinition : SQL 문 직접 명시

날짜 타입의 매핑은 @Temporal

  • TemporalType.Date
  • TemporalType.Time
  • TemporalType.TimeStamp

javax.persistence.Transient : @Transient

  • 객체에서만 사용하고 영속화시키지는 않을 때에 사용한다.
@Entity
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(columnDefinition = "varchar(255) not null")
    private String password;

    @Temporal(TemporalType.TIME)
    private Date created = new Date();


    private String yes;

    @Transient
    private String no;

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return id.equals(account.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Getter, Setter 는 필수 사항이 아니다.

자바 빈 스팩을 따르지만 컬럼 맵핑을 위해 Getter Setter 를 작성하지 않아도 된다.  아마도 Reflection 을 쓰는 듯.

 


spring.jpa.hibernate.ddl.auto=upate

  • 해당 컬럼이 정의되어 있을 경우 컬럼 설정을 바꾼다고 해서 변경사항이 적용되지 않는다.

쿼리 로그

  • spring.jpa.show-sql=true : 하이버네이트 쿼리 생성 로그를 띄움
  • spring.jpa.properties.hibernate.format_sql=true : 하이버네이트가 생성한 쿼리를 보기 편하게 만들어 준다.
# show sql
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

 

'springframework > Spring Data JPA' 카테고리의 다른 글

관계 맵핑, 1 : N  (0) 2020.11.13
Value 타입 맵핑  (0) 2020.11.13
JPA 실행하고 적용하기  (0) 2020.11.09
ORM 패러다임 불일치  (0) 2020.11.08
JPA 개요  (0) 2020.11.08