프로젝트 설정
application.properties
#port
server.port=9090
#encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true
sqlplus
create user springjpa identified by springjpa;
grant connect, resource to springjpa;
Database : XE
username = springjpa
password = springjpa
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="javax.persistence.jdbc.user" value="springjpa" />
<property name="javax.persistence.jdbc.password" value="springjpa" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- 테이블 생성 옵션 ( 필요할 때만 사용 ) -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true" />
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true" />
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
ㅇ 개념 정리
- @Entity가 붙은 클래스는 JPA가 관리하고 엔티티라고 한다.
- JPA를 사용하여 테이블과 매핑할 클래스에는 @Entity를 필수적으로 붙여주어야한다.
- 기본 생성자 필수
- enum, interface등의 다른종류의 클래스는 사용 할 수없다.
- 저장할 필드 ( 전역변수 ) 에 final을 사용 할 수 없다.
- 속성 : name - JPA에서 사용할 Entity 이름을 지정한다. -> 기본값을 사용 할 것을 권장
- 엔티티와 매핑할 테이블 지정
- name : 매핑할 테이블 이름
- catalog : 데이터베이스 catalog 매핑
- schema : 데이터베이스 schema 매핑
- DDL ( uniqueConstraints ) : DDL 생성 시에 유니크 제약 조건 생성
- 애플리케이션 실행 시점에 DDL을 테이블에 자동으로 생성한다.
- 테이블 중심 - > 객체 중심
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
- @Column ( nullable = false, length = 10 ) : 회원이름 not null, 길이 10 자
- @Temporal : 날짜 타입 매핑
- @Enumerated : enum 타입 매핑
- @Lob : BLOB, CLOB 매핑
- @Transient : 특정 필드를 컬럼에 매핑하지 않음
- name : 필드와 매핑할 테이블의 컬럼 이름
- nullable : null 값의 허용 여부 설정 / false 로 설정하면 not null 제약조건 붙는다.
- unique : 한 컬럼에 대해 unique 제약조건을 걸 때 사용
- length : 문자 길이 제약조건, String 타입에만 사용
- @Id : pk 등록
- @GeneratedValue
ㅇ 자동생성 전략
- identity : 데이터베이스에 위임
- sequence : 데이터베이스 시퀀스 오브젝트 사용
@SequenceGenerator 필요
- table : 키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator
- auto : 방언에 따라 자동 지정, 기본값
- @SequenceGenerator
- name : 식별자 이름
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
ex) hibernate_sequence
- initialValue : 시퀀스 DDL을 생성 할 때 처음 시작하는 수 지정
- allocationSize : 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정
- catalog, schema : 데이터베이스 catalog, schema 이름
시작
Member.java
수정@Entity
@Getter @Setter
@Table(name = "MBR") // 테이블명 매핑
public class Member {
@Id
private Long id;
@Column(unique = true, length=10)
private String name;
//컬럼명 지정
@Column(name= "myage")
private int age;
//날짜 타입 매핑
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
//날짜 타입 매핑
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
//매핑 무시
@Transient
private int temp;
}
JpaMain2.java
) 실행 시Member2.java
생성@Entity
@Getter @Setter
public class Member2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name="name" ,nullable = false)
private String username;
}
JpaMain3.java
생성public class JpaMain3 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// transcation 발생
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member2 member2 = new Member2();
member2.setUsername("Hello");
em.persist(member2);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}