Eclipselink和ArrayMapping JPA问题

时间:2011-03-29 15:49:22

标签: java jpa eclipselink

我在从数据库中提取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字段 我用字段:

手动创建了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 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,但它也没有用。

所有建议都将受到赞赏,我已经花了太多时间来处理它。 :)

1 个答案:

答案 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可以使用之前,需要在会话自定义程序中将其添加到会话中。