@Entity
@Table
public class Member {
@Id
private Long memberId;
}
[코드] 엔티티와 테이블 간의 매핑
@Entity
애너테이션 설명
애트리뷰트
@Entity(name="USERS")
@Table
애너테이션 설명
애트리뷰트
@Table
애너테이션은 옵션이며, 추가하지 않을 경우 클래스 이름을 테이블 이름으로 사용한다.JPA에서는 기본적으로 @Id 애너테이션을 축자한 필드가 기본 키 열이 되는데, JPA에서는 일한 기본키를 어떤 방식으로 생성해 줄지에 대한 다양한 전략을 지원한다.
기본키 직접 할당
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id // (1)
private Long memberId;
public Member(Long memberId) {
this.memberId = memberId;
}
}
기본키 직접 할당 전략은 @Id 애너테이션만 추가하면 된다.
@Configuration
public class JpaIdDirectMappingConfig {
private EntityManager em;
private EntityTransaction tx;
@Bean
public CommandLineRunner testJpaSingleMappingRunner(EntityManagerFactory emFactory){
this.em = emFactory.createEntityManager();
this.tx = em.getTransaction();
return args -> {
tx.begin();
em.persist(new Member(1L)); // (1)
tx.commit();
Member member = em.find(Member.class, 1L);
System.out.println("# memberId: " + member.getMemberId());
};
}
}
[코드] 기본키 직접 할당 예
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // (1)
private Long memberId;
public Member(Long memberId) {
this.memberId = memberId;
}
}
[코드] IDENTITY 기본키 생성 전략 설정
@GenerationValue
애너테이션의 strategy 애트리뷰트의 값을 GenerationType.IDENTITY
로 지정해 주면 된다.INDENTITY가 실제로 기본키를 자동 생성해주는지에 대해 알아보면
@Configuration
public class JpaIdIdentityMappingConfig {
private EntityManager em;
private EntityTransaction tx;
@Bean
public CommandLineRunner testJpaSingleMappingRunner(EntityManagerFactory emFactory){
this.em = emFactory.createEntityManager();
this.tx = em.getTransaction();
return args -> {
tx.begin();
em.persist(new Member());
tx.commit();
Member member = em.find(Member.class, 1L);
System.out.println("# memberId: " + member.getMemberId());
};
}
}
[코드] IDENTITY 기본키 생성 전략을 통한 엔티티 저장
NoArgsConstructor
@Getter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE) // (1)
private Long memberId;
public Member(Long memberId) {
this.memberId = memberId;
}
}
[코드] SEQUENCE 기본키 생성 전략 설정
@Configuration
public class JpaIdIdSequenceMappingConfig {
private EntityManager em;
private EntityTransaction tx;
@Bean
public CommandLineRunner testJpaSingleMappingRunner(EntityManagerFactory emFactory){
this.em = emFactory.createEntityManager();
this.tx = em.getTransaction();
return args -> {
tx.begin();
em.persist(new Member()); // (1)
Member member = em.find(Member.class, 1L);
System.out.println("# memberId: " + member.getMemberId());
tx.commit();
};
}
}
[코드] SEQUENCE 기본키 생성 전략을 통한 엔티티 저장
IDENTITY
Dialect는 표준 SQL 등이 아닌 특정 데이터베이스에 특화된 고유한 기능을 의미한다. 만일 JPA가 지원하는 표준 문법이 아닌 특정 데이터베이스에 특화된 기능을 사용할 경우 Dialect가 처리해준다.
@Getter
@Setter
@NoArgsConstructor
@Entity(name="Member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 추가
private Long memberId;
//unique= 해당 열에 중복된 값 허용 x
@Column(nullable = false,updatable=false,unique=true)
private String email;
public Member(String email){
this.email = email;
}
}
[코드] email필드에 열 매핑 애너테이션 추가
@Column 애너테이션은 필드와 열을 매핑해 주는 애너테이션이다. 만약 @Column 애너테이션이 없고, 필드만 정의되어 있다면, JPA는 기본적으로 이 필드가 테이블의 열과 매핑되는 필드라고 간주하게 된다. 또한, @Column 애너테이션에 사용되는 애트리뷰트의 값은 디폴트 값이 모두 지정된다.
애트리뷰트
null테스트
private void testEmailNotNull(){
tx.begin();
em.persist(new Member());
tx.commit();
}
[코드] null 테스트를 위한 메서드
update
private void testEmailUpdatable(){
tx.begin();
em.persist(new Member("hgd@gmail.com"));
Member member = em.find(Member.class,1L);
member.setEmail("hgd@gmail.co.kr");
tx.commit();
}
[코드] update 테스트를 위한 메서드
private void testEmailUnique(){
tx.begin();
em.persist(new Member("hgd@gmail.com"));
em.persist(new Member("hgd@gmail.com"));
tx.commit();
Member member = em.find(Member.class,2L);
}
[코드] unique를 확인해보기 위한 메서드