Сохранение XML-документа в базе данных (сочетание Hibernate и JAXB) в Java - PullRequest
3 голосов
/ 19 марта 2009

Я ищу решение для сохранения XML-файла в базе данных с использованием Hibernate.

Проблема в том, что структура XML-файла отличается от Hibernate-бинов.

Я пытаюсь использовать JAXB для сериализации XML-контента в bean-компонент Hibernate.

Пожалуйста, представьте следующий сценарий: Есть этот xml файл:

<root>    
    <general>
        <property1/>          
        <property2/>
    </general>
    <details>
        <detail1>
        <detail2>
</root>

Теперь я хочу сохранить property1 и detail1 в одном компоненте:

@Entity
@Table(name = "tablename")
class Bean(){
    public String property;
    public String detail;

    //+ getters and  setters ...

}

Кто-нибудь знает, какие аннотации JAXB я мог бы использовать для решения этой проблемы?

Ответы [ 3 ]

1 голос
/ 19 марта 2009

Похоже, вы пытаетесь решить не ту проблему.

В коротких базах данных XML может храниться как в виде CLOB, так и в виде XML-типа (в основном это расширение clob)

В этом случае вы должны сопоставить соответствующий обработчик больших объектов с полем строки или байта [] (представляющим полный XML-документ) в вашем спящем объекте.

В вашем случае, однако, похоже, что вы хотите перевести / демонтировать bean-компонент в и из XML ... что может быть сделано множеством фреймворков / библиотек; и действительно не имеет значения, используете ли вы спящий режим или нет.

Просто создайте статический утилит для процесса преобразования.

1 голос
/ 21 мая 2009

Я только что сделал то же самое решение, которое я использовал, используя смесь hibernate и XStream с xstream, я использовал аннотацию XStreamAlias ​​("") для моего класса и полей и сопоставил их с действительным документом xml и запустил их через xstream.fromXML (), и он создает bean-компоненты, а затем bean-компоненты вставляются в базу данных

некоторый код

@XStreamAlias("task")
public class Task {

    @XStreamOmitField
    private Long id;

    @XStreamAlias("subject-type")
    private String subject;

    @XStreamAlias("body")
    private String body;

    @XStreamAlias("frame")
    private String timeframe;

    @XStreamAlias("due-at")
    private String due;

    @XStreamAlias("alert-at")
    private String alarm;


    /** Getters/Setters **/
}


<?xml version="1.0"?>
<tasks>
    <task>
        <subject-type></subject-type>
        <body>A task for today</body>
        <frame>today</frame>
        <due-at type="datetime"></due-at>
        <alert-at type="datetime"></alert-at>
    </task>
</tasks>


// Test Case
        File xml = new File("xmlfile.xml");

        XStream xstream = new XStream();

        xstream.processAnnotations(new Class[]{ Task.class });
        xstream.alias("tasks", ArrayList.class);


    List tasks = (List)xstream.fromXML(new FileReader(xml));
1 голос
/ 19 марта 2009

Обязательно ли так делать? Hibernate - это постоянный API, который не заботится о том, как хранятся данные, независимо от того, какой движок СУБД или XML-файлы. Это основа для сохранения ваших объектов. Но это не останавливается на достигнутом, поскольку вы можете запускать запросы (псевдо-SQL или через Criteria API), что в итоге приводит к объектно-ориентированному хранилищу данных.

JAXB - это другой монстр, поскольку он предназначен для сохранения объектов в формате XML, определяемом XSD-схемой, поэтому результирующие данные могут обмениваться между системами, использующими одну и ту же модель.

Если для вас важно хранить данные в формате XML, так как вы работаете с XML, возможно, имеет больше смысла использовать собственную базу данных XML, такую ​​как eXist , которая позволяет вам получать доступ и преобразовывать ваш XML данные в формате XML (XSLT, XQuery, XPath).

...