Spring

JPA(2), ORM Annotation

Noooodle 2024. 6. 10. 15:49

ORM(Object Relational Mapping)

- Entity와 데이터베이스 테이블(들)간을 mapping 하는 방법

- Annotation 또는 XML을 이용

 

나는 이번에 Annotation 방법만 알아볼 것이다.


<기본적인 ORM Annotation>

 

@Entity

객체라고 지정

기본 생성자 필수(인자있는 생성자 있을때.. 없으면 자동생성)

final 정의 X

 

@Table(name="EXAMPLE")

대응되는 테이블 지정, 테이블과 Entity의 이름이 같으면 생략 가능함

 

@Id

식별자 필드 지정, 테이블의 PK(Primary Key)컬럼과 대응됨

Field 또는 Property(getter)에 적용 가능

float, double 등 정밀도의 제한이 있는 타입은 피해야 함

 

@Column(name="example")

테이블 내 대응되는 컬럼명 지정

 

@Transient

DB에 저장되지 않는 비영속적 필드

 


<복합 식별자 ORM Annotation>

1. @Embeddable, @Embeddedld 사용

- 복합 식별자 클래스 정의 -> 클래스에 @Embeddable annotation 붙이기

- Entity 클래스에서 복합식별자 클래스 필드 생성 -> 해당 필드에 @Embeddedld 붙이기

 

ex)

@Embeddable
public class AbcDefPK implements Serializble{ //Serializable 인터페이스 구현
	private int abc;
    private int def;
    
    public AbcDefPK(){ }; // 기본생성자
    
    @Override
    public boolean equals(Object obj){ .. 생략 }
  
  
  	@Override
    public int hashCode() { .. 생략}
}
@Entity
public class AbcDef implemets Serializable{
	@EmgeddedId
    private AbcDefPK id;
    
    ..
}

 

2. @IdClass, @Id 사용

- 복합 식별자 클래스 정의 -> 특별히 붙이는 annotationd 없음

- Entity 클래스에서 복합식별자 클래스 선언, 그리고 각 필드에 @Id붙이기

 

ex)

public class AbcDefPK implements Serializble{ //Serializable 인터페이스 구현
	private int abc;
    private int def;
    
    public AbcDefPK(){ }; // 기본생성자
    
    @Override
    public boolean equals(Object obj){ .. 생략 }
  
  
  	@Override
    public int hashCode() { .. 생략}
}
@Entity
@IdClass(AbcDefPK.class)
public class AbcDef implemets Serializable{
	@Id private int abc;
    @Id private int def;
    
    ..
}

 


<한 테이블 사용&Entity안에 객체 필드 선언할때 ORM>

@Embeddable

- 다른 객체에 포함되는 값 객체(value object)를 정의

- 독립적인 entity가 아니므로 식별자(PK)를 가질 필요 없음

@Embedded

- Entity 안 에서 값 객체 앞에 선언

 

테이블은 1개, Entity도 1개, 필드 일부 묶어서 Address Class로 사용

 

 

<하나의 Entity를 두 테이블에 나눠 저장하는 ORM>

@SecondaryTable

- Entity 1개에 두 개의 테이블을 mapping할때 사용

- join같은 역할을 함

 

 

<기타>

@Enumerated

@Temporal

@GerneratedValue