복붙노트

[SPRING] 브레인 스토밍 : 이상한 JPA 문제, 아마도 classpath 또는 jar 버전 문제일까요?

SPRING

브레인 스토밍 : 이상한 JPA 문제, 아마도 classpath 또는 jar 버전 문제일까요?

이상한 오류 메시지가 표시되며 문제의 원인에 대한 아이디어를 찾고 있습니다. 나는 JPA를 처음 사용하는 사람이다.

Spring의 Entity Manager Factory (LocalContainerEntityManagerFactoryBean), My Oracle Provider로서의 EclipseLink, MySQL DB에 연결되어 있고 Maven으로 빌드 된 애플리케이션이 있습니다. 나는이 문제가 .....

이 응용 프로그램을 Glassfish에 배포하면 응용 프로그램이 예상대로 작동합니다.

문제는 제대로 작동하지 않는 Glassfish 외부에서 실행되는 독립 실행 형 단위 테스트 집합을 만들었습니다. 다음 오류가 나타납니다 (클래스 이름을 약간 편집했습니다).

com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity

객체를 같은 유형의 클래스로 형변환 할 수 없습니까? 어떻게 그렇게 될수 있니?

다음은 오류가있는 코드 스 니펫입니다.

Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();
for (Object entityObject: entityObjects) {
   com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

이전에는 동일한 오류가 발생한이 코드를 사용했습니다.

CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class));
List entityObjects = entityManager.createQuery(cq).getResultList();
for (Object entityObject: entityObjects) {
   com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

이 코드는 서버에 배포 한 것과 동일한 질문입니다.

도움이된다면 여기에 가장 깊은 예외가 있습니다.

Caused by: java.lang.ClassCastException: com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity
    at com.xyz.abc.services.persistence.entity.factory.MyEntityFactory.createBeans(MyEntityFactory.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115)
    ... 37 more

글래스 피쉬에서 사용하고있는 항아리가 시험에서 사용하는 항아리와 다른 것 같아요. 나는 내가 "제공 한"것으로 나열한 모든 항아리를 보았으며 그들이 글래스 피시와 똑같은 것이라 확신한다.

전에 이상한 이슈를 본 적이 있다면 알려주거나 수정을위한 아이디어를 알려주십시오.

해결법

  1. ==============================

    1.이것은 클래스 로딩 문제 일 수도 있습니다. 두 개의 다른 클래스 로더에 의해로드 된 동일한 클래스 정의는 JVM에 의해 다른 클래스로 간주됩니다.

    이것은 클래스 로딩 문제 일 수도 있습니다. 두 개의 다른 클래스 로더에 의해로드 된 동일한 클래스 정의는 JVM에 의해 다른 클래스로 간주됩니다.

    게임에서 클래스 로더에 대한 정보를 얻으려면이 방법을 시도해 볼 수 있습니다.

    Query q = entityManager.createNamedQuery("MyEntity.findAll");
    List entityObjects = q.getResultList();
    
    ClassLoader loader1 = 
        com.xyz.abc.services.persistence.entity.MyEntity.getClass().getClassLoader();
    System.out.println("MyEntity's class loader is " + loader1);
    for (Object entityObject: entityObjects) {
      ClassLoader loader2 = entityObject.getClass().getClassLoader();
      System.out.println("Class loader of entity " + entityObject + " is " + loader2);
    }
    

    System.out.println 대신 원하는 로깅 프레임 워크에 대한 호출을 사용할 수 있습니다.

    다음은 클래스 로딩에 대한 자세한 내용이 담긴 일련의 기사입니다.

  2. ==============================

    2.이것은 분명히 ClassLoader 문제를 일으킨다. (EclipseLink에서 필요로하는 직조 때문일 수도있다.) LoadTimeWeaver를 사용합니까? javaagent 항목을 구성 했습니까? 문제가 Maven 아래의 명령 줄에서 발생합니까? IDE에서? 명확히하십시오.

    이것은 분명히 ClassLoader 문제를 일으킨다. (EclipseLink에서 필요로하는 직조 때문일 수도있다.) LoadTimeWeaver를 사용합니까? javaagent 항목을 구성 했습니까? 문제가 Maven 아래의 명령 줄에서 발생합니까? IDE에서? 명확히하십시오.

  3. from https://stackoverflow.com/questions/2614989/brainstorming-weird-jpa-problem-possibly-classpath-or-jar-versioning-problem by cc-by-sa and MIT license