java 스프링부트 ( spring boot ) / JPA ( 3 ) Entity Mapping

김동명·2022년 12월 16일
0

스프링부트

목록 보기
13/19

프로젝트 설정

  • 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
  • resources > META-INF 폴더 생성 > persistence.xml 생성
    • hibernate.hbm2ddl.auto 옵션
      • 데이터베이스 스키마 자동생성 옵션
      • create : 기존 테이블 삭제 후 다시 생성 ( drop + create )
      • create-drop : create와 같으니 종료시점에 테이블 drop
      • update : 변경분만 반영
      • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
      • none : 사용하지 않음
<?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

- @Entity가 붙은 클래스는 JPA가 관리하고 엔티티라고 한다.
- JPA를 사용하여 테이블과 매핑할 클래스에는 @Entity를 필수적으로 붙여주어야한다.
- 기본 생성자 필수
- enum, interface등의 다른종류의 클래스는 사용 할 수없다.
- 저장할 필드 ( 전역변수 ) 에 final을 사용 할 수 없다.
- 속성 : name - JPA에서 사용할 Entity 이름을 지정한다.  -> 기본값을 사용 할 것을 권장

- @Table

- 엔티티와 매핑할 테이블 지정
- 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	: 특정 필드를 컬럼에 매핑하지 않음

- @Column

- 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 이름



시작

1. 제약 조건 추가

  • 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 ) 실행 시



## 2. 기본 키 매핑
  • 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();		
		}
	}
}
profile
코딩공부

0개의 댓글