Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JDOM2で生成したXMLをJPAでXML型に突っ込む

前に自分で書いたJPAでDBのXML型を扱う関連の

ですが、その後、以下のとても参考になる情報を頂きました(^^;

で、先日、Javaで単純なXMLを出力する関連で

を書いて、その後、以下のとても参考になる情報を頂きました(^^;

なんか色々助けて頂いてばかりで恐縮です…(-_-;精進します。

で、そろそろ本実装なのですが、この2つを合わせて、まずは簡単にJDOM2で作ったXMLJPAでデータベースに書き込んでみました。

データベースは

DB:MS SQL Server 2012
JDBC:Microsoft JDBC Driver 4.0 for SQL Server

です。

とりあえずサンプルレベルとして、NativeQuery使ってinsert文をは以下のような感じに。

em.createNativeQuery("
  insert into HogeHogeTable   
  (HogeID,HogeResult,CreateUserId,UpdateUserId,CreateDate,UpdateDate)
  values
  (1, ?,'kikutaro777','kikutaro777',
    '2013-07-30 00:00:00.000','2013-07-30 00:00:00.000'
  );").setParameter(1, selectedXml).executeUpdate();

HogeResultがXML型のカラムです。

で、指定したselectedXMLという変数は以下2つメソッドを定義して試しました。
DocumentクラスはJDOM2のクラスです。

  • XMLをStringで扱う
private String getXmlStrFromDoc(Document doc){
    //XML宣言部(<?xml version="1.0" encoding="UTF-8"?>は除外するため、omitをtrueで指定)
    XMLOutputter xmlOut 
        = new XMLOutputter(Format.getPrettyFormat().setOmitDeclaration(true));
    return xmlOut.outputString(doc);
}
String selectedXml = getXmlStrFromDoc(selectedDoc);
  • XMLをChar[]で扱う
private char[] getXmlCharArrFromDoc(Document doc){
    //XML宣言部(<?xml version="1.0" encoding="UTF-8"?>は除外するため、omitをtrueで指定)
    XMLOutputter xmlOut 
        = new XMLOutputter(Format.getPrettyFormat().setOmitDeclaration(true));
        
    CharArrayWriter charArrXmlWriter = new CharArrayWriter();
    try {
        xmlOut.output(doc, charArrXmlWriter);
    } catch (IOException ex) {
        Logger.getLogger(ItemBusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    return charArrXmlWriter.toCharArray();
}
char[] selectedXml = getXmlCharArrFromDoc(selectedDoc);

JDOM2のXMLOutputterはoutputStringメソッドでStringにしたり、outputメソッドでOutputStreamやWriterで出力したりできるので便利ですね。

とりあえず、上記のどちらでも無事insertできました。

ただ、XMLの宣言部(<?xml version="1.0" encoding="UTF-8"?>)を入れるとinsertできなかったです。多分この辺ですが、今日は英語を読む元気ないので来週に…。

ちなみに最初Stringの例でやっていたときに、うまくinsertしたデータが切れてしまうケースがあって、あれっ、Stringの最大を超えた…?ん?ん?とか思って以下つぶやいたのですが

試しに巨大なXMLデータを生成してみたのですが、上記2つの例(StringとChar[])ともに、JDOMからXMLOutputterで吐き出す際にheapエラーになりました(^^;
そりゃそうだ。

データが切れたのは多分ですが単純に変なデータが入ってただけのようです。今日、どちらでも正常にinsertできることを確認できたので。

さて、サンプルはこの程度に、もう少し色々調べてちゃんと実装せねば。

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