2021년 12월 18일 토요일

(JPA동영상교육)스프링, JPA 엔티티(Entity)란?, 자바교육학원/스프링교육학원/자바동영상/JPA학원/JAVA학원

 

















엔티티(Entity)


  • JPA의 엔티티는 테이블을 객체로 표현한 자바 클래스이다.  이 엔티티의 인스턴스는 테이블의 행을 나타내고 대체로 다른 엔티티와 관계를 맺고 있으며 이러한 관계(오브젝트/관계) 메타데이터는 클래스에 어노테이션(@ManyToOne, @OneToMany, @OneToOne, @ManyToMany)을 기술하거나 XML 파일 등에서 설정할 수 있다. 이러한 엔티티는 구현 클래스 또는 추상 클래스가 될 수 있으며 특성 또는 필드를 사용하여 상태를 관리한다.
  • @Entity, @Table 어노테이션을 이용하여 엔티티와 테이블을 매핑한다.
  • JPQL(Java Persistence Query Language)은 지속적 엔티티를 저장하는 데 사용되는 메커니즘과 독립적으로 지속적 엔티티에서 검색을 정의하는 데 사용되는데  데이터베이스와 관련된 SQL을 사용하지 않고 오브젝트를 검색하는 언어이다.
  • 엔티티의 4가지 생명주기
  • 비영속 객체(new/transient) : new 키워드를 생성한 엔티티 객체이며 아직 Managed 상태가 아니다. 메모리 상의 객체로만 존재하고 데이터베이스와 관계가 맺어지지 않은 상태를 비영속 상태(transient state)라고 한다.
  • 영속 객체(managed) : new 키워드를 엔티티 객체를 perist 메소드를 이용해서 저장한 경우 또는 DB의 데이터를 find나 query등으로 조회한 경우인데 영속성 컨텍스트에 저장된 상태이다. 데이터베이스와 연관 관계를 가지고 있는 상태를 영속 상태(persistence state)라고 하며 이상태에 있을 때는 변경 사항이 자동감지 된다.
  • 삭제 객체(removed) : 영속객체 즉 Managed 상태인 객체를 remove 메소드로 삭제한 경우, 작업이 커밋되는 시점에 DB에 동기화 된다.
  • 준영속 객체(detached) : 트랜잭션이 커밋되었거나 clear, flush 메소드가 실행된 경우 모든 영속객체의 상태는 준영속 상태(Detached) 상태가 된다. 영속성 컨텍스트에서 분리된 상황이며 merge 메소드로 다시 영속객체가 될 수 있다.


  • 엔티티는 JPA가 생성할 때 기본 생성자를 이용하므로 반드시 기본 생성자를 가져야 하며 식별자 프로퍼티(@Id)가 반드시 존재 해야 한다.
  • final 클래스는 엔티티가 될 수 없다. Proxy를 생성할 때 자식클래스 형태로 만드는데 final 클래스는 상속되지 않는 클래스이므로 불가하다. 만약 final 메소드를 가진 클래스를 엔티티로 사용하려면 명시적으로 lazy=“false”로 설정해서 Proxy 생성을 막아야 한다.
  • 하이버네이트는 기본적으로 자바빈의 프로퍼티를 테이블의 칼럼에 매핑하며 getter/setter 메소드를 자동 인식한다.
  • 하이버네이트에서는 기본적으로 동일한 세션에서만 엔티티 객체에 대해 Persistent identity(데이터베이스 행의 식별)과 Java identity(데이터베이스행에 대응되는 자바객체의 식별)을 보장하므로 여러 세션에서 같은 객체로 인식되게 하기 위해서는 equals(), hashCode()를 오버라이딩 해야 한다. 특히 엔티티(영속 클래스)를 컬렉션 등에 담을 때는 반드시 equals(), hashCode()를 구현해야 한다.

[하이버네이트 예]

Session sessionA = sessionFactory.openSession();


// 사번(식별자)으로 데이터 읽기

Emp emp1 = sessionA.get(Emp.class, new Integer(7369) );

Emp emp2 = sessionA.get(Emp.class, new Integer(7369) );


// 이 경우 emp1과 emp2는 동일하다.(emp1 == emp2)

session1.close();

// 이때 emp1과 emp2는 영속성 컨덱스트에서 빠져나와 detached 상태가 된다. 


Session sessionB = sessionFactory.openSession();

Emp emp3 = sessionB.get(Emp.class, new Integer(7369) );

......

......

// 이 경우 emp1, emp2와 emp3 객체는 세션이 다르기 때문에 동일하지 않다.

// emp1, emp2는 detached 객체이고 emp3은 영속성 객체이다.

// 위 세개의 객체는 PK값 자체로 보면 모두 7369라는 사번을 가지는 객체이므로 사번으로 비교하면 같은 객체로 인식이 가능하다.


자바의 equals 메소드로 위 세객체를 비교한다고 했을 때 Emp 클래스가 equals 메소드를 구현하지 않았다면 Object 클래스의 equals로 비교하므로 == 와같은 의미이다.


위 세개의 객체를 자바 컬렉션(Set)에 emp1, emp2, emp3 순서로 추가한다고 가정해 보자. 

Set은 순서도 없고 중복도 허락하지 않는 객체이므로 추가 될 때 equals 메소드로 비교하여 같은 것이 없는 경우에만 추가한다. Emp 클래스가 equals를 구현하지 않았다면 == 로 비교하여 판단하므로 세 객체중 emp1, emp3 두객체가 저장 될 것이다. 만약 같은 사번의 객체가 하나만 저장되기를 원한다면 euqals 메소드를 구현해야 한다.



#JPA교육, #JPA강좌, #JPA학원, #엔티티, #JPA엔티티, #JPAEnrity, #JPA동영상, #스프링교육, #자바교육, #스프링학원, #자바학원, JPA교육, JPA강좌, JPA학원, 엔티티, JPA엔티티, JPAEnrity, JPA동영상, 스프링교육, 자바교육, 스프링학원, 자바학원,






댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...