F1
- Create Java Project
- Maven
- Maven-archetype-quickstart
- 1.4 버전
패키지 명 : dev.hibernate
프로젝트 명 : jpa2
터미널에 뭐 물어보면 Enter
2번 누르면 프로젝트 생성 완료
Open
클릭하면 새로운 프로젝트로 VS code가 자동으로 폴더를 열어준다.
현재는 Maven으로 만들어서 수정해야 하는 것, spring initializr
를 사용하면 굳이 설정할 필요 없다.
1.7
에서 1.8
으로 수정
<!-- JPA 구현체 Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.10.Final</version>
</dependency>
<!-- MySQL JDBC Driver -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
pom.xml의 <dependencies>
내에 코드 집어 넣기
main - 폴더 명 : resources
resources - 폴더 명 : META-INF
META-INF - 파일 명: persistence.xml
생성
<?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="jpa2"> <!-- 프로젝트 이름 -->
<properties>
<!-- property name -->
<!-- javax.persistence ~ : JPA 표준 속성 -->
<!-- hiberante ~ : JPA의 구현체 중 하나인 hibernate의 전용 속성 -->
<!-- DB와 연결하기 위한 필수 속성 -->
<!-- MySQL 설정 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="1234"/>
<!-- DB Dialect(방언) 설정(MySQL) -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 옵션(선택) 속성 -->
<!-- hiberante의 실행 과정에서 콘솔에 테이블 생성, DDL, DML 등 SQL문을 출력하도록 -->
<property name="hibernate.show_sql" value="true"/>
<!-- SQL 출력 형태 정렬 -->
<property name="hibernate.format_sql" value="true"/>
<!-- 주석문도 포함해서 출력 -->
<property name="hibernate.use_sql_comments" value="true"/>
<!-- **(중요) 애플리케이션 실행 시 DB 테이블을 자동으로 생성할 것인지 ? -->
<!-- create: 기존에 테이블이 존재하면 삭제(drop), 테이블 새로 생성, DROP + CREATE -->
<!-- update: DB테이블과 Entity(객체)의 맵핑(Mapping) 정보를 비교, 변경된 사항만 수정, 반영 -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence>
코드 복사 붙여넣기
hibernate - 폴더 명 : model
생성
model - 파일 명 : Student.java
, Major.java
생성
Id
, studentName
변수 선언 후 기본 생성자, Getter , Setter 생성하기
package dev.hibernate.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Student {
@Id // primary key 지정
@Column(name="STUDENT_ID") // DB TABLE의 COLUMN명을 STUDENT_ID로 지정
@GeneratedValue(strategy = GenerationType.IDENTITY)
// key 생성 전략, MYSQL AUTO_INCREMENT 설정
private Long Id;
@Column(name = "STUDENT_NAME")
private String studentName;
public Student() {
}
public Student(Long id, String studentName) {
Id = id;
this.studentName = studentName;
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
package dev.hibernate.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Major {
@Id
@Column(name="MAJOR_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
@Column(name="MAJOR_FIELD")
private String majorName;
public Major() {
}
public Major(Long id, String majorName) {
Id = id;
this.majorName = majorName;
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getMajorName() {
return majorName;
}
public void setMajorName(String majorName) {
this.majorName = majorName;
}
@Override
public String toString() {
return "Major [Id=" + Id + ", majorName=" + majorName + "]";
}
}
STUDENT : MAJOR = N : 1 (다대일 관계)
학생은 1개의 MAJOR를 갖지만, 하나의 MAJOR은 여러명의 STUDENT를 가질 수 있다.
STU는 MAJOR를 봤을 때 1개를 가질 수 있고 MAJOR는 STU를 봤을 때, N개를 가질 수 있다.
STUDENT CLASS에 MAJOR 필드가 있기 위해 추가할 코드 :
@ManyToOne // STUDENT와 MAJOR는 N:1 관계임을 명시하는 Annotation
@JoinColumn(name ="MAJOR_ID")
private Major major;
public Major getMajor() {
return major;
}
public void setMajor(Major major) {
this.major = major;
}
MAJOR_ID는 MAJOR TABLE에서 Primary key이고,
@JoinColumn(name ="MAJOR_ID")
를 통해 STUDENT CLASS에 MAJOR_ID를 Foriegn key로 넘긴다. (이해 제대로 안됐다 ㅠㅠ)
참고) STUDENT : MAJOR = N : M 는 교차 엔티티를 구성해서 해결한다.
package dev.hibernate;
import dev.hibernate.model.Major;
import dev.hibernate.model.Student;
public class App
{
public static void main( String[] args )
{
Student student1 = new Student(1L, "Doo");
Student student2 = new Student(2L, "Hyun");
Major major = new Major(1L, "컴퓨터 공학");
student1.setMajor(major);
student2.setMajor(major);
// student1이 속한 학과 조회
Major foundMajor = student1.getMajor(); // 컴퓨터 공학
System.out.println(foundMajor);
}
}
F5
눌러서 확인하기
-- STUDENT TABLE 생성
CREATE TABLE STUDENT(
STUDENT_ID INT(5) unsigned NOT NULL AUTO_INCREMENT,
MAJOR_ID INT(5) unsigned, -- 외래키 설정X, 일반 키
STUDENT_NAME VARCHAR(255),
PRIMARY KEY (STUDENT_ID)
);
-- MAJOR TABLE 생성
CREATE TABLE MAJOR(
MAJOR_ID INT(5) unsigned NOT NULL AUTO_INCREMENT,
MAJOR_NAME VARCHAR(255),
PRIMARY KEY(MAJOR_ID)
);
-- MAJOR_ID를 FOREIGN KEY로 설정하기 위한 QUERY
ALTER TABLE STUDENT
ADD CONSTRAINT FK_STUDENT_MAJOR
FOREIGN KEY (MAJOR_ID)
REFERENCES MAJOR(MAJOR_ID);
-- AUTO_INCREMENT에 의해 MAJOR_ID가 자동으로 설정된다.
-- MAJOR TABLE에 DATA 집어넣기
INSERT INTO MAJOR(MAJOR_NAME) VALUES ("CS");
-- STUDENT TABLE에 DATA 집어넣기
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Joo");
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Bong");
-- 외래키 사용, JOIN
SELECT M.*, S.STUDENT_NAME
FROM STUDENT S, JOIN MAJOR M ON S.MAJOR_ID = M.MAJOR_ID
WHERE S.STUDENT_ID = 1;
-- 오류 해결을 위한 코드였지만,, ㅎ
ALTER TABLE STUDENT CONVERT TO CHARSET utf8;
ALTER TABLE MAJOR CONVERT TO CHARSET utf8;
ddl.sql
파일 위치 확인!
1) STUDENT
, MAJOR
TABLE 생성하기
2) MAJOR TABLE에 DATA 집어넣기
INSERT INTO MAJOR(MAJOR_NAME) VALUES ("CS");
AUTO_INCREMENT에 의해 MAJOR_ID
는 자동으로 1이 들어갔다.
3) STUDENT TABLE에 DATA 집어넣기
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Joo");
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Bong");
AUTO_INCREMENT에 의해 STUDENT_ID
는 자동으로 1,2 가 들어갔다.
4) DESC STUDENT
를 통해 외래키 확인하는 법
KEY = MUL
인 MAJOR_ID
가 외래키이다.