티스토리 뷰

 

요구사항 추가

- 회원은 일반 회원과 관리자로 구분해야한다.

- 회원 가입일과 수정일이 있어야 한다.

- 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.

 

package helloJpa;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="member") //해주지 않는 경우 클래스 네임이 테이블네임이 된다.
public class Member {

    @Id
    private Long id;

    @Column(name = "name") //db에는 name으로 들아간다.
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING) //db에는 enum타입이 없다. enum을 쓸때는 다음과 같은 어노테이션을 사용해준다.
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)  // TemporalType 안에는 날짜(DATA), 시간(TIME), 날짜시간(TIMESTAMP)가 있다.
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob //긴 컨텐츠를 넣고 싶으면 Lob 어노테이션을 사용한다.
    private String description;

    @Transient //db컬럼으로 사용하지 않는다.(생성 안됌)(메모리에만 사용함)
    private int temp;

    public Member() {
    }

    public Member(Long id, String username) {
        this.id = id;
        this.username = username;
    }

    public Long getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public Integer getAge() {
        return age;
    }

    public RoleType getRoleType() {
        return roleType;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }

    public String getDescription() {
        return description;
    }

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

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

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setRoleType(RoleType roleType) {
        this.roleType = roleType;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

 

@Column

- name : 필드와 매핑할 테이블의 컬럼 이름

- insertable , updateable : true, false로 사용이 가능하며 등록, 변경 가능 여부를 묻는다. 해당 컬럼 인서트할때나 업데이트를 해도 되는지 (디폴트 : true)

- nullable  : create할 때 null값 허용여부를 만든다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.

- unique : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. (unique는 잘 사용하지 않는다. ddl을 날릴 때에 unique 키 값을 랜덤으로 생성해서 복잡해진다. 그러므로 @Table 것을 사용하는게 좋다)
- columnDefinition : 컬럼 정의를 직접 할 수 있다. (ex : columnDefinition = "varchar(100) default 'EMPTY'"), 필드의 자바타입과 각 db의 방언 정보를 넣으면 된다.

- length : 문자 길이 제약조건 ,String 타입에만 사용한다 (ddl일 때이다)

- precision, scale : BigDecimal 타입에서 사용한다.(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자릿수를 ,scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다.

 

@Enumerated

자바 enum 타입을 매핑할 때 사용

주의! ORDINAL 사용 x

- 속성

ㄴ value

 > EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

 > EnumType.STRING : enum 이름을 데이터베이스에 저장

기본값 : EnumType.ORDINAL

 

- EnumType.ORDINAL 를 쓰면 안되는 이유는 다음과 같다.

 

public enum RoleType {
    USER, ADMIN
}

 

enum이 이런 상태인 경우

Member member = new Member();
member.setId(2L);
member.setRoleType(RoleType.USER);

entityManager.persist(member);
ts.commit();

 

 

저장 시에 enum의 순서가 들어간다.

즉 RolType.USER는 0번째 순서이므로 0이 들어간다. 만약 enum이 추가 될 경우 순서가 바뀔 위험한 상황이 생긴다.

 

그러므로 

@Enumerated(EnumType.STRING) //db에는 enum타입이 없다. enum을 쓸때는 다음과 같은 어노테이션을 사용해준다.
private RoleType roleType;

 

꼭 속성을 EnumType.STRING으로 잡아주고 사용해야 안전하다.

 

 

@Temporal

날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)


속성

-value

 

- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑

(: 2013–10–11)

-TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑

 

(: 11:11:11)

- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(: 2013–10–11 11:11:11)

 

@Temporal(TemporalType.TIMESTAMP)  // TemporalType 안에는 날짜(DATA), 시간(TIME), 날짜시간(TIMESTAMP)가 있다.
private Date createdDate;

@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;

private LocalDate testLocalDate;
private LocalDateTime testLocalDateTime;

 

 create table member (
       id bigint not null,
        age integer,
        createdDate timestamp,
        description clob,
        lastModifiedDate timestamp,
        roleType varchar(255),
        testLocalDate date,
        testLocalDateTime timestamp,
        name varchar(255),
        primary key (id)
    )

 

인서트 문이 이렇게 나가니 그냥 LocalDate나 LocalDateTime을 쓰면 된다.

 

@Lob

- @Lob에는 지정할 수 있는 속성이 없다.

- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

 > CLOB: String, char[], java.sql.CLOB

 > BLOB: byte[], java.sql. BLOB

 

 

@Transient

- 필드 매핑X

- 데이터베이스에 저장X, 조회X

- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용

- @Transient

   private Integer temp;

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함