JPA 14

상속관계 매핑

@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) //SINGLE_TABLE 전략에는 자동으로 DTYPE이 생성되어서 @DiscriminatorColumn을 적지 않아도 된다. //이유는 JOINED전략은 create Book를 하기 때문에 어디 테이블에 어떤 컬럼인지 알 수 있지만 //SINGLE_TABLE전략에서는 Book테이블의 author인지 아닌지 알수가 없기 때문에 무조건 DTYPE이 있어야해서 자동으로 넣어준다. @DiscriminatorColumn public abstract class Item extends BaseEntity { @Id @GeneratedValue @Column(name = "ITEM_ID") private L..

JPA 2023.05.14

@joinCloumn의 옵션

@joinCloumn의 기본값은 referencedColumnName() default ""; 인데 이건 자동으로 참조하는 객체의 pk값을 기본적으로 가지기때문에 id값이 아닌 다른 컬럼을 참조하고 싶다면 @ManyToOne @JoinColumn(name = "참조할 컬럼명", referencedColumnName = "실제 참조될 컬럼명") private Member member; 이렇게 해야함 joincolumn에 name옵션이 참조할 객체의 컬럼명인줄알고 썻는데 참조가 안되길래 찾아보니까 그냥 말그대로 name이였음 만약 참조할 객체의 컬럼명이 pk값이 아니라면 referencedColumnName 옵션을 써서 지정해주어야한다.

JPA 2023.05.14

flush mode옵션

em.setFlushMode(FlushModeType.AUTO); 커밋이나 쿼리를 사용할때 기본적인 플러쉬 옵션 값 em.setFlushMode(FlushModeType.COMMIT); 커밋할때만 플러쉬되는 옵션. (쿼리시 플러쉬 안됨) final Book book = new Book(); book.setName("JPA"); book.setAuthor("오오"); em.persist(book); em.persist(book); em.persist(book); //원래대로라면 select쿼리 실행시 플러쉬가 나가야하는데 옵션값을 commit으로 하면 플러쉬가 되지 않고 select쿼리가 나감 em.createQuery("select b from Book b");

JPA 2023.05.14

entity

package hellojpa; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.Date; @Entity @Getter @Setter public class Member { //== 기본키 매핑 == //@Id만 쓰면 직접할당 //@GeneratedValue 자동생성 AUTO면 DB방언에 맞춰서 자동생성. IDENTITY는 기본키 생성을 데이터베이스에 위임. ex)MySQL의 Auto_increment //IDENTITY전략은 id값이 null일때 아이디값을 생성하는데 영속성 컨텍스트에 들어가려면 아이디 값이 있어야한다. //insert쿼리를 날려봐야 id값을 알수있기때문에 이 경우에는(IDEN..

JPA 2023.03.29

일대다 페이징처리

JPA에서 일대다관계와 join fetch를 하게 되면 콘솔창에 데이터를 메모리에 올리겠다는 WARN이 뜬다. 일대다이면 데이터가 뻥튀기가 되기 때문에 페이징처리가 이상하게 될수 밖에 없어서 이 선택을 한것같다고 한다. 그래서 jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: true default_batch_fetch_size: 100 default_batch_fetch_size: 100 를 잡아주는데 이러면 일대 "다"로 되어있는 애들을 다 끌고 와서 한번에 조회하게 된다. select orderitem0_.order_id as col_0_0_, item1_.name as col_1_0_, orderitem0_.order_pric..

JPA 2023.03.27

필드와 컬럼매핑 + 기본키 매핑

@Entity @Getter @Setter public class Member { //== 기본키 매핑 == //@Id만 쓰면 직접할당 //@GeneratedValue 자동생성 AUTO면 DB방언에 맞춰서 자동생성. IDENTITY는 기본키 생성을 데이터베이스에 위임. ex)MySQL의 Auto_increment //IDENTITY전략은 id값이 null일때 아이디값을 생성하는데 영속성 컨텍스트에 들어가려면 아이디 값이 있어야한다. //insert쿼리를 날려봐야 id값을 알수있기때문에 이 경우에는(IDENTITY전략일 경우) em.persist(member)를 하면 insert쿼리가 날라나게되고, //아이디값을 가져와서 영속성컨텍스트에서 pk값으로 쓰게 된다. //한트랜잭션 안에서 버퍼링해서 write하..

JPA 2022.12.04

Merge와 변경감지

데이터를 수정할때 두가지 방법이 있는데 Merge와 변경감지이다. 미리 얘기하자면 Merge보단 변경감지를 써야한다. 먼저 Merge에대해 설명하면 데이터를 수정했을때 @PostMapping("/items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { final Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.s..

JPA 2022.11.26

Embedded Type

엔티티객체를 만들다보면 @Entity public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; private String city; private String street; private String zipcode; private LocalDateTime startDate; private LocalDateTime endDate; 이렇게 뭔가 공통적인걸 묶을 수 있을것 같은걸로 만들때가 있는데 예를 들면 city, street, zipcode 와 startDate, endDate를 각각 묶을수 있을것 같은 느낌이든다. 그때 사용하는게 Em..

JPA 2022.10.19

테이블 전략

조인 전략 장점은 테이블 정규화, 저장공간 효율, 외래키 참조 무결성 제약조건 활용이 가능하다. 단점은 조회할때 조인을 많이 사용해 성능이 저하된다는 점과 조회 쿼리가 복잡하다. 데이터저장시에 insert쿼리를 2번이나 호출한다. 사용법 @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public class Item { InheritanceType을 JOINED로 설정하면 된다. 이상태로 실행하면 내가 만든 Item하위 엔티티들이 하나씩 생성된다. 아래는 실행결과값이다. create table Album ( artist varchar(255), id bigint not null, primary key (id) ) ..

JPA 2022.10.18