Я вижу странное сообщение об ошибке и ищу некоторые идеи относительно того, какова проблема могла быть. Я - вид новых для использования 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.
Сообщите мне, видели ли Вы эту странную проблему прежде, или какие-либо идеи для исправления его.
Это также может быть проблемой загрузки класса.Одно и то же определение класса, загруженное двумя разными загрузчиками классов, рассматривается 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
вы, конечно, можете использовать вызовы предпочитаемой вами среды ведения журнала.
Вот серия статей с более подробной информацией о загрузке классов.
Это явно указывает на проблему ClassLoader
(возможно, из-за переплетения, необходимого для EclipseLink). Вы используете LoadTimeWeaver
? У вас настроены какие-нибудь javaagent? Возникает ли проблема в командной строке в Maven? в вашей IDE? Просьба уточнить.