// Java Persistence API (JPA)를 사용하여 엔티티 매니저 팩토리(EntityManagerFactory)를 생성
// 영속성 유닛(persistence unit)에 대한 엔티티 매니저 팩토리를 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");
// 엔티티 매니저를 생성
EntityManager entityManager = emf.createEntityManager();
[출처] JPA & Spring Data JPA 기초
@Entity
어노테이션 또는 xml 설정을 통해 엔티티를 설정할 수 있다. 1. @Entity
name
: JPA에서 사용할 엔티티 이름 지정. name 속성을 사용하지 않을 경우 , 클래스이름을 엔티티 이름으로 지정2. @Table
name
: 매핑할 테이블 이름. 생략시 엔티티 이름(@Entity(name="~") 사용catalog
: catalog 기능이 있는 DB에서 catalog 매핑schema
: schema기능이 있는 DB에서 schema 매핑uniqueContraints
: DDL 생성시 유니크 제약조건 생성.(스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용 )3. @Id
@Id
어노테이션만 적게될 경우, 기본키값을 직접 부여해줘야 한다.@GeneratedValue
어노테이션을 사용하면 기본값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.4. @Column
name
: 필드와 매핑할 테이블의 컬럼 이름 지정. default는 필드이름으로 대체.insertable
: true (엔티티 저장시 필드값 저장) , false (필드값이 저장되지 않음)updatable
: true (엔티티 수정시 값이 수정) , false (엔티티 수정시 값이 수정 되지 않음)table
: 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용nullable
: null값 허용 여부 설정unique
: 컬럼에 유니크 제약조건 부여columnDefinition
: 데이터베이스 컬럼 정보를 직접 부여length
: 문자 길이 제약조건. String 타입일 때 사용precision, scale
: BigDecimal 타입에서 사용. precision (소수점을 포함한 전체 자릿수 설정)@Entity
@Table(name = "user")
public class User {
@Id
private String email;
private String name;
@Column(name = "create_date")
private LocalDateTime createDate;
protected User() {
}
public User(String email, String name, LocalDateTime createDate) {
this.email = email;
this.name = name;
this.createDate = createDate;
}
public String getEmail() {
return email;
}
public String getName() {
return name;
}
public LocalDateTime getCreateDate() {
return createDate;
}
public void changeName(String newName) {
this.name = newName;
}
}
// EMF.java
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class EMF {
private static EntityManagerFactory emf;
public static void init() {
emf = Persistence.createEntityManagerFactory("jpabegin"); // (1)
}
public static EntityManager createEntityManager() {
return emf.createEntityManager();
}
public static void close() {
emf.close();
}
}
(1) persistent.xml에 <persistence-unit>
태그의 name 속성값을 매개변수로 넘긴다.
public find(Class entityClass, Object primaryKey)
public class GetUserService {
public User getUser(String email) {
EntityManager em = EMF.createEntityManager();
User user = em.find(User.class ,email); // (1)
try {
if(user == null) {
throw new NoUserException();
}
return user;
} finally {
em.close();
}
}
}
(1) 엔티티 타입, ID 타입이 일치해야 한다. 일치하지 않은 경우 예외 발생한다.
public void persist(Object entity)
public class NewUserService {
public void saveNewUser (User user) {
EntityManager em = EMF.createEntityManager();
EntityTransaction tx = em.getTransaction(); // (1)
try {
tx.begin(); // (2)
em.persist(user); // (3)
tx.commit(); // (4)
} catch (Exception e){
tx.rollback(); // (5)
throw new RuntimeException(e);
} finally {
em.close();
}
}
}
(1) JPA의 모든 활동은 트랜잭션 안에서 이루지기 때문에 아래와 같이 트랜잭션을 얻는다.
(2) 트랜잭션이 시작된다. 데이터베이스에 접근해서 커넥션을 가지고 온 후 , 실제 트랙잭션을 시작한다.
(3) persist는 영구저장하다라는 의미이다. Entity를 영속성 컨텍스트에 저장한다.
(4) 트랜잭션을 수행한다.
(5) 작업에 문제 발생 시 되돌린다.
(6) EntityManager을 사용한 후에는 항상 close() 메서드를 호출하여 리소스를 해제해주어야 한다. ( 리소스 누수 , 트랙잭션 문제, 지연로딩 문제 등이 발생할 수 있음 .. )
트랜잭션(Transaction)이란? 🙄
1) 트랜잭션의 성질
Consistency(일관성)
Isolation(독립성,격리성)
Durablility(영속성,지속성)
2) 트랜잭션 연산 및 상태
출처
https://dundung.tistory.com/220
https://perfectacle.github.io/2018/01/14/jpa-entity-manager-factory/
https://onejunu.tistory.com/24
https://dev-troh.tistory.com/151
https://cjw-awdsd.tistory.com/46
JPA 2강 - JPA기초와 매핑 https://nanci.tistory.com/87
[DB기초] 트랜잭션이란 무엇인가? https://coding-factory.tistory.com/226
[데이터베이스] Transaction, 트랜잭션이란? https://wonit.tistory.com/462