java - 具有一对多关系和 java.util.Map 的 EclipseLink JAXB (MOXy)

标签 java jpa jaxb eclipselink moxy

我正在使用 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)

我的类(class):

类表 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
}

Table2PK 类:

@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。不支持这一点的部分原因是避免了指定反向引用何时适用于:仅键、仅值或键和值的复杂性。

关于java - 具有一对多关系和 java.util.Map 的 EclipseLink JAXB (MOXy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19948790/

相关文章:

java - 在java中的3个类中调用另一个类中的方法

java - Datanucleus RDBMS JPA 带依赖项的 jar

java - 将对象编码为 XML 会导致添加重复节点

java - Hibernate UUIDTypeDescriptor$ToBytesTransformer.parse() 方法中出现意外的 ArrayIndexOutOfBoundsException

java - Spring Data JPA 创建 bean 时出错

java - 使用 JAXB 2.x 基于 XSD 在运行时解析 XML

java - JAXB 和文档对象

java - 在多个类之间共享一个 JDBC 连接池

java - 在 Java 中是否可以在同一个 catch block 中捕获两个异常?

java - 从 log4j2.xml 配置中引用 java 类变量