Мозговая атака: Странная проблема JPA, возможно путь к классу или проблема управления версиями банки?

Я вижу странное сообщение об ошибке и ищу некоторые идеи относительно того, какова проблема могла быть. Я - вид новых для использования JPA.

У меня есть приложение, где я использую Фабрику менеджера по Объекту Spring (LocalContainerEntityManagerFactoryBean), EclipseLink как мой поставщик ORM, подключенный к MySQL DB и созданный со Знатоком. Я не уверен, имеет ли какое-либо из этого значение.....

Когда я развертываю это приложение на 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

Я предполагаю, что существует некоторая банка, которую я использую в Glassfish, который отличается, чем те, я использую в тесте. Я посмотрел на все банки, которые я перечислил, как "обеспечено", и вполне уверено, они являются всеми одинаковыми от Glassfish.

Сообщите мне, видели ли Вы эту странную проблему прежде, или какие-либо идеи для исправления его.

5
задан Pascal Thivent 10 April 2010 в 22:05
поделиться

2 ответа

Это также может быть проблемой загрузки класса.Одно и то же определение класса, загруженное двумя разными загрузчиками классов, рассматривается 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 вы, конечно, можете использовать вызовы предпочитаемой вами среды ведения журнала.

Вот серия статей с более подробной информацией о загрузке классов.

6
ответ дан 14 December 2019 в 08:46
поделиться

Это явно указывает на проблему ClassLoader (возможно, из-за переплетения, необходимого для EclipseLink). Вы используете LoadTimeWeaver ? У вас настроены какие-нибудь javaagent? Возникает ли проблема в командной строке в Maven? в вашей IDE? Просьба уточнить.

1
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: