我在从数据库中提取Oracle自定义类型的数据时遇到问题 表中的一列是Oracle自定义类型(实际上是VARRAY):
以下是此类型的创建声明:
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
我使用Eclipse的Oracle工具为表(WSENSORSTATE
)生成了Entity。该字段生成为Object
字段
我用字段:
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 descriptor)抛出异常{
ObjectArrayMapping arrayMapping = new ObjectArrayMapping();arrayMapping.setReferenceClass(Wsensorstate.class);
arrayMapping.setAttributeName( “ALARME”);
arrayMapping.setFieldName( “CAlarmMess”);
arrayMapping.setStructureName( “CAlarmMessList”);descriptor.addMapping(arrayMapping);
}
现在它出现以下错误:
异常[EclipseLink-197](Eclipse Persistence Services - 2.0.1.v20100213-r6600):org.eclipse.persistence.exceptions.DescriptorException
异常说明:映射[alarme]不是此描述符的适当类型
映射:org.eclipse.persistence.mappings.structures.ObjectArrayMapping [alarme]
描述符:RelationalDescriptor(com.companyname.entities.Wsensorstate - > [DatabaseTable(WSENSORSTATE)])
我尝试为CAlarmMess添加@StructConverter,但它也没有用。
所有建议都将受到赞赏,我已经花了太多时间来处理它。 :)
答案 0 :(得分:0)
你有一个WsensorstateCustomizer定制器我假设在Wsensorstate实体上设置,但你添加的映射设置为引用Wsensorstate.class。这告诉EclipseLink您正在尝试构建Wsensorstate的数组/集合,这是不允许的,因为Wsensorstate是具有RelationalDescriptor的实体。相反,您必须为CAlarmMess结构创建一个java类,以便在Wsensorstate实体中获取CAlarmMess对象的集合。或者您可以将警报直接映射到VARRAY并自己处理Oracle对象,但我会采用之前的方法。
您需要为CAlarmMess java类构建一个ObjectRelationalDataTypeDescriptor,因为我不知道它是否通过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可以使用之前,需要在会话自定义程序中将其添加到会话中。