- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经实现了一个基于 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'
现在模式 validator 提示:
[org.xml.sax.SAXParseException: cvc-id.2: There are multiple occurrences of ID value '_1'.]
如果我理解正确,则 xsd:ID 元素必须具有在 xml 文档中全局唯一的(字符串)值。但这与在数据库中使用 ID 的常见方式截然相反。
我现在该怎么办?我想到了三件事:
看来我现在必须更改数据库架构以使用不同的 ID。 - 但如果 ID 保持简短就好了,因为它们出现在 URL 中。
我的问题:是否有速度相对较快且全局唯一的 ID 生成器?或者有其他方法可以解决这个问题吗?
编辑:
这种 hack 有点管用,让 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 注释从字段移动到 XmlID 的专用私有(private) 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<Child> children;
}
@XmlRootElement
public class Child {
@XmlAttribute
private Long getParentId() {
return parent.getId();
}
@Id
@XmlAttribute
private Long id;
@ManyToOne
@XmlTransient // for preventing infinite circular problem
private Parent parent;
}
关于java - JPA Long @Id as JAXB @XmlID 生成 XSD 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791735/
我不太明白 @XmlIDREF 和 @XmlID 如何协同工作。通过使用 XmlIDREF,我只创建对实际元素的引用。但是 XmlID 的用例是什么。 我想创建对 Publication 类的引用。使
我有以下层次结构: public class Small { private String xmlId; @XmlID @XmlAttribute public Str
如果有一些带有相同值的@XmlID 注释属性,即使它们属于不同类型,JAXB 也无法成功解码对象,但是编码很好。 这是一个错误吗? 否则,如何支持该功能? 代码: package xml; impor
好的。我是 JAXB 新手,在 XmlID 和 XmlIDREF 方面遇到一些麻烦,其中 ID 位于抽象类中。 这是我的问题: 抽象类 @XmlAccessorType(XmlAccessType.F
jaxb @XmlIDREF @XmlID 工作惊人 我的 xml 输入是 1
我有以下类(class): @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Employee {
我正在使用 Hibernate 和 RESTeasy,我尽量避免与这些实体形成循环,因为我在 Artiste 和 Oeuvre 实体之间存在 OneToMany (ManyToOne) 双向关系: O
我有两个类,如下所示,带有 JAXB 注释。我查过有关应对周期的信息,但我仍然不明白。在示例中,@XmlID 和@XmlIDREF 在这两个类中如何相互协作?为什么两个类中都有@XmlDREF?有人可
我正在尝试将两个不同的 XML 文件编码/取消编码到 POJOS。第一个 XML 文件如下所示: --Network.xml--
根据 https://gist.github.com/VineetReynolds/5108580 ,JAXB 规范要求用 @XmlID 注释的元素是 String。 MOXy 在 2.5.x 版
我正在尝试将两个不同的 XML 文件编码/取消编码到 POJOS。第一个 XML 文件如下所示: --Network.xml--
我正在使用 CXF 公开 Web 服务。我使用 @XmlID 和 @XmlIDREF JAXB 注释来在编码/解码期间维护对象图的引用完整性。 WSDL 正确地包含具有 xs:id 和 xs:idre
您好,我在使用网络服务时遇到问题我有一个包含许多角色的用户对象。 当我从包含一个角色的网络服务中获取一个用户(Id:3)时,该角色包含许多用户(id:3和id 2)。我收到一个错误 由以下原因引起:j
我已经实现了一个基于 JPA 和 JAXB 的 REST API。 我有一个大致像这样的类(非常简化): @Entity @XmlRootElement ... public class Thing
我有这样两个实体: @XmlRootElement(name = "provider") @XmlAccessorType(XmlAccessType.PROPERTY) @Entity pub
我正在使用@XmlID 和@XmlIDREF 标记从一个对象引用另一个对象。即使使用继承类,它在 Java 6 中也能正常工作。我创建的示例代码如下所示。基类使用的标签: @XmlRootElemen
我是一名优秀的程序员,十分优秀!