인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Cộng đồng Hỏi & Đáp của Inflearn

Không có người viết

Bài viết có thông tin người viết đã bị xóa.

Trong thực tế! Truy vấn

Querydsl 설정과 검증 실패 제발 도와주세요....ㅠㅠ

Đã giải quyết

Viết

·

145

·

Đã chỉnh sửa

0

package jpabook2.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
public class Hello {

    @Id @GeneratedValue
    private Long id;
}
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.3'
	id 'io.spring.dependency-management' version '1.1.7'
}

group = 'jpabook2'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(23)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

	//test 롬복 사용
	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
	//Querydsl 추가
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor """com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"""
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
	useJUnitPlatform()
}

clean {
	delete file('src/main/generated')
}
package jpabook2.jpashop2;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jpabook2.entity.Hello;
import jpabook2.entity.QHello;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
@Transactional
class Jpashop2ApplicationTests {

	@Autowired
	EntityManager em;

	@Test
	void contextLoads() {
        Hello hello = new Hello();
        em.persist(hello);

        JPAQueryFactory query = new JPAQueryFactory(em);
        QHello qHello = new QHello("h");

        Hello result = query
                .selectFrom(qHello)
                .fetchOne();

        Assertions.assertThat(result).isEqualTo(hello);
    }

}
Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3
WARNING: A Java agent has been loaded dynamically (C:\Users\USER\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.15.11\a38b16385e867f59a641330f0362ebe742788ed8\byte-buddy-agent-1.15.11.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release

Unable to locate persister: jpabook2.entity.Hello
java.lang.IllegalArgumentException: Unable to locate persister: jpabook2.entity.Hello
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:764)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:745)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:320)
	at jdk.proxy3/jdk.proxy3.$Proxy105.persist(Unknown Source)
	at jpabook2.jpashop2.Jpashop2ApplicationTests.contextLoads(Jpashop2ApplicationTests.java:25)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
Caused by: org.hibernate.UnknownEntityTypeException: Unable to locate persister: jpabook2.entity.Hello
	at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.getEntityDescriptor(MappingMetamodelImpl.java:395)
	at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1512)
	at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:315)
	at org.hibernate.event.internal.EntityState.getEntityState(EntityState.java:64)
	at org.hibernate.event.internal.DefaultPersistEventListener.entityState(DefaultPersistEventListener.java:114)
	at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:87)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55)
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:761)
	... 9 more


Unable to locate persister: jpabook2.entity.Hello
org.hibernate.UnknownEntityTypeException: Unable to locate persister: jpabook2.entity.Hello
	at app//org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.getEntityDescriptor(MappingMetamodelImpl.java:395)
	at app//org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1512)
	at app//org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:315)
	at app//org.hibernate.event.internal.EntityState.getEntityState(EntityState.java:64)
	at app//org.hibernate.event.internal.DefaultPersistEventListener.entityState(DefaultPersistEventListener.java:114)
	at app//org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:87)
	at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
	at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55)
	at app//org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
	at app//org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:761)
	at app//org.hibernate.internal.SessionImpl.persist(SessionImpl.java:745)
	at java.base@23.0.1/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base@23.0.1/java.lang.reflect.Method.invoke(Method.java:580)
	at app//org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:320)
	at app/jdk.proxy3/jdk.proxy3.$Proxy105.persist(Unknown Source)
	at app//jpabook2.jpashop2.Jpashop2ApplicationTests.contextLoads(Jpashop2ApplicationTests.java:25)
	at java.base@23.0.1/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base@23.0.1/java.util.ArrayList.forEach(ArrayList.java:1597)
	at java.base@23.0.1/java.util.ArrayList.forEach(ArrayList.java:1597)

작업 파일 구글 드라이브입니다.

https://drive.google.com/file/d/18Qe7HzR8zWuy4KBJycRbtkXGed1LrQfl/view?usp=drive_link

파일이름이 영상과 다른이유는 실습에서 querydsl 사용하기 위해서 다르게했습니다.

persist 여기서 문제가 생기는거 같은데 해결 방법을 몰르겠습니다...

제발 도와주세요 ㅠㅠ..

javajpa

Câu trả lời 2

0

why1234567w0241님의 프로필 이미지

해결했습니다.... 패키지 위치 오류였습니다.... 도와주시로 와주신분들 감사합니다.

0

communityai8509님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

태욱님이 제공하신 코드와 설정을 기반으로 문제를 분석해보겠습니다. 현재 오류는 Unable to locate persister: jpabook2.entity.Hello로, 이는 Hello 엔티티가 JPA의 관리 대상이 아니기 때문에 발생하는 문제입니다.

해결책:

  1. 엔티티 스캔 확인:
    스프링 부트가 Hello 엔티티를 스캔할 수 없을 때 발생할 수 있는 문제입니다. @SpringBootApplication이 위치한 패키지가 엔티티가 위치한 패키지를 스캔하고 있는지 확인하세요. 패키지 구조를 잘못 설정하면 엔티티가 JPA의 관리 대상에 포함되지 않을 수 있습니다.
   @SpringBootApplication(scanBasePackages = "jpabook2")
   public class Application {
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
   }
  1. application.properties 확인:
    application.properties 또는 application.yml 파일에서 JPA 관련 설정을 확인하세요. 특히, 엔티티를 포함한 패키지를 제대로 지정했는지 확인하십시오. 예를 들어, 모든 엔티티가 위치한 패키지 경로를 spring.jpa.properties.hibernate.ejb.entitymanager_factory_name 같은 설정값으로 지정해야 합니다.

  2. Hibernate 설정 확인:
    스프링 부트 3.x에서는 Hibernate 6.x와 호환되어야 합니다. 만일 여전히 문제가 지속된다면, Hibernate의 버전과 의존성이 올바르게 설정되어 있는지 확인하세요.

  3. 빌드 및 캐시 정리:
    빌드 툴의 캐시를 정리하고, 프로젝트를 다시 클린 빌드 해보세요.

  4. QueryDSL 의존성 확인:
    QueryDSL 의존성을 사용하는 경우, annotationProcessor의 설정도 올바르게 되어 있는지 재확인해 주세요. 현재 설정이 jakarta를 사용하고 있으니, jakarta 관련 설정들도 확인해 주세요.

기타 자세한 해결방법은 아래 참조 링크를 통해 동일한 문제의 사례와 해결책을 참고하시면 도움이 될 수 있습니다:
- Querydsl을 활용한 동적쿼리 해결

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Không có người viết

Bài viết có thông tin người viết đã bị xóa.

Đặt câu hỏi