Мозговой штурм: странная проблема JPA, возможно, проблема с classpath или jar-версионированием? - PullRequest
5 голосов
/ 11 апреля 2010

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

У меня есть приложение, в котором я использую Spring Entity Manager Factory (LocalContainerEntityManagerFactoryBean), EclipseLink в качестве моего поставщика ORM, подключенный к базе данных MySQL и созданный с помощью 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

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

Дайте мне знать, если вы видели эту странную проблему раньше, или у вас есть идеи по ее исправлению.

Ответы [ 2 ]

6 голосов
/ 11 апреля 2010

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

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

1 голос
/ 11 апреля 2010

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

...