게시글
질문&답변
2020.10.20
서로 다른 스키마(database) 에 있는 테이블의 연관관게 매핑 시 에러가 나는데 가능한 방법이 있나요?
같은 EntityManagerFactory 로 관리되는 경우 A.table1 join B.table2 이 잘 되네요... EntityManagerFactory 가 다른 경우는 안되는게 맞을 것 같습니다. 확인 감사합니다.
- 0
- 3
- 1K
질문&답변
2020.10.19
서로 다른 스키마(database) 에 있는 테이블의 연관관게 매핑 시 에러가 나는데 가능한 방법이 있나요?
알겠습니다. 현제 다른 EntityManagerFactory 로 관리되는데 EntityManagerFactory 하나로 합쳐도 될 것 같습니다. 합쳐서 테스트 해 보겠습니다. 감사합니다.
- 0
- 3
- 1K
질문&답변
2020.07.09
batchInsert 가 가능한지 문의드립니다.
실전 스프링 부트와 JPA 활용1,2 JPA : 자바 ORM 표준 JPA 프로그래밍 -기본편 QueryDSL Spring Data JPA 안녕하세요 강의 잘 듣고 있습니다. 제가 구매한 강의 목록 인데요 이중에 batchinsert (JPA 책 15.4.5) 가 어느 강의에 있는지 한번 더 확인해 주시면 고맙겠습니다. batch update 등은 강의에서 봤는데요. batch insert 로 대량의 데이타(List) 를 넣는 경우도 필요해서 질문드렸습니다
- 0
- 4
- 372
질문&답변
2020.07.09
fetch join 시 child table 조건이 실제 쿼리에 반영이 안되네요..
• 자바진영의ORM기술표준 • JPA를 왜 사용해야 하는가? • JPA동작-저장, 조회 • JPA와상속-저장,조회 • 성능최적화 - 1치 캐쉬 • 성능최적화 - Lazy 로딩 • OSIV 최적화 • 양방향 연관관계 Owner • QueryDsl 장점 • QueryDsl 쿼리 사용을 위한 Repository 구조 (Custom Repository, Impl, Querydsl4RepositorySupport) • N+1 문제 해결 . 페이징 & 소팅 • Projections JPA 관련 강의 5개를 들으면서 정리해 본 주제 인데요. 실무에서 중요한 팁(@OneToMany 에서 batch_size 설정을 통한 N+1 문제 해결, osiv on/off 이슈등) 또는 실무에서 발생할 수 있는 중요 포인트 중에 놓친게 없는지 한번 확인 부탁드려도 될런지요?
- 0
- 6
- 640
질문&답변
2020.07.03
batchInsert 가 가능한지 문의드립니다.
답변 감사합니다 ^^ 확인해 보겠습니다 ~~~
- 0
- 4
- 372
질문&답변
2020.07.02
@OneToMany 시에 N+1 무제와 페이징 문제
네^^ 강의자료 잘 보고 있습니다.
- 0
- 3
- 276
질문&답변
2020.07.01
어플리케이션 실행시 인텔리제이 콘솔에 찍히는 sql statement가 1줄로 나오는 문제!
datasource 가 1개인 경우 yml 파일에만 지정하면 format_sql 도 잘되고 default_batch_fetch_size 도 잘 되는데요. 멀티 datasource 를 사용중이라 JPAConfig 클래스를 만들어서 사용하면 default_batch_fetch_size 프로퍼티는 아래 properties 에 값을 넣으면 되는데요. format_sql 은 안먹네요 ???? -> yml 파일에 등록해도 안되서 default_batch_size 는 아래 속성값에 추가하니까 되었는데요. format_sql 은 안되네요.. package kr.co.korbit.demo;:::@Configuration@EnableTransactionManagement@EnableJpaRepositories( entityManagerFactoryRef = "jpaEntityManagerFactory", transactionManagerRef = "jpaTransactionManager", basePackages = {"kr.co.korbit.demo.jpa.repository", "kr.co.korbit.demo.jpa.repository.custom", "kr.co.korbit.demo.jpa.repository.impl", "kr.co.korbit.demo.jpa.repository.querydsl"})public class JpaConfig { final String dialect = "org.hibernate.dialect.H2Dialect" ; String ddlAuto = "create" ; String showSql = "false" ; String formatSql = "true" ; String useNewIdGeneratorMappings = "false" ; String implicitStrategy = "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" ; String physicalStrategy = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy" ; @Autowired(required = false) private PersistenceUnitManager persistenceUnitManager; @Bean(name = "jpaDataSource") @ConfigurationProperties(prefix = "spring.datasource.demo") @Primary public DataSource jpaDataSource() { HikariDataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build() ; return dataSource ; } @Bean(name = "jpaEntityManagerFactoryBuilder") @Primary public EntityManagerFactoryBuilder jpaEntityManagerFactoryBuilder(){ HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setShowSql(true); adapter.setPrepareConnection(true); adapter.setDatabase(Database.H2); adapter.setDatabasePlatform(dialect); adapter.setGenerateDdl(false); HashMap, String> properties = new HashMap, String>() ; properties.put("hibernate.ddl-auto", ddlAuto); properties.put("format_sql", "true"); properties.put("default_batch_size", "300"); properties.put("hibernate.naming.implicit-strategy", implicitStrategy); properties.put("hibernate.naming.physical-strategy", physicalStrategy); properties.put("hibernate.use-new-id-generator-mappings", useNewIdGeneratorMappings); EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder( adapter, properties , this.persistenceUnitManager); return builder; } @Primary @Bean(name = "jpaEntityManagerFactory") public LocalContainerEntityManagerFactoryBean jpaEntityManagerFactory( @Qualifier("jpaEntityManagerFactoryBuilder") EntityManagerFactoryBuilder builder, @Qualifier("jpaDataSource") DataSource jpaDataSource) { LocalContainerEntityManagerFactoryBean factory = builder .dataSource(jpaDataSource) .packages("kr.co.korbit.demo.jpa.model") .persistenceUnit("demo") .build(); factory.setPackagesToScan("kr.co.korbit.demo.jpa.model") ; return factory ; } @Bean(name = "jpaTransactionManager") @Primary public PlatformTransactionManager jpaTransactionManager( @Qualifier("jpaEntityManagerFactory") EntityManagerFactory jpaEntityManagerFactory) { return new JpaTransactionManager(jpaEntityManagerFactory); } @Bean(name = "jpaQueryFactory") @Primary public JPAQueryFactory jpaQueryFactory(@Qualifier("jpaEntityManagerFactory") EntityManagerFactory jpaEntityManagerFactory) { return new JPAQueryFactory(jpaEntityManagerFactory.createEntityManager()) ; }}
- 0
- 3
- 1K
질문&답변
2020.07.01
@OneToMany 시에 N+1 무제와 페이징 문제
@OneToMany 인 Collection join 인경우 N+1 이 아니라 1 + 1 in (...) 쿼리로 되서 최적화가 가능하다는거죠? default_batch_fetch_size = 100 으로 지정할 경우 페이징도 가능하고 1+n -> 1+1 로 변경...
- 0
- 3
- 276
질문&답변
2020.06.30
fetch join 시 child table 조건이 실제 쿼리에 반영이 안되네요..
데모용으로 사용하신 프로젝트를 공유해 주시면 제가 테스트 중인 코드를 좀 더 쉽게 공유할 수 있을 것 같습니다. 혹시 가능하실런지요?
- 0
- 6
- 640
질문&답변
2020.06.30
fetch join 시 child table 조건이 실제 쿼리에 반영이 안되네요..
@EntityGraph(attributePaths = ["quizList"])@Query(value = "select q " + " from LneQuest q INNER JOIN q.quizList qz where 1=1 " + " and (:type is null or q.type = :type) " + " and (:from is null or :from + " and (:to is null or q.createdAt , countQuery = "select count(q)" + " from LneQuest q where 1=1 " + " and (:type is null or q.type = :type) " + " and (:from is null or :from + " and (:to is null or q.createdAt , nativeQuery = false)fun findAllByJpql(@Param("type")type: String?, @Param("from")from: LocalDateTime?, @Param("to")to: LocalDateTime?, pageable: Pageable): Page val jpql = selectFrom(lneQuest) .innerJoin(lneQuest.quizList, lneQuiz) .fetchJoin() .where( WhereBuilder() .optionalAnd(from, { lneQuest.createdAt.after(from) }) .optionalAnd(to, { lneQuest.createdAt.before(to) }) .optionalAnd(type, { lneQuest.type.eq(type) }) ) .orderBy(*ordable(pageable.sort).toTypedArray())val countJpql = selectFrom(lneQuest) .where( WhereBuilder() .optionalAnd(from, { lneQuest.createdAt.after(from) }) .optionalAnd(to, { lneQuest.createdAt.before(to) }) .optionalAnd(type, { lneQuest.type.eq(type) }) )return applyPagination(pageable, jpql, countJpql) 안녕하세요 답변 주셔서 감사합니다. 문의 드리고 싶은 부분들을 정리해서 github 에 데모로 만들어서 이슈를 확인받고 싶은데, 잘 안되네요.... ;;; qz.type = :type 으로 조건을 걸 수 있는 방법이 있다면 추가로 알려주시면 감사하겠습니다. (Querydsl 또는 JPQL 어노테이션 쿼리 모두 상관없습니다) -> 가능하면 저도 H2 db 로 테스트 코드 한번 만들어서 공유드리도록 하겠습니다. 더불어 일반적인 @OneToMany 를 QueryDsl FetchJoin 으로 작성해 봤는데요 N+1 문제는 잘 해결되는데 페이징 처리는 안되서 혹시 방법이 있는지요? -> 아니면 FetchJoin 시에는 구조적으로 페이징 처리가 안되는지요? .fetchJoin() 을 제거하면 N+1 문제가 발생하지만 페이징 처리와 Sort 는 모두 잘 됩니다. JPQL @Query 어노테이션도 Runtime 에 Syntax 체크를 해주긴 해주더라구요... QueryDsl 의 경우에는 Syntax 체크가 언어 레벨에서 되는 점이 더 편할 것 같긴 합니다만, 복잡한 쿼리의 경우 QueryDsl 로 작성하는게 더 검증이나 유지보수가 더 편리할까요? (엔터프라이즈 상황에서요)
- 0
- 6
- 640