読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

DBのXMLデータ型なるものをJPAで扱える???お試し編

JPA EclipseLink

今日のはモヤっとした投稿になります…(^^;

2013/7/7追記
と書いてたのですが、モヤっとしてたことを「しんさんの出張所」ブログの以下記事が色々と明確にして下さいました(^^;ありがとうございます。

RDBXMLを扱う
http://d.hatena.ne.jp/shin/20130706

次の案件の話を聞いていたら、あるDBテーブルのカラムでXML型を使うみたいな話がありました。
恥ずかしながら一部のリレーショナルDBに「XML型」なるものがあることを初めて知ったのですが…。ちなみにMS SQL Serverです。
http://msdn.microsoft.com/ja-jp/library/ms189887(v=sql.90).aspx

で、これを使いたいという話があって

「え、そもそも、そんな型の値をJPAで取れるの?」

みたいな疑問が(^^;

とりあえず、いつも通りにテーブルからエンティティ作成の流れで試してみると動くものはできました。

まずはテーブル定義。型「xml」!個人的に見慣れないので何か斬新(^^;

create table xmlTable(
    id int,
    xmlVal xml,
    primary key(id)
)

で、適当にMSDNにあったサンプル的なレコード作成しました。

INSERT INTO XmlTable values(1,'')

ここからNetBeansでお決まりのウィザード「データベースからのエンティティ・クラス」を実行

f:id:kikutaro777:20130705210840j:plain
f:id:kikutaro777:20130705210845j:plain
f:id:kikutaro777:20130705210849j:plain

以下のようなEntityクラスが生成されました。

package jp.co.hoge.entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author kikutaro777
 */
@Entity
@Table(name = "xmlTable")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "XmlTable.findAll", query = "SELECT x FROM XmlTable x"),
    @NamedQuery(name = "XmlTable.findById", query = "SELECT x FROM XmlTable x WHERE x.id = :id"),
    @NamedQuery(name = "XmlTable.findByXmlVal", query = "SELECT x FROM XmlTable x WHERE x.xmlVal = :xmlVal")})
public class XmlTable implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Size(max = 1073741823)
    @Column(name = "xmlVal")
    private String xmlVal;

    public XmlTable() {
    }

    //setter,getter略
    //hashCode、equals、toString略    
}

で、Entityからレコード取得すると…

f:id:kikutaro777:20130705210929j:plain

と、普通に取れるわけですが、これだと色々うまみがない気が(^^;

この辺りをみるとEclipseLinkではDescriptorCustomizerクラスを使ってゴニョゴニョゴニョと書いてあってDocument型に入れてたりする。

というか…

そもそもXML型の利点って何なんだろう(^^;?

ってなってきたので、そこからやりなおさねば…。

今日聞いた話では、ツリーのような形式のデータを保存、復元することが目的で、その表現でXMLを利用する…という流れだったのですが、まず個人的には、オブジェクトをそのままシリアライズしてBLOBに突っ込んだりしてもいいんじゃないのかなぁ、と思ったり。

そしたらXMLファイルとして吐きたい、という要望もある様子。

うーん、なんか色々モヤモヤしてる…やはりXML型の具体的な使われ方とかをもっと調べてみなきゃ。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村