Привет, я уже представил это как ошибку на веб-сайте eclipselink, но ответа пока нет, и я застрял. Надеюсь, кто-то знает обходное решение или что-то в этом роде. У меня есть единое целое без каких-либо связей с другими таблицами. Сущность сопоставляет существующую таблицу в базе данных оракула.JPA чтение XMLTYPE результаты в NullPointer
@Entity
@Table(name = "FIVERX_MUSTER16_PRUEFUNG")
@Customizer(XMLTypeAttributeCustomizer.class)
public class MYDATATABLE {
...
@Lob
@Column(name = "XML", columnDefinition = "XMLTYPE")
private String xmlDocument;
...
}
Я пробовал много вещей, но каждый раз, когда я пытаюсь сделать выбор на этой таблице EclipseLink бросает NullPointerException
ERROR - EjbTransactionUtil.handleSystemException: null
java.lang.NullPointerException
at oracle.jdbc.driver.NamedTypeAccessor.getOracleObject(NamedTypeAccessor.java:302)
at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:164)
at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:121)
at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:1108)
at org.eclipse.persistence.platform.database.oracle.Oracle9Platform.getObjectFromResultSet(Oracle9Platform.java:193)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.getObject(DatabaseAccessor.java:1302)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.fetchRow(DatabaseAccessor.java:1077)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processResultSet(DatabaseAccessor.java:744)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:657)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:560)
Если удалить столбец XMLType все работает, как ожидалось. Если я снова добавить столбец -> NullPointer ...
Вот мой XmlMapper, так что вы можете видеть, что я сделал именно так, как учебники по DirectXmlTypeMapping сказать
import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.mappings.xdb.DirectToXMLTypeMapping;
public class XMLTypeAttributeCustomizer implements DescriptorCustomizer {
@Override
public void customize (ClassDescriptor descriptor) throws Exception {
// Remove JPA default Basic mapping
descriptor.removeMappingForAttributeName("xmlDocument");
final DirectToXMLTypeMapping mapping = new DirectToXMLTypeMapping();
mapping.setAttributeName("xmlDocument");
mapping.setFieldName("XML");
mapping.getField().setColumnDefinition("XMLTYPE");
descriptor.addMapping(mapping);
}
}
есть ли обходной путь ? Мне нужно работать с этой таблицей, и это не единственный, который содержит столбец XMLTYPE ... Я абсолютно вне идей здесь ...
В этой ситуации существуют различные обсуждения этой проблемы. Одним из предлагаемых решений, похоже, является возврат к более старой версии драйвера JDBC Oracle. https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#es_th=1&q=at+oracle.jdbc.driver.NamedTypeAccessor.getOracleObject(NamedTypeAccessor.java% 3A302) –
Вы упоминаете, что когда вы удаляете столбец xmltype, все работает, ссылаетесь ли вы на аннотации lob и столбцов, или на все, например, на customizer? Как вы указали его так, чтобы вызывающий пользователь вызвал? – Chris
Я имел в виду, если я удалю поле. Переменная сама со всей аннотацией. Заказчик также определенно называется. sysouts доказали это. И я не пробовал оставлять настройки в классе, когда удалял поле xml – Goldfish