加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JPA Long @Id作为JAXB @XmlID生成XSD验证错误

发布时间:2020-12-14 19:20:30 所属栏目:Java 来源:网络整理
导读:我已经实现了基于JPA和JAXB的REST API. 我有一个大致相似的课程(非常简化): @Entity@XmlRootElement...public class Thing { @Id @GeneratedValue ... @XmlAttribute @XmlID @XmlJavaTypeAdapter(JAXBLongAdapter.class) private Long id; ...} Hibernate(

我已经实现了基于JPA和JAXB的REST API.

我有一个大致相似的课程(非常简化):

@Entity
@XmlRootElement
...
public class Thing {
    @Id
    @GeneratedValue
    ...
    @XmlAttribute
    @XmlID
    @XmlJavaTypeAdapter(JAXBLongAdapter.class)
    private Long id;
    ...
}

Hibernate(我当前的JPA提供程序)生成数字作为id值,但它们自然只对一种类型唯一,在本例中为Thing.

现在XSD说xsd:id(@XmlID)是一个NCString,它不能是普通数字,所以我在JAXBLongAdapter中为数字加上’_’. – 比如’_1′

现在架构验证器抱怨:

[org.xml.sax.SAXParseException: cvc-id.2: There are multiple occurrences of ID value '_1'.]

如果我理解正确,xsd:ID元素必须具有xml文档中全局唯一的(字符串)值.但这与在数据库中使用ID的常见方式完全相反.

现在我该怎么做?
我想到了三件事:

>为每种类型创建一个具有特定类型前缀的JAXBLongAdapter?
>使用另一个JPA id生成器,也许是UUID? – 但是哪一个?
>停止使用@XmlID和@XmlIDREF,这会产生冗余和一般混乱.

我现在似乎必须更改数据库架构以使用不同的ID.
? – 但如果ID仍然很短,那将会很好,因为它们出现在URL中.

我的问题:ID发生器是否具有相对快速且全球独一无二的特点?
还是有另一种解决方法吗?

编辑:

这种黑客有点工作,使JPA ID保持不变.

@XmlID
@XmlAttribute(name="id")
private String getXmlID(){
    return String.format("%s-%s",this.getClass().getSimpleName(),this.getId().toString());
}

private void setXmlID(String xmlid){
    String prefix = String.format("%s-",this.getClass().getSimpleName());
    if(xmlid.startsWith(prefix)){
        this.id = Long.parseLong(xmlid.substring(prefix.length()));
    }else{
        throw new IllegalArgumentException(xmlid+" does not look like "+prefix+"###");
    }
}

通过将JAXB Annotation从字段移动到XmlID的专用私有getter / setter.

最佳答案
这正是我一段时间以来所做的.

在编组时,您可以问自己这个域对象的实际@XmlID是什么?

我曾经认为@XmlID和@XmlIDREF可以解决JAXB中的循环问题.

以下是我正在使用JPA实体和JAXB注释.

不要给简单的JPA @Id了.这是JPA的核心.

@XmlRootElement
public class Parent {

    @Id
    @XmlAttribute
    private Long id;

    @OneToMany
    @XmlElement(name = "child")
    @XmlElementWrapper
    private Collection

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读