본문 바로가기

Development/DB, JPA

(15)
EntityManager 와 EntityManagerFactory Entity Manger FactoryEntity Manger 를 생성하기 위해서는 persistence.xml의 설정 정보를 사용해서 Entity Manger Factory를 먼저 생성해야한다.EntityManagerFactory emf = Psersistence.createEntityManagerFactory("name");Entity Manager Factory 생성 비용은 굉장히 크기 때문에, 애플리케이션 전체에 걸쳐 한 번 생성하고 재사용 해야 한다.Entity Manager Entity Manager Factory 에서 Entity Manager를 생성한다.EntityManager em = emf.createEntityManager();JPA 대부분의 기능은 Entity Manger 가 제공한..
Persistence Context 영속성 컨텍스트 Persistence Context - 영속성 컨텍스트영속성 컨텍스트는 엔티티 매니저를 생성할 때 같이 만들어 지며 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. 즉, 엔티티 매니저가 하는 어떤 행위는 영속성 컨텍스트에 반영되고 이것이 최종적으로 DB에 반영된다.특징식별자 값영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다(@Id 애노테이션)데이터베이스와의 관계영속성 컨텍스트에 엔티티가 저장된다고 바로 DB에 반영되는 것이 아니라 일반적으로 트랜잭션이 커밋될 때 DB에 반영된다.(flush)영속성 컨텍스트에 엔티티를 관리할 때의 장점1차캐시동일성 보장트랜잭션이 지원되는 지연 쓰기변경 감지지연 로딩Entity Life Cyclenew / transient : 비영속 상태라고 하며 영속성 컨텍스..
트랜잭션, 트랜잭션 격리수준(Isolation Level) 1. 트랜잭션이 보장해야 하는 ACID격리수준을 설명하기에 앞서 ACID에 대해 알아보자. 원자성 (Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주한다. 모두 성공 또는 모두 실패되어야 한다. 일관성 (Consistency) : 모든 트랜잭션은 일관성 있는 데이타베이스 상태를 유지한다. 이를테면 DB에서 정한 무결성 조건을 항상 만족.격리성 (Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리 해야한다.지속성 (Durability) : 트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.이 중 격리성(Isolation)에 대한 이슈가 있다.격리성을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생한..
@MappedSuperclass 에 관하여 ... @MappedSuperclass 에 관하여 일반적으로, 상속 관계 매핑 전략에서 부모 클래스와 자식 클래스 모두 데이타베이스 테이블과 매핑을 한다. 이와 달리, 부모 클래스를 상속받는 자식클래스에게 매핑 정보만 제공하고 싶을때 이 어노테이션을 사용하면 된다. 엔티티 종류에 상관없이 공통으로 가지고 있어야 하는 정보가 있다면 ( ex. 데이타 생성시간, 수정시간 등 ) 공통 클래스로 추출하고 이를 상속받는 방식으로 구현할 때 사용 한다. 그러나 엔티티는 엔티티만 상속받을 수 있기 때문에 엔티티가 아닌 클래스를 상속받기 위해서 @MappedSuperclass 를 사용한다. 예제 아래 2개의 엔티티를 보자. @Data@Entitypublic class Car extends BaseEntity {​ @Id @G..
Lazy Exception 과 Hibernate.initialize() 코딩을 하면서 트랜잭션과 관련된 문제는... 보고 당해도 늘 또 당한다... 하이버네이트에서 매핑된 객체를 가져올 때, OneToMany, ManyToMany는 LazyFetch를 기본전략으로 하고 있다. 따라서, 해당 객체를 부모객체가 자식객체를 가지고 올때는, 프락시 객체만 가지고 있으며, 실제 사용하는 시점 DBMS에 쿼리가 날아간다. 그런데 ! ! 부모 객체를 가져오고 세션이 닫힌 뒤, 자식 객체를 콜하게 되면 org.hibernate.LazyInitializationException: could not... 익셉션이 발생 ! 여러가지 해결 방법이 있는데,, 1. Fetch 설정을 Eager로 해주는 가장 단순하고 위험한 방법이 있고,2. DAO 에서 부모객체를 가져올때 Hibernate.Init..
CASCADE, 영속성 전이 특정 엔티티를 영속 상태로 만들 때, 연관 엔티티를 함께 영속 상태로 만들고 싶은 경우 영속성 전이를 사용하면 된다.JPA 에서는 CASCADE 옵션으로 사용할 수 있다. 즉, CASCADE 설정으로 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 아래 Team 과 Member의 엔티티를 보자. @Getter @Setter @Entity public class Team { @Id @GeneratedValue private String teamId; @OneToMany(mappedBy = "team", cascade = CascadeType.PERSIST) private List member = Lists.newArrayList(); }@Getter @Setter @Entity public ..
지연로딩과 즉시로딩 다음과 같은 엔티티 관계가 있다고 하자 Member : Team = N : 1 Member Entity@Getter @Setter @Entity public class Member { @Column(name = "memberName") private String memberName; @ManyToOne @JoinColumn(name = "teamId") private Team team; }Team Entity@Getter @Setter @Entity public class Team { @Column(name = "teamId") private String teamId; } 즉시 로딩 : 엔티티 조회 시 연관된 엔티티도 함께 조회.@ManyToOne(fetch = FetchType.EAGER) // 또는 ..