JPA Long @Id as JAXB @XmlID генерирует ошибку проверки XSD

Я реализовал 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. Но это полностью противоположно обычному способу использования идентификаторов в базах данных.

Что мне теперь делать? Я думал о трех вещах:

  • Создать JAXBLongAdapter для каждого типа с префиксом для конкретного типа?
  • Используя другой генератор идентификаторов JPA, возможно, UUID? -Но какой?
  • Прекратите использовать @XmlID и @XmlIDREF, которые создают избыточность и общий беспорядок.

Кажется, теперь мне нужно изменить схему базы данных, чтобы использовать разные идентификаторы. -Но было бы неплохо, если бы идентификаторы оставались короткими, потому что они появляются в 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.

5
задан sleeplessnerd 6 August 2012 в 11:05
поделиться