create : 기존테이블 삭제 후 다시 생성
create-drop: create와 같으나 종료시점에 테이블 DROP
update: 변경분만 반영
validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
none: 사용하지 않음
1. name : 맵핑할 테이블의 컬럼 이름을 지정합니다;만약 없다면 맴버변수의 이름그대로 Colum에 적용됩니다.
2. insertable : 엔티티 저장시 선언된 필드도 같이 저장합니다. default=true
3. updateable : 엔티티 수정시 이 필드를 함께 수정합니다. default=true
4. table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
5. nullable : NULL을 허용할지, 허용하지 않을지 결정합니다. default=false
6. unique : 제약조건을 걸 때 사용합니다. default=false
7. columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
8. length : varchar의 길이를 조정합니다. 기본값으로 255가 입력됩니다.
9. precsion, scale : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미합니다.
AUTO(default):JPA 구현체가 자동으로 생성 전략을 결정한다.
IDENTITY : 기본키 생성을 데이터베이스에 위임한다. 예를 들어 MySQL의 경우 AUTOINCREMENT를 사용하여 기본키를 생성한다.
SEQUENCE: 데이터베이스의 특별한 오브젝트 시퀀스를 사용하여 기본키를 생성한다.
TABLE_: 데이터베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용하여 기본키를 생성한다.
name: 매핑할 외래 키의 이름을 지정할 때 사용한다
기본 값 : 참조하는 테이블의 컬럼명
referenceColumnName: 외래 키가 참조하는 자신의 테이블의 컬럼명을 의미한다
기본 값: 해당 맴버 변수의 이름.
etc) Column이 가지고 있는 옵션들
@Entity
public class A_Table{
.
.
.
@JoinColumn(name="column1")
private B_table b;
.
.
@JoinTable(
name = "MY_JT",
joinColumns = @JoinColumn(
name = "PROJ_ID", //외래키
referencedColumnName = "PID"
),
inverseJoinColumns = @JoinColumn(
name = "TASK_ID", //반대 외래키
referencedColumnName = "TID"
)
)
@OneToMany
private List<Task> tasks;
1) optional
해당 객체에 null이 들어갈 수 있을지를 결정하게 된다.
참고로 @Column 어노테이션에서도 nullable=true로 세팅해도 null이 들어갈 수 있다
defalut** : true2) fetch
엔티티의 로딩방식을 결정하게 된다.
EAGER이면 연관된 엔티티를 바로 로딩한다.
LAZY이면 연관된 엔티티를 바로 로딩하지 않고 실제로 해당 객체를 조회할 때 해당 엔티티를 로딩한다
Defalut
@ManyToOne=FetchType.EAGER
@OneToMany=FetchType.LAZY3) cascade:
영속성 전이 설정을 할 수 있다. 설정 값은 아래 cascadeType을 참고해주세요.
PERSIST 부모 엔티티를 저장할 때 자식 엔터티도 같이 저장된다.
REMOVE 부모 엔티티를 삭제하면 자식 엔터티도 같이 삭제된다.
DETACH 부모 엔티티가 detach 상태로 되면 자식 엔터티도 같이 detach 되어 변경사항이 반영되지 않는다.
REFRESH 부모 엔터티가 DB로부터 데이터를 다시 로드하면 자식 엔터티도 DB로부터 데이터를 다시 로딩한다
MERGE 부모 엔티티가 detach 상태에서 자식 엔터티를 추가/변경한 이후에 부모 엔티티가 merge를 수행하면 자식 엔터티도 변경사항이 적용된다.
ALL 모두 cascade 옵셕이 전용된다.
옵션의 경우 @ManyToOne과 같다.
일반적인 클래스
public class Company {
private Integer id;
private String name;
private String address;
private String phone;
private String contactFirstName;
private String contactLastName;
private String contactPhone;
// standard getters, setters
}
@Embeded, @Embedable활용 클래스
@Entity
@Embeddable
public class ContactPerson {
private String firstName;
private String lastName;
private String phone;
// standard getters, setters
}
public class Company {
@Id
@GeneratedValue
private Integer id;
private String name;
private String address;
private String phone;
@Embedded
private ContactPerson contactPerson;
// standard getters, setters
}
다음과 같이 @Embedable 어노테이션을 붙은 엔티티를 새롭게 재생성 하고 @Embeded밑에 끼워 넣음으로써 추상화를 시킬 수 있었습니다.
@Embedded
@AttributeOverrides({
@AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
@AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
@AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})