Я реализовал REST API на основе JPA и JAXB.
У меня есть классы примерно такие (очень упрощенные):
@Entity
@XmlRootElement
...
public class Thing {
@Id
@GeneratedValue
...
@XmlAttribute
@XmlID
@XmlJavaTypeAdapter(JAXBLongAdapter.class)
private Long id;
...
}
Hibernate (мой текущий поставщик JPA )генерирует числа в качестве значения идентификатора, но они, естественно, уникальны только для одного типа, Thing в этом примере.
Теперь XSD говорит, что xsd :id (@XmlID )— это NCString, которая не может быть простым числом, поэтому я добавил «_» к числам в JAXBLongAdapter. -как ' _1'
Теперь валидатор схемы жалуется:
[org.xml.sax.SAXParseException: cvc-id.2: There are multiple occurrences of ID value '_1'.]
Если я правильно понимаю, элемент идентификатора xsd :должен иметь значение строки (), глобально уникальное в документе xml. Но это полностью противоположно обычному способу использования идентификаторов в базах данных.
Что мне теперь делать? Я думал о трех вещах:
Кажется, теперь мне нужно изменить схему базы данных, чтобы использовать разные идентификаторы. -Но было бы неплохо, если бы идентификаторы оставались короткими, потому что они появляются в URL-адресах.
Мой вопрос :Существует ли генератор идентификаторов, который является сравнительно быстрым и уникальным в глобальном масштабе? Или есть другой способ справиться с этим?
РЕДАКТИРОВАТЬ:
Этот хак работает, оставляя идентификаторы JPA нетронутыми.
@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.