前に自分で書いたJPAでDBのXML型を扱う関連の
ですが、その後、以下のとても参考になる情報を頂きました(^^;
で、先日、Javaで単純なXMLを出力する関連で
を書いて、その後、以下のとても参考になる情報を頂きました(^^;
なんか色々助けて頂いてばかりで恐縮です…(-_-;精進します。
で、そろそろ本実装なのですが、この2つを合わせて、まずは簡単にJDOM2で作ったXMLをJPAでデータベースに書き込んでみました。
データベースは
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のクラスです。
private String getXmlStrFromDoc(Document doc){
XMLOutputter xmlOut
= new XMLOutputter(Format.getPrettyFormat().setOmitDeclaration(true));
return xmlOut.outputString(doc);
}
String selectedXml = getXmlStrFromDoc(selectedDoc);
private char[] getXmlCharArrFromDoc(Document doc){
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できることを確認できたので。
さて、サンプルはこの程度に、もう少し色々調べてちゃんと実装せねば。