JPA персистентность, мешающая JAXB - PullRequest
3 голосов
/ 18 апреля 2011

У меня есть библиотека объектов JAXB / Entity, которые я использую для отмены вызова потока XML. Я могу сделать это без проблем, просто работая как приложение Java SE. Я перенес все в приложение Java EE, используя Netbeans 6.9 и Glassfish 3.01. Сейчас я сталкиваюсь с рядом исключений, таких как следующие.

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 19 counts of IllegalAnnotationExceptions
Property _persistence_productBase_vh is present but not specified in @XmlType.propOrder
        this problem is related to the following location:
                at protected org.eclipse.persistence.indirection.WeavedAttributeValueHolderInterface entitiesjaxb.cmic.ajrs.com.ProductSorts._persistence_productBase_vh
                at entitiesjaxb.cmic.ajrs.com.ProductSorts
                at public entitiesjaxb.cmic.ajrs.com.ProductSorts entitiesjaxb.cmic.ajrs.com.ObjectFactory.createProductSorts()
                at entitiesjaxb.cmic.ajrs.com.ObjectFactory

Моя проблема в том, что в моих файлах enties / jaxb отсутствует элемент или переменная xml _persistence_productBase_vh. Я предполагаю, что это добавлено Glassfish и EclipseLink. Кто-нибудь знает, как игнорировать эти свойства? Вот сущность и пример из xml.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ProductSorts", propOrder = {
    "pkId",
    "productBase",
    "field",
    "value",
    "ts"
})

@Entity
@Table(name = "product_sorts")
@NamedQueries({
    //@NamedQuery(name = "ProductSorts.findAll", query = "SELECT p FROM ProductSorts p"),
    @NamedQuery(name = "ProductSorts.findByPkId", query = "SELECT p FROM ProductSorts p WHERE p.pkId = :pkId"),
    @NamedQuery(name = "ProductSorts.findByField", query = "SELECT p FROM ProductSorts p WHERE p.field = :field"),
    @NamedQuery(name = "ProductSorts.findByValue", query = "SELECT p FROM ProductSorts p WHERE p.value = :value"),
    @NamedQuery(name = "ProductSorts.findByTs", query = "SELECT p FROM ProductSorts p WHERE p.ts = :ts")})
public class ProductSorts implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "pk_id")
    private Integer pkId;
    @Column(name = "field")
    @XmlElement(name = "Field")
    private String field;
    @Column(name = "value")
    @XmlElement(name = "Value")
    private String value;
    @Basic(optional = false)
    @Column(name = "ts")
    @Temporal(TemporalType.TIMESTAMP)
    @XmlElement(required = true)
    @XmlSchemaType(name = "dateTime")
    private Date ts;
    @JoinColumn(name = "pk_product", referencedColumnName = "pk_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private ProductBase productBase;

    public ProductSorts() {
    }

    public ProductSorts(Integer pkId) {
        this.pkId = pkId;
    }



<ProductSorts>
  <pkID>317926</pkID>
  <pkProduct>118647</pkProduct>
  <Field>3D TECHNOLOGY</Field>
  <Value>No</Value>
  <ts>1970-01-13T00:43:15.947</ts>
</ProductSorts>

1 Ответ

1 голос
/ 18 апреля 2011

Это свойство (_persistence_productBase_vh) сплетено с сущностью JPA.Вы можете использовать доступ к свойству в ваших сопоставлениях JAXB, чтобы обойти эту проблему.

@XmlAccessorType(XmlAccessType.PROPERTY)

Когда EclipseLink выполняет переплетение байт-кода, он проверяет JAXB на пути к классам.Если присутствует JAXB, то это свойство будет связано с аннотацией @XmlTransient.Вы используете статическое или динамическое плетение?Если вы используете статическое плетение, вам нужно убедиться, что JAXB API jar находится на вашем пути к классам.

...