[JPA] 객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다
-JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션이 필수
주의점
- 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없음
- DB에 저장하고 싶은 필드에는 final을 사용하면 안됨
@Entity 속성 name
- JPA에서 사용할 엔티티 이름을 지정
- 기본값 : 클래스 이름을 그대로 사용
- 같은 클래스 이름이 없으면 헤깔릴 수 있으므로 가급적 기본값 사용
@Table
: 엔티티와 매핑할 테이블 지정
- name 속성을 통해 매핑할 테이블 이름을 지정해줄 수 있음
데이터베이스 스키마 자동 생성
- JPA는 DDL을 애플리케이션 실행 시점에 자동 생성해준다.
(기존 방식처럼 테이블을 먼저 만든 뒤 SQL문을 보내지 않아도 됨)
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성해준다.(DB마다 다른 명령어들)
- 이렇게 생성된 DDL은 개발 장비에서만 사용하고 운영서버에서는 사용하지 않는다.
(의도치 않은 테이블 생성으로 실제 운영하고 있는 DB에 문제가 생길 수 있기 떄문,적절히 다듬은 후에는 사용가능)
데이터베이스 스키마 자동 생성 속성 - hibernate,.hbm2ddl.auto
public class JpaMain {
public static void main(String args[]){
//JPA는 항상 팩토리가 있어야 하는데 Web 서버가 올라오는 시점에 db 당 하나만 생성된다.
//persistence.xml에서 설정정보 읽어옴
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
emf.close(); //WAS가 내려갈때 닫아줘야함
}
}
<?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="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!--h2 DB에서만 쓰는 문법을 JDBC에 맞게 바꿔줘라 -->
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/> <!--sql쿼리가 콘솔에 출력되도록함 -->
<property name="hibernate.format_sql" value="true"/> <!--출력되는 쿼리가 이쁘게해줌 -->
<property name="hibernate.use_sql_comments" value="true"/> <!-- 쿼리가 왜나오는지 주석 위에 써줌 -->
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
EntityManagerFactory에서 JPA 설정정보를 가져왔었다.
name을 hello로 명시했었던 xml의 맨 아래 property를 보면 hibernate.hbm2ddl.auto라는 속성이 주석처리 되어있다.
해당 속성은 value에 아래와 같은 옵션을 넣어 사용할 수 있다.
1) create : 기존 테이블 삭제 후 다시 생성 (DROP+CREATE)
2) create-drop : create와 같으나 종류시점에 테이블 DROP
3) update : 변경분만 반영(없었던 속성을 추가하는 건 가능하나, 있었던 속성이 사라지진 않음)
4) validate : 엔티티와 테이블이 정상 매피되었는지 확인
5) none : 위의 어떤 옵션도 사용하지 않음. 의미상의 옵션으로, 이상한 값을 임의로 치거나 주석처리한 것과 같은 효과
위와 같은 스키마 자동 생성 속성은 사용에 주의가 필요하다.
특히 개발 때가 아닌 실제 운영 서버에는 절대 create, create-drop, update 옵션은 사용하면 안된다.
필요한 정보까지 프로그램 실행시 모두 삭제되거나 변경되기 때문이다.
따라서 개발 초기 단계에는 create 또는 update,
테스트 서버는 update 또는 validate,
스테이징과 운영 서버에는 validate 또는 none 옵션을 사용한다.
DDL 생성 기능
@Column(nullable=false, length=10) : 회원 이름은 null값이 될 수없으며 10자 초과 불가라는 제약조건 추가
@Table(uniqueConstraints={@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME","AGE"})})
위와 같은 DDL 생성과 관련된 어노테이션들은, DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는
영향을 주지 않는다.