[JPA 프로그래밍 입문] 엔티티 클래스의 제약 조건 및 기본 기능

기본 생성자

인자를 가진 생성자가 필요하다면 반드시 기본 생성자도 함께 정의해야 한다. 기본 생성자의 접근 범위는 public 이나 protected이어야 한다. private일 경우 JPA의 특정 기능이 올바르게 동작하지 않을 수도 있다.

// 기본 생성자
@NoArgsConstructor
// 이자를 포함한 생성자
@AllArgsConstructor
view raw blog13.java hosted with ❤ by GitHub

 

 

 

클래스 타입

엔티티는 클래스여야 한다. 인터페이스나 열거 타입으로는 엔티티 생성 불가

 

 

 

final

엔티티 클래스나 영속대상 필드는 final이면 안된다.

 

 

 


 

 

 

EntityManager의 엔티티 관련 기본 기능 (find, persist, remove …)

 

find() 메서드

entityManager의 find 메서드를 통해서 엔티티를 가져온다. 메서드의 첫번째 파라미터는 엔티티 클래스이며 두번째 파라미터는 키 값을 의미한다.

Hotel hotel = entityManager.find(Hotel.class, "H001-01");
if (hotel != null)
{
// code
}
view raw blog14.java hosted with ❤ by GitHub

 

 

 

getReference() 메서드

find() 메서드와 비슷한 getReference 메서드는 실제 엔티티가 아닌 프록시 객체를 반환한다. 반환된 프록시 객체에 접근하게 되면 실제 쿼리를 실행한다.

// 프록시 객체를 리턴한다.
Hotel hotel = entityManager.getReference(Hotel.class, "H001-01");
// 최초 데이터 접근시 쿼리 실행
String name = hotel.getName();
view raw blog15.java hosted with ❤ by GitHub

 

 

 

persist() 메서드

persist 메서드는 영속성 엔티티에 엔티티를 보관한다.

try {
transaction.begin();
Hotel hotel = new Hotel("KR-S-01", "서울호텔", Grade.STAR5);
// 영속 컨텍스트에 엔티티 보관
em.persist(hotel);
// Hibernate: insert into Hotel(grade, name, id) values (?, ?, ?)
transaction.commit();
}
view raw blog16.java hosted with ❤ by GitHub
try {
transaction.begin();
Hotel hotel = new Hotel("KR-S-01", "서울호텔", Grade.STAR5);
// auto_increment 포함시 persist 구문에서 DB 값 저장
// Hibernate: insert into Hotel(grade, name, id) values (?, ?, ?)
em.persist(hotel);
transaction.commit();
}
view raw blog17.java hosted with ❤ by GitHub

 

 

 

remove() 메서드

영속성 컨텍스트에 삭제 대상 엔티티를 추가하며 실제 커밋 시점에 해당 엔티티를 영속성 컨텍스트에서 삭제한다.

try {
transaction.begin();
Hotel hotel = em.find(Hotel.class, "H001-01");
if (hotel!= null) {
// 영속 컨텍스트에 삭제 대상 에니티티 추가
em.remove(hotel);
}
// 커밋 시점에 삭제 대상 처리
transaction.commit();
}
view raw blog18.java hosted with ❤ by GitHub

 

 

 

엔티티 수정

트랜잭션 범위 내에서 변경된 영속성 객체를 실제 DB에 반영한다. (더티 체킹)

if (room != null)
{
room.changeName("kafri");
}
transaction.commit(); // 트랜잭션 범위 내에서 변경된 영속 객체를 DB에 반영
view raw blog19.java hosted with ❤ by GitHub

 

 

 

식별자 생성 방식

  • 식별 컬럼 방식
  • 시퀀스 방식
  • 테이블 방식
// 식별 컬럼 방식
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
view raw blog20.java hosted with ❤ by GitHub
// 식별 컬럼 방식
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
view raw blog21.java hosted with ❤ by GitHub
// id_gen 생성
create table id_gen (
entity varchar(100) not null primary key,
nextid int
) engine innodb character set utf8;
view raw blog22.java hosted with ❤ by GitHub
// 테이블 방식 - 모든 DB에서 사용 가능
@Id
@TableGenerator(name="idgen",
table="id_gen",
pkColumnName="entity",
pkColumnValue="city", // 식별자로 엔티티의 이름을 사용하면 편리하다.
valueColumnNmae="nextid",
initialValue=0, // 초가값
allocationSize=1) // 증가값
@GeneratedValue(generator="idgne")
private Long id;
view raw blog23.java hosted with ❤ by GitHub

'기타 > 독서' 카테고리의 다른 글

[JPA 프로그래밍 입문] 엔티티(Entity)  (0) 2022.11.23

Designed by JB FACTORY