3

Hibernate を使用して XML ファイルをデータベースに保存するソリューションを探しています。

問題は、XML ファイルの構造が Hibernate Bean と異なることです。

JAXB を使用して XML コンテンツを Hibernate Bean にシリアライズしようとしています。

次のシナリオを想像してください: 次の xml ファイルがあります。

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

次に、property1 と detail1 を 1 つの Bean に保存します。

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

    //+ getters and  setters ...

}

その問題を解決するためにどの JAXB アノテーションを使用できるか、誰にも考えがありますか?

4

3 に答える 3

1

間違った問題を解決しようとしているようです。

要するに、データベースはXMLをCLOBまたはXMLデータ型(基本的にはCLOBの拡張)として格納できます。

この場合、適切なLOBハンドラーを休止状態オブジェクトのstringまたはbyte []フィールド(完全なxmlドキュメントを表す)にマップします。

ただし、あなたの場合、XMLとの間でBeanのマーシャル/アンマーシャルを実行したいようです...これは、多数のフレームワーク/ライブラリで実行できます。休止状態を使用しているかどうかは関係ありません。

変換プロセス用の静的ユーティリティを作成するだけです。

于 2009-03-19T18:38:40.093 に答える
1

そのようにすることは義務ですか?Hibernate は永続化 API であり、DBMS エンジンや XML ファイルに関係なく、データがどのように格納されるかを気にしないことを目的としています。オブジェクトを永続化するためのフレームワークです。しかし、それだけではありません。クエリを実行できるため (疑似 SQL または Criteria API を介して)、実際にはオブジェクト指向のデータ ストレージになります。

JAXB は、XSD スキーマによって定義された XML 形式でオブジェクトを永続化することを目的としているため、別の怪物です。その結果、同じモデルを共有するシステム間でデータを交換できます。

XML を扱っているため、データを XML 形式で保存することが重要な場合は、 eXistなどの XML ネイティブ データベースを使用する方が理にかなっている可能性があります。 、XQuery、XPath)。

于 2009-03-19T16:57:15.983 に答える
1

私が行ったのと同じ種類のソリューションを実行したところ、休止状態と 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 に答える