H2 설치 경로 : http://www.h2database.com/
설치 후에는 h2파일의 bin폴더안에 h2.bat 파일을 실행시킨다.
h2.bat 파일을 실행하면 자동으로 h2 데이터베이스 페이지가 열린다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<?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"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<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>
JPA는 특정 데이터베이스에 종속하지 않는다
- 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다.
MySQL : VARCHAR 일때 Oracle은 VARCHAR2를 사용한다.
이처럼 데이터베이스들은 서로 다른 문법을 사용하기 때문에 JPA는 방언을 통해 서로 다른 문법들을 처리한다.
방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
<= MySQLDBDialect(Mysql방언)
JPA => Dialect(방언) <= OracleBDialect(Oracle방언)
<= H2DBDialect(H2방언)
@Entity : 해당 클래스가 엔티티임을 명시하기 위한 어노테이션으로 클래스 자체는 테이블과 일대일로 매칭되고 해당 클래스의 인스턴스는 매핑되는 테이블에서 하나의 레코드를 의미한다.
@ID : 엔티티 클래스의 필드는 테이블의 칼럼과 매핑된다. 해당 어노테이션이 선언된 필드는 테이블의 기본값 역할로 사용된다. 또한 모든 Entity는 꼭 @ID를 필요로 한다.
@Table(name="tablename") : Entity클래스는 테이블과 매핑되므로 특별한 경우가 아니면 @Table이 필요하지가 않다. 해당 어노테이션은 클래스의 이름과 테이블의 이름을 다르게 지정하는 경우 사용한다.
@Column : DB에 저장되는 테이블 칼럼의 설정을 담당함(칼럼명을 정하거나 칼럼을 설정값들을 정함 유니크값인지, not null인지 등등)
@Column(name="cloumnname") : 엔티티 클래스의 필드는 자동으로 테이블 칼럼으로 매핑된다.
@Column(nullable = false) : not null이 찍힘
@Column(length=10) : 데이터베이스에 저장하는 데이터의 최대 길이
unique : 해당 컬럼 유일성 보장
@Transient : Entity 클래스에는 선언돼 있는 필드지만 데이터베이스에서는 필요없는 경우 이 이노테이션을 사용해 데이터베이스에서 이용하지 않게 할 수 있다.
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer price;
@Column(nullable = false, name = "stock")
private Integer stock;
@Transient
private String test;
private LocalDateTime createdAt;
private LocalDateTime updateAt;
}
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
private Long id;
@Column(name="username")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class JpaMain {
static EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // jpa 설정파일에서 지정한 설정이름 작성
static EntityManager em = emf.createEntityManager();
// Factory에서 유저의 요청이 있으면 EntityManager를 통해 작업을 한다.
static EntityTransaction tx = em.getTransaction(); // jpa는 꼭 트랜잭션을 통해 실행됨
public static void main(String[] args) {
JpaMain jp = new JpaMain();
tx.begin(); // 트랜잭션 실행
// 실제 동작하는 코드 작성하는 공간
try {
jp.add(); // insert
jp.update(); // update
tx.commit(); // DB에 데이터 전송
} catch (Exception e) {
tx.rollback();
} finally {
em.clear();
emf.close();
}
}
// insert
public void add(){
Member member = new Member(); // DTO 호출
member.setId(4L); // DTO에 값 넣음
member.setName("HelloA");
em.persist(member); // jpa에 데이터를 저장함
}
// update
public void update(){
Member findMember = em.find(Member.class,1L); // 1의 값을 가져옴
findMember.setName("test");
}
}