3

我正在寻找一种使用 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 注释来解决该问题?

4

3 回答 3

1

Is it mandatory to do it that way? Hibernate is a persistence API which is intented not to care about how data is stored in no matter what DBMS engine or XML files. It is a framework to persist your objects. But it does not stop there, since you can run queries (pseudo SQL or through Criteria API), what results altogether in fact in an objet oriented data storage.

JAXB is a different monster, since it is intended to persist the objects in XML format, defined by a XSD-Schema, so resulting data can be exchanging between systems sharing the same model.

If storing your data in XML format is important for you, since you work with XML, maybe it has more sense to use a XML native database such as eXist, which lets you access and transform your XML data in a XML-friendly way (XSLT, XQuery, XPath).

于 2009-03-19T16:57:15.983 回答
1

看起来您正在尝试解决错误的问题。

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

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

但是,在您的情况下,您似乎想将 bean 编组/解组到 XML 和来自 XML ......这可以通过多个框架/库来完成;如果您使用的是休眠,真的没关系。

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

于 2009-03-19T18:38:40.093 回答
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));
于 2009-05-21T10:37:22.053 回答