본문 바로가기

Spring/JPA

(30)
JPA- 페이징 package jpql; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpqlMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); Entit..
JPA- 프로젝션 프로젝션 프로젝션이란 select 절에 조회할 대상을 쿼리를 통해서 지정하는 것을 의미한다. 만일 엔티티 Member에 name, age라는 필드가 존재하고 그 중 내가 name을 조회하고 싶다라면 조회할 대상으로 name을 지정하는 것을 의미한다. jpql을 통해서 값 가져오기 예시) 연관 관계 엔티티 프로젝션 package jpql; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class Jpq..
JPA- 기본 문법과 쿼리 API jpql 쿼리를 통해 값 찾아오기 package jpql; import javax.persistence.*; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { Member member = new Member(); em.persist(member); // TypedQuery: 반..
JPA- 값 타입 컬렉션 대략적인 개요 위의 Member 테이블을 구현하면 다음과 같다. Member.class @Entity @Getter @Setter public class Member /*extends BaseEntity*/ { @Id //id 직접 할당 (member.setId()로 id 넣어줘야함) @GeneratedValue // id를 자동 생성해서 넣어줌(현재는 디폴트값: strategy = GenerationType.AUTO) @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME", nullable = false) // 매핑할 컬럼명이 "USERNAME". + not null 설정 private String userName; public M..
JPA- 값 타입의 비교 값 타입의 비교 임베디드 타입의 경우 아무래도 객체이므로 "==" 비교시에는 서로 다른 인스턴스를 가지므로 false가 나오게 된다. package hellojpa; public class ValueMain { public static void main(String[] args) { Address address1 = new Address("city","street","zipcode"); Address address2 = new Address("city","street","zipcode"); int a, b; a = b = 10; System.out.println("int a == int b: " + (a == b)); System.out.println("address1 == address2: " + (a..
JPA- 값 타입과 불변 객체 값 타입 공유참조의 위험성 서로 다른 엔티티에서 동일한 값 타입을 공유하는 경우, 하나의 엔티티에서 값 타입을 변경하는 경우 이것이 다른 엔티티에서도 영향을 미치게 되는 부작용이 발생할 수 있다. 문제 발생 예시 Member.class @Entity @Getter @Setter public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME", nullable = false) private String userName; @Embedded // @Embedded: 임베디드 타입 사용하는 곳에 사용 private Address homeAdd..
JPA- 임베디드 타입 JPA 데이터 타입 엔티티 타입 JPA의 데이터 타입은 엔티티 타입과 값 타입 두가지로 구성된다. 엔티티는 기본적으로 우리가 많이 보았듯이, @Entity를 사용하며 값이 변경되어도 ID와 같은 식별자로 여전히 구분이 가능하다. @Entity를 사용 식별자로 추적이 가능 값 타입 값 타입은 int, double과 같은 기본 타입과, Integer, Long 같은 래퍼 클래스, 임베디드 타입, 컬랙션 타입으로 구성된다. 엔티티와는 달리 변경시 추적이 불가능하다는 차이점이 존재한다. - 기본 값 타입 (int, double ...) 기본 타입 (Integer, Long ...) 래퍼 클래스 String 기본 값 타입은 기본적으로 call by value를 취하기에 만일 내가 엔티티의 어떠한 기본 값 타입 필..
JPA- Cascade와 고아 객체 Cascade cascade를 사용하면 엔티티를 persist할 때 연관된 엔티티도 같이 persist 된다. Parent.class @Entity @Getter @Setter public class Parent { @Id @GeneratedValue private Long id; private String name; // CascadeType.ALL하면 Parent를 persist할 때 리스트 내부에 있는 녀석들도 모두 persist됨 @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) private List childList = new ArrayList(); // 연관관계 편의 메소드 void addChild(Child child) { childLi..