목록JPA (15)
Rootable의 개발일기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/YYuhz/btsrgOGRSsF/4Q9dG2EW8u8PyAD9soKSVk/img.png)
📌 프록시란 실제 클래스를 상속받아 만들어진 가짜 또는 원본을 위임받은 가벼운 객체 프록시 객체는 getClass() 정보에 "HibernateProxy"라는 정보가 붙는다. 📌 프록시 조회 em.find() : 영속성 컨텍스트로부터 타깃 엔티티를 조회, 만약 영속성 컨텍스트에 타깃이 없다면 DB에서 조회 후 영속성 컨텍스트에 저장 ➡ SQL 전송 o, 조회 o em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회 ➡ SQL 전송 x, 조회 o getReference() 시점이 아닌 getter 시점에 DB에 조회 SQL을 날림 📌 특징 1. 프록시는 실제 객체의 참조(target)을 보관한다. - 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드를 호출 2. 실..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OBp17/btsrrcTIPoX/9GVIk7Kngck0JAhZxEGVGk/img.png)
관계형 데이터베이스에서는 슈퍼타입과 서브타입을 통해 상속 관계를 대체한다. 이러한 슈퍼타입과 서브타입이라는 논리 모델을 실제 물리 모델로 구현하는 방법들을 살펴보자 📌 조인 전략 부모(슈퍼타입)와 자식(서브타입)을 각각 테이블로 변환하여, 각자가 가진 필드를 통해 참조하는 전략이다. 가장 논리적이고 객체 지향적인 방법으로 비즈니스적으로 중요도가 높게 사용된다. 아래와 같이 서브타입에 이름을 지정하면 데이터베이스에 해당 이름으로 필드에 저장된다. 🔎 특징 서브타입을 구분하는 컬럼(DTYPE)을 슈퍼타입이 가짐 슈퍼타입의 PK = 서브타입의 PK이면서 FK 🔎 장단점 ✔ 장점 테이블 정규화가 되어 중복을 줄일 수 있다. 외래키 참조 무결성 제약 조건을 활용할 수 있다. 다른 테이블에서 슈퍼타입 엔티티만 살펴..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lgVDX/btsrgO6WKD1/eSBPvxSBIruhp16y7DAwt1/img.png)
📌 객체의 연관 관계 매핑 관계형 DB는 외래키를 통해 연관 관계를 맺는다. 다음은 관계형 DB에 맞춘 엔티티 설계다. 아래 코드를 통해 연관 관계 엔티티인 Team을 저장하면 ID 값이 저장된다. Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); member.setTeamId(team.getId()); em.persist(member); tx.commit(); 이처럼 ID 값이 저장되기 때문에 em.find 한 번으로 객체 조회가 완료되지 않는다. try { ... Member findMember = em.find(Member.class..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bq8JXj/btsq2iaG3mF/tD1Q66j1MJ9BlxoA1IKmZK/img.png)
📌 엔티티 매핑(@Entity) 클래스에 @Entity를 선언하면 JPA가 관리하는 엔티티가 된다. 이로 인해 JPA는 애플리케이션 로딩 및 실행 시점에 매핑할 테이블을 자동 생성한다. 즉, create, insert 등의 DDL문을 자동으로 생성한다는 것이다. 다음과 같은 제약 조건을 줄 수 있다. @Entity public class Member { @Id private Long id; @Column(nullable = true, length = 10) //null 허용x, 길이 10 이하 private String name; private int age; ... JPA는 동적으로 객체를 생성하기 때문에 기본 생성자가 필수이며, 변경이 불가능한 필드를 선언해서는 안된다. final class enum..