본문 바로가기

legacy/JPA

(30)
[JPA] RDB에서 슈퍼클래스, 서브클래스를 ORM에서 다뤄보자, @Inheritance 자바에서는 부모 클래스와 하위 클래스로 이루어진 상속 관계가 존재합니다. 그러나 RDB에서는 상속 관계가 존재하지 않습니다. RDB에서는 슈퍼 타입과 서브 타입 관계가 존재하는데, 이 모델링 기법이 상속 관계와 유사합니다. ORM에서 슈퍼 타입과 서브 타입을 어떻게 다루는지 알아봅시다. 상속관계 매핑 ORM에서 슈퍼 타입과 서브 타입 관계를 다루기 위해 다음 3가지 전략이 존재합니다. 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 이러한 전략을 사용하기 위해서는 @Inheritance 애너테이션을 사용해야 합니다. @Inheritance의 기본 전략은 단일 테이블 전략입니다. 조인 전략 Album, Movie, Book 엔티티는 id, name, price 필드가 공통적으로 사용됩니다. 따라서..
[JPA] 연관관계에 대해서 쉽게 이해하기, 단방향과 양방향 조회 JPA에서는 ORM(Object-Relation Mapping)을 사용합니다. SQL을 통해서 DB에 접근하는 것이 아니라, 객체와 DB의 테이블을 Mapping 하여 데이터를 다룹니다. 객체와 테이블을 Mapping 하기 때문에 연관관계라는 것이 등장하게 됩니다. 연관관계란 객체와 테이블의 외래키(Foreign Key)를 연결해주는 것을 의미합니다. 연관관계를 맺어줌으로써 객체를 통해 DB의 테이블에 접근할 수 있는 것이죠. 단방향 연관관계 단방향 연관관계란 이름에서도 알 수 있듯이, 한 개의 방향으로만 연관관계가 맺어져 있음을 의미합니다. 한쪽 방향으로만 연관관계가 맺어져 있다면 A -> B로 조회가 가능하지만, B -> A로의 조회는 불가능합니다. Member 엔티티 회원은 하나의 팀에 소속할 수 ..
[JPA] Oracle SEQUENCE 전략 PK 공유 문제 Oracle DB를 사용할 때 PK를 SEQUENCE 전략을 사용한다면 JPA에서 주의해야 할 점이 있다. 각각의 테이블에 사용할 SEQUENCE를 지정해주지 않으면 모든 테이블이 PK를 공유하는 문제가 발생한다. 시퀀스를 공유하는 테이블 Member 엔티티 PK를 보면 SEQUENCE 전략을 사용하고 있다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleTy..
[JPA] DB IDENTITY 전략일 때, 영속성 컨텍스트 JPA의 경우에 EntityManager를 통해 persist를 하면 해당 객체는 영속 상태가 된다. DB에 저장된 상태가 아닌 1차 캐시에 ID-Entity 형태로 JPA에 의해 관리가 된다. 또한 Member 엔티티를 DB에 저장하기 위한 Insert 쿼리문이 DB로 날라가지 않고 쓰기 지연 저장소에 보관된다. 아래는 Member 엔티티를 persist 하였을 때, 1차 캐시에 저장되어 JPA에 의해 관리 중인 상태이다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.g..
[JPA] Spring Data Jpa 쿼리문, ClassCastException 예외 jpa로 쿼리문을 작성하는데 자꾸 예외가 터졌는데 조금 헤맸다. 잘못된 쿼리문 Optional existsByBookNameAndUserIdAndIsReturn (String bookName, Long userId, boolean isReturn); 난 위의 쿼리문이 다음과 같은 SQL문을 기대했고 LoanHistory 객체가 반환될 것이라 생각했다. SELECT * FROM loan_history WHERE book_name = ? AND user_id = ? AND is_return = ? 근데 아래와 같이 ClassCastException 예외가 터졌다. Boolean 타입이 LoanHistory 타입으로 타입 변환이 안 된다고 한다. Spring Data Jpa에서 exists 쿼리문은 boole..
[JPA] Identity전략, JdbcSQLFeatureNotSupportedException jpa에서 기본키 전략을 사용할 때 아래 코드를 사용할 것이다 @GeneratedValue(strategy = GenerationType.IDENTITY) 근데 기본키 전략을 사용할 때 숫자형 타입을 사용해야 한다. String을 사용하지 말자 @Id @Column(name = "id", length = 10) @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; 기본키로 String 타입을 지정했었는데 아래의 오류가 발생했다. ddl에 문제가 있음을 알 수 있다. 위의 오류에 대해서 검색해보니 기본키 전략을 사용할 때 숫자 타입 Long을 사용해야 한다고 한다. https://www.inflearn.com/questions/382..