Проблема Eclipselink и ArrayMapping JPA - PullRequest
0 голосов
/ 29 марта 2011

У меня проблема с извлечением данных пользовательского типа Oracle из базы данных.
Один из столбцов в таблице имеет пользовательский тип Oracle (на самом деле это VARRAY):

Вот инструкция createдля этого типа:
create or replace TYPE CAlarmMessList AS VARRAY(15) OF CAlarmMess;

Где CAlarmMess является следующим:
create or replace TYPE CAlarmMess AS OBJECT (EreignisTypId NUMBER(9), EreignisKlasseId NUMBER(9), AlarmZeit DATE, ParamWert1 VARCHAR2(65 CHAR), ParamWert2 VARCHAR2(65 CHAR), ParamWert3 VARCHAR2(65 CHAR) [....]

И нужное мне поле имеет имя ALARME и тип CALARMMESSLIST.
Я создал Entity для таблицы (WSENSORSTATE), используя инструменты Oracle для Eclipse.Это поле было сгенерировано как Object поле.
Я вручную создал тип Java CAlarmMess с полями:

private BigDecimal ereignisTypId;  
private BigDecimal ereignisKlasseId;  
private Date alarmZeit;  
private String paramWert1;  
private String paramWert2;  
private String paramWert3;

И изменил тип поля в моем объекте «Список CAlarmMess».
Когда я добавил настройщик для своей сущности:

@Customizer(com.companyname.entities.WsensorstateCustomizer.class)

Где используется метод настройки следующим образом:

public void customize (дескриптор ClassDescriptor) выдает Exception {
ObjectArrayMapping arrayMapping = new ObjectArrayMapping ();

arrayMapping.setReferenceClass (Wsensorstate.class);
arrayMapping.setAttributeName ("alarme");
arrayMapping.setFieldName ("CAlarmMess");
arrayMapping.setStructureName ("CAl");

descriptor.addMapping (arrayMapping);
}

Теперь возникает следующая ошибка:
Исключение [EclipseLink-197] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DescriptorException Исключение Описание: сопоставление [alarme] не является подходящим типом для этого дескриптора Mapping: org.eclipse.persistence.mappings.structures.ObjectArrayMapping [alarme] дескриптор: RelationalDes(com.companyname.entities.Wsensorstate -> [DatabaseTable (WSENSORSTATE)])

Я пытался добавить @StructConverter для CAlarmMess, но он также не работал.

Все предложения будутбыть оцененным, я уже потратил слишком много времени, работая над этим.:)

1 Ответ

0 голосов
/ 30 марта 2011

У вас есть настройщик WsensorstateCustomizer, который, я полагаю, установлен на объекте Wsensorstate, но добавляемое сопоставление настроено на ссылку на Wsensorstate.class.Это говорит EclipseLink, что вы пытаетесь создать массив / коллекцию Wsensorstate, что недопустимо, поскольку Wsensorstate является сущностью с RelationalDescriptor.Вместо этого вам нужно будет создать класс Java для структуры CAlarmMess, чтобы вы получили коллекцию объектов CAlarmMess в вашей сущности Wsensorstate.Или вы можете сопоставить сигнал тревоги непосредственно с VARRAY и иметь дело с объектом Oracle самостоятельно, но я бы пошел с предыдущим подходом.

Вам нужно будет создать ObjectRelationalDataTypeDescriptor для Java-класса CAlarmMess, поскольку я не знаю, предоставляется ли это через интерфейс JPA, так же, как вы создаете ObjectArrayMapping.Простой пример из автоматических тестов EclipseLink:

    ObjectRelationalDataTypeDescriptor descriptor = new ObjectRelationalDataTypeDescriptor();
    // SECTION: DESCRIPTOR
    descriptor.setJavaClass(Phone.class);
    Vector vector = new Vector();
    vector.addElement("PolicyHolders");
    descriptor.setTableNames(vector);

    // SECTION: PROPERTIES
    descriptor.descriptorIsAggregate();

    descriptor.setStructureName("PHONE_TYPE");
    descriptor.addFieldOrdering("PHONETYPE");
    descriptor.addFieldOrdering("AREACODE");
    descriptor.addFieldOrdering("PHONENUMBER");

    descriptor.addDirectMapping("type", "getType", "setType", "PHONETYPE");
    descriptor.addDirectMapping("areaCode", "getAreaCode", "setAreaCode", "AREACODE");
    descriptor.addDirectMapping("number", "getNumber", "setNumber", "PHONENUMBER");

, который необходимо добавить в сеанс в настройщике сеанса, прежде чем его можно будет использовать ObjectArrayMapping.

...