EclipseLink JAXB (MOXy) with One-to-Many relationship and ja



我正在使用EclipseLink JPA和JAXB(MOXy)将JPA实体转换为XML。对于正常的一对多操作,系统工作正常,但如果此关系是双向的,并且其中一个实体具有复合 id,使用 java.util.Map 类,则系统会抛出异常。

关系是:

表1:

Fields: id, col1. 
Primary Key: id

表2:

Fields: id, table1_id, col1
Primary Key: (id, table1_id)

我的课程:

类表 1:

@Entity
@Table(name = "table1")
@XmlRootElement
public class Table1 implements Serializable {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "table1")
    @MapKey(name = "table2PK")
    @XmlElement    
    @XmlInverseReference(mappedBy="table1")
    private Map<Table2PK, Table2> table2;
    @XmlElementWrapper(name="table2s")
    public Map<Table2PK, Table2> getTable2() {
        return table2;
    }
    // Gettters and setters methods
}

类表2:

@Entity
@Table(name = "table2")
@XmlRootElement
public class Table2 implements Serializable {
    @EmbeddedId
    protected Table2PK table2PK;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "table1_id", insertable = false, unique = false, nullable = false, updatable = false)
    private Table1 table1;
    // Gettters and setters methods
}

班级表2PK:

@Embeddable
public class Table2PK implements Serializable {
    @Basic(optional = false)
    @Column(name = "id")
    private int id;
    @Basic(optional = false)
    @Column(name = "table1_id")
    private int table1Id;
    // Gettters and setters methods
}

JPA 工作正常,但 JAXB 封送和解封操作使用以下代码:

JAXBContext jc1 = JAXBContext.newInstance(Table1.class);
Marshaller marshaller = jc2.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(ts, System.out);

抛出一个javax.xml.bind.JAXBException。

消息是:

Exception [EclipseLink-110] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Descriptor is missing for class [java.util.Map].
Mapping: org.eclipse.persistence.oxm.mappings.XMLInverseReferenceMapping[table2]
Descriptor: XMLDescriptor(org.jbiowhpersistence.datasets.gene.gene.entities.Table1 --> [DatabaseTable(table1)])
Exception [EclipseLink-110] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Descriptor is missing for class [java.util.Map].
Mapping: org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping[table2]
Descriptor: XMLDescriptor(org.jbiowhpersistence.datasets.gene.gene.entities.Table1 --> [DatabaseTable(table1)])

我的班级定义出了什么问题?提前感谢和最诚挚的问候。

EclipseLink JAXB (MOXy) 不支持对类型为 java.util.Map 的字段/属性进行@XmlInverseReference。 不支持此功能的部分原因是避免指定反向引用何时应用于:仅键、仅值或同时应用于键和值的复杂性。

映射不能

使用 JAXB 进行映射。您需要创建一个可映射的等效类。然后创建一个 XMlAdapter 以从不可映射的对象转换为可映射的对象。

例如:

class MapType{
    public List<MapEntryType> mapEntries = new ArrayList<MapEntryType>();
}
class MapEntryType {     
         @XmlAttribute   public Integer key;       
         @XmlValue   public String value;   
}

您可以在此链接上找到如何创建 XMLAdapter

希望对您有所帮助。

最新更新