연관관계 맵핑 시 주의사항다중성다대일 : @ManyToOne일대다 : @OneToMany일대일 : @OneToOne다대다 : @ManyToMany (실무에서 쓰면 안됨.)단방향, 양방향테이블방향개념없음외래키 하나로 양쪽 조인객체한쪽만 참조 = 단방향양쪽 참조 = 양방향참조용 필드가 있어야 있는 쪽으로 참조가능(멤버에서 팀보고싶으면 멤버에 팀 레퍼런스가 있어야하고, 반대로 팀에서 멤버 보고싶으면 팀에 멤버 레퍼런스가 있어야 조회가능)연관관계의 주인테이블은 외래키 하나로 두 테이블 연관관계 맺음객체 양방향 관계는 A→B, B→A처럼 참조가2군데객체양방향 관계는 참조가2군데 있음.둘중 테이블의 외래키를 관리할 곳을지정연관관계의 주인 : 외래키 관리하는 참조주인의 반대편 : 외래키 영향 주지않음. 단순조회다대일..
양방향 매핑시 가장 많이 하는 실수연관관계의 주인에 값 입력하지 않은 경우Team team = new Team(); team.setName("TeamA"); Member member = new Member(); member.setUsername("member1"); //member.setTeam(team); 주인 연관관계 값 설정 em.persist(member); Member member2 = new Member(); member2.setUsername("member2"); //member2.setTeam(team); 주인 연관관계 값 설정 ..
조인내부조인 : select m from Member m join m.team t외부조인 : select m from Member m left join m.team t세타조인 : select count(m) from Member m, Team t where m.username = t.name Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(..
페이징 APIJPA는 페이징을 두 API로 추상화setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)setMaxResults(int maxResult) : 조회할 데이터 수//페이징 쿼리String jpql = "select m from Member m order by m.name desc";List resultList = em.createQuery(jpql, Member.class).setFirstResult(10).setMaxResults(20).getResultList();
JPQLJPQL은 alias를 무조건적으로 써줘야한다@Entity(name = "nn")의 name에 정의된 값을 jpql에서 사용name을 따로지정하지않고 Class명으로 사용한것이 관례Typed Query, QueryTypedQuery : 반환 타입이 명확할 때 사용Query : 반환 타입이 명확하지 않을 때 사용 TypedQuery query1 = em.createQuery("select m from Member m", Member.class); TypedQuery query2 = em.createQuery("select m.username, m.age from Member m", String.class); Query query3 = em...
값 타입 컬렉션값 타입을 하나 이상 지정할 때 사용@ElementCollection, @CollectionTable 사용컬렉션을 같은 테이블에 저장할 수 없다.컬렉션을 저장하기위한 별도의 테이블이 필요함RDBMS구조는 기본적인 값만 넣을수있고, 컬렉션을 넣지못하기 때문에ADDRESS와 FAVORITE_FOOD 테이블이 따로 나와야한다.또한, 따로 식별자를 따게되면 Entity가 되기때문에 식별자따지않고 member의 ID그대로 사용한다값 타입 저장@Entitypublic class Member{ @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String username; @Embedded p..
값 타입과 불변객체값 타입 공유 참조임베디드 타입을 여러 엔티티에서 공유하면 위험부작용 발생 Address address = new Address("city", "street", "zipcode"); Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(address); em.persist(member); Member member2 = new Member(); member2.setUsername("member2"); member2.setHomeAddress..
임베디드 타입새로운 값 타입 지정JPA는 임베디드 타입 이라함기본값 타입 모아서 복합 값 타입이라고도 함int,String과 같은 값예시) 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.보면, startDate,endDate 처럼 공통되는 속성회원 엔티티는 이름, 근무기간, 집주소를 가지는데, 여기서 내가 정의한 period타입, Address타입이 임베디드타입임임베디드 타입 장점재사용높은 응집도의미있는 메소드 만들 수 있음 (Period.isWork())임베디드 타입 사용법@Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하는 곳에 표시 기본 생성자 필수@Entitypublic class Member{ @Id..
엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 추적가능예시) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능값 타입int, integer, String처럼 단순히 값으로 사용하는 자바기본타입이나 객체식별자가 없고 값만 있으므로 변경시 추적불가예시) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체값 타입 분류기본값 타입String name, int age예시) 회원 삭제하면 이름, 나이필드도 함께삭제값타입은 공유하면 안된다.예시) 회원 이름 변경시 다른회원의 이름도 함께 변경되면 안된다레퍼런스 타입int, double같은 기본 타입(primitive trype)은 절대 값을 공유하지않음.그러나, Integer, String 같은 래퍼클래스는 공유가능, 값 변경은 ..
CASCADE - 영속성 전이부모 엔티티를 저장할 때 자식 엔티티도 함께 저장영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐게시판 - 첨부파일 같은 case는 cascade사용가능(첨부파일은 한게시물에서만 관리하니까)테이블을 여러군데에서 관리하는 경우는 쓰면 안된다.Parent처럼 소유자가 하나가 확실하고 단일엔티티에 종속적일때 cascade 사용하는 것.만약 다른데서 Child를 참조한다면 사용하면 안된다.예제로 바로 알아보자@Entitypublic class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(ma..