在Java中将XML文档保存在数据库中(Hibernate和JAXB的组合)

时间:2009-03-19 14:45:36

标签: java xml hibernate annotations jaxb

我正在寻找一种使用Hibernate在数据库中保存XML文件的解决方案。

问题是,XML文件的结构与Hibernate-beans不同。

我正在尝试使用JAXB将XML内容序列化为Hibernate bean。

请想象以下场景: 有这个xml文件:

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

现在我想将property1和detail1保存在一个bean中:

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

    //+ getters and  setters ...

}

有没有人知道,我可以用哪种JAXB注解来解决这个问题?

3 个答案:

答案 0 :(得分:1)

这样做是强制性的吗? Hibernate是一种持久性API,无论DBMS引擎或XML文件是什么,它都不关心数据的存储方式。它是持久化对象的框架。但它并不止于此,因为您可以运行查询(伪SQL或通过Criteria API),实际上在面向对象的数据存储中实际上会产生什么结果。

JAXB是一个不同的怪物,因为它旨在以XML格式保存对象,由XSD-Schema定义,因此结果数据可以在共享相同模型的系统之间进行交换。

如果以XML格式存储数据对您来说很重要,因为您使用XML,可能更有意义的是使用eXist等XML本机数据库,它允许您访问和转换XML数据。一种XML友好的方式(XSLT,XQuery,XPath)。

答案 1 :(得分:1)

看起来你正试图解决错误的问题。

简而言之,数据库可以将XML存储为CLOB或XML数据类型(基本上是clob的扩展)

在这种情况下,您可以将适当的LOB处理程序映射到hibernate对象中的字符串或byte []字段(表示完整的xml文档)。

在你的情况下,看起来你想要将一个bean编组/解组为XML ...这可以通过多个框架/库完成;如果你正在使用休眠,那真的无关紧要。

只需为转换过程创建一些静态工具。

答案 2 :(得分:1)

我刚刚完成了同样的解决方案,我所做的是使用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));