JPA (8) 썸네일형 리스트형 JPA의 여러가지 팁 짧은 팁들모든 연관관계는 지연로딩 으로 하자예상하지 못한 지연로딩을 방지하자fetch join을 사용하여 필요한 데이터를 한 번에 조회하도록 최적화한다.@JsonIgnore를 활용하여 JSON 직렬화 과정에서 불필요한 로딩을 방지한다.IDE 디버그 모드에서 toString() 호출로 인해 지연로딩이 동작할 수 있다@ToString(exclude = "entity")를 활용하여 toString() 호출 시 연관 엔티티 접근을 막는다.Bulk Insert는 JPA가 아닌 JDBC 혹은 Hibernate Batch Insert 사용JpaRepository의 saveAll() 메소드는 엔티티 개별 INSERT 쿼리를 실행하므로 대량 삽입에 적합하지 않다.성능을 고려할 경우, JdbcTemplate 또는 Hibe.. JPA Entity ID 타입 선택시 후보들 GenerationType identity, sequence, tableidentity키 생성 방식을 데이터베이스에게 위임하는 방식영속성 컨텍스트에 저장하기 위해 데이터베이스에 insert를 전달하여 PK를 얻어 오기에 insert에서 쓰기 지연이 되지 않는다sequence유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 사용한다.시퀀스를 제공하는 오라클, PostgreSQL, DB2, H2 데이터베이스에 사용insert시 데이터베이스 시퀀스를 사용하여 PK 를 얻기에 쓰기 지연이 가능하다table키 생성 전용 테이블을 만들어서 시퀀스 전략처럼 동작하는 방식이다전용 테이블을 만들어서 처리하는것이기때문에 시퀀스를 제공하지 않는 데이터베이스도 가능하다table는 키를 얻기 위해 select를 사용 후 다.. @Transactional(readOnly = true) 는 Flush 가 동작안할꺼라 믿었다 public class MarineService { WeaponService weaponService; @Transactional public Marine getMarine(){ Factory factory = factoryRepository.findById(1L).get(); Marine marine = factory.createMarine("marine"); Weapon weapon = weaponService.getWeapon(); marine.setWeaponName(weapon.getName()); return marine } } public class WeaponService { @Transactional(readOnly = true) public Weapon getWeapon(){ retur.. QueryDSL에서 SubQuery 에는 limit 를 사용 할 수 없다. SubQuery 종류 중from 절에 사용하는 인라인뷰는 지원하지 않으니 당연히 limit를 사용할 수 없고select의 Scalar SubQuery 나 where 절 SubQuery에 limit 사용이 안된다는 것을 알게 되었다. Scalar SubQuery에서 limit 분실select( new QModel( orders.orderId, JPAExpressions.selectDistinct(orderHistory.message) .from(orderHistory) .where(orderHistory.orderId.eq(orders.orderId)) .orderBy(orderHistory.createDateTime.. QueryDSL-JPA에서 인라인뷰를 써야 한다면 도망치자 Query DSL JPA을 사용도중 select, where에 Sub Query는 자주 사용하였지만 from 절에 Sub Query를 작성하려다가 문제를 만나게 되었다. QueryDSL로 from절 SubQuery, 즉 inline view를 작성하려 하니 지원하지 않는다는 말을 듣게 되었고 이게 Query DSL 이 제공 안 하는 건지, 하이버네이트가 지원 안 하는 건지 알아보니 예전 하이버네이트 이슈 중 inline view 관련 이슈를 확인해 볼 수 있었다. But! Hibernate 6.1 버전에서부터는 지원을 시작하였다. 그렇지만.. 사용 중인 프로젝트의 Hibernate 버전은 5 버전이었다. 즉 이 프로젝트에서는 Hibernate로 인라인뷰를 사용할 수 없었고 즉 이 문제를 해결할 수는 없었.. JPA Column의 null 제약 조건 JPA 에서 DDL 생성시 제약 조건을 매핑하는 과정에서 해당 필드에 null이 들어올수없도록 제약을 걸고 싶을때 @Column(name = "name", nullable = false) private String name; 위와같이 nullable 를 false 로 주어 null 이 들어올수없는 제약을 걸어둘수있다. create table tb_library ( id varchar(255) not null, **name varchar(255) not null,** primary key (id) ) engine=InnoDB; 실제 테이블 생성 쿼리를 보면 name 컬럼에 not null 조건이 붙은 상태로 생성하는것을 볼수있다. 이렇게되면 name 필드에 null 이 들어간 엔티티는 DB 에 들어갈수는있.. JPA 에서 GeneratedValue 를 하지않는다는것은 JPA 에서 Entity 를 생성하여 PK 를 잡는 ID 를 지정할때 @Id @GeneratedValue @Column(name = "order_id") private Long id; private String title; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; 위와같이 GeneratedValue 를 통해 자동생성을 둘수도있지만 String 와 같은 다른 타입 PK 로지정이 가능하다. GeneratedValue 가 아닌 다른 타입으로 지정한다는것은 결국 데이터를 추가할때 PK를 미리 지정해준다는 의미일것이다. GeneratedValue 의 동작 GeneratedValue 는 Entity 객체를 생성후 .. [JPA] JPA 란 1. JPA(Java Persistence API) 1.1 JPA 란 먼저 JPA 란 JAVA에서 제공하는 API로 ORM 기술의 표준 기술이다. 즉 자바에서 관계형 데이터베이스를 사용하는 방식인데 자바 클래스와 DB 테이블을 매핑하여 데이터베이스를 조작할 수 있게 해 준다. 1.2 ORM 이란? ORM 은 자바 객체와 DB 테이블을 맵핑하여 SQL을 작성하지 않고도 객체지향 언어에서 그대로 사용하는 것으로 DBMS 를에대한 종속성을 줄일 수 있다. 그대로 사용한다는 것은 SQL 쿼리를 직접 작성하는 것이 아닌 자동으로 생성하여 사용한다는 것이다. 1.3 JPA를 사용하는 이유 대부분의 프로그램이 어느 정도 기능을 하기 위해서는 당연하게도 데이터베이스를 사용해야 만한다. 결국 프로그램은 밖에서 데이터를 .. 이전 1 다음