본문 바로가기

머어어엉

(104)
API 고급( 지연로딩과 조회성능 최적화) @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAllByString(new OrderSearch()); return all; } } @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private S..
고급매핑 * 상속 관계 매핑 - 데이터 베이스엔 상속관계가 없다 - 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 //부모 클래스조인전략 @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name=“DTYPE”) //자식 클래스 @DiscriminatorValue(“XXX”) //부모 클래스단일 테이블 전략 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name=“DTYPE”) //자식 클래스 @DiscriminatorValue(“XXX”) //부모 클래스구현 클래스마다 테이블 전략 @Inheritance(strategy=Inher..
다양한 연관관계 매핑 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany * 일대다 단방향 정리 - 객체와 테이블의 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조 - JoinColumn 을 꼭 사용해야 됨 그렇지 않으면 조인테이블 방식을 사용해 중간에 테이블을 자동으로 추가시킨다 - 단점 : 엔티티가 관리하는 외래키가 다른 테이블에 있음 연관관계 관리를 위해 추가로 update sql 실행 * 일대다 단방향 매핑보다 다대일 양방향 매핑을 사용하자! * 일대다 양방향 - 공식적으로 존재하지 않는 매핑 - @JoinColumn(insertable=false, updatable=false) 읽기 전용 필드를 사용해서 양방향처럼 사용 - 다대일 양방향을 사용하자! ..
연관관계 매핑 기초 회원 ( Member ) : N 팀 ( Team ) : 1 회원과 팀은 다대일의 관계 : 1개의 팀에 여러명의 회원이 있다. 테이블 → '외래키'로 조인 객체 → 참조 ex) member.getId() * 단방향 @ManyToOne @JoinColumn(name = "Team_ID") private Team team; * 양방향 연관관계 - 양방향 매핑 ( 반대방향으로 객체 그래프 탐색 ) @OneToMany(mappedBy = "team") // team 은 Member 클래스에 있는 Team 의 변수명 List members = new ArrayList(); mappedBy 를 알기 위해선...객체와 테이블이 관계를 맺는 차이 알아야됨. *객체와 테이블이 관계를 맺는 차이 객체 연관관계 = 2개 회원..
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: Team, for columns: [org.hibernate.mapping.Column(members)] 틀린코드 @Entity public class Team { @Id @GeneratedValue private long id; private String name; private List members = new ArrayList(); 오류메시지 "C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.3.1\lib\idea_rt.jar=49823:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:..
엔티티 매핑 #객채와 테이블 매핑 - @Entity가 붙은 클래스는 JPA가 관리한다. - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션 필수 *속성 정리 -name : JPA에서 사용할 엔티티 이름을 지정한다 기본값 : 클래스 이름을 그대로 사용 (예: Member) 같은 클래스 이름이 없으면 가급적 기본값을 사용 -Table : 엔티티와 매필 할 테이블 지정 (DB) (속성 : name - 매핑할 테이블 이름 , catalog , schema, uniqueConstraints - DDL 생성 시 유니크 제약조건 생성) 데이터베이스 스키마 자동 생성 • DDL을 애플리케이션 실행 시점에 자동 생성 • 테이블 중심 -> 객체 중심 • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL..
플러시 @영속성 컨텍스트를 플러시 하는 법 1. em.flush() - 직접호출 2. 트랜잭션 커밋 - 플러시 자동 호출 3. JPQL 쿼리 실행 - 플러시 자동 호출 : 자동 호출 되는 이유는 em.persist(memberA); em.persist(memberB); em.persist(memberC); //중간에 JPQL 실행 query = em.createQuery("select m from Member m", Member.class); List members= query.getResultList(); : member A,B,C 가 commit 전에는 쿼리가 날라가지 않음.. JPQL 은 1차캐시에서 먼저 찾지 않고 DB에서 찾은 후 1차 캐시에 저장 1차 캐시에 같은게 있으면 쿼리에서 찾은거 버림... ..
영속성 관리 && 준영속성 ◇영속성 * 영속 상태일때 쿼리가 날라가는게 아님.. commit 때 날라감 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername(“회원1”); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); //>>> 1차 캐시에 저장됨. //1차 캐시에서 조회 Member findMember = em.find(Member.class, "member1"); * 영속 엔티티의 동일성 보장 Member a = em.find(Member.class, "member1..