2009-03-19 4 views
3

Я ищу решение для сохранения XML-файла в базе данных с помощью Hibernate.Сохранение XML-документа в базе данных (сочетание Hibernate и JAXB) в Java

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

Я пытаюсь использовать JAXB для сериализации XML-контента для бобы 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 аннотации, которые я мог бы использовать для решения этой проблемы?

ответ

1

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

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

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

1

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

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

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

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

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

1

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

некоторого код

@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));