2008/4/23 水曜日

hiernate ハマリ道 @Table書き忘れ。

このエントリをはてなブックマークに追加hiernate @Table吾綽のはてなブックマーク被リンク数
Filed under: java — akky @ 16:24:43

Criteria.list()のタイミングで結果を取得できない。第2弾

hibernate.cfg.xmlにmappingのエンティティクラスの名前を書いたけど、エンティティのソースに

@Entity
@Table(name = “テーブル名”)

を書いていなかった。

log4jを使っている場合に、hibernateのログをやったら出して、下のログが出ていればマッピング情報が作られている。

Bind entity エンティティクラス名 on table テーブル名

マッピングの状態を

hiernate ハマリ道 hibernate.xfg.xmlを入れ忘れ

このエントリをはてなブックマークに追加hiernate hibernate.xfg.xmlャ綽のはてなブックマーク被リンク数
Filed under: java — akky @ 11:22:58

hibernate3でannotationを使ってコーディングを実施。org.hibernate.Criteria#list()を何度実行しても、空のリストが帰ってくる。DB側のログを見ると接続してはいるが、SQLを実行している形跡がない。テーブルを変えてみても駄目。

それで、別プロジェクトで作られた同じやり方をしているソースコード見ても特段の違いを感じられない。もう、こうなったらということで、一通りのソースを見ていると、hibernate.xfg.xmlを発見。これが無いからだorz。半日無駄にしてしまった。

2008/1/13 日曜日

org.eclipse.core.runtime.CoreException: XML 文書を構文解析できません

このエントリをはてなブックマークに追加org.eclipse.core.runtime.CoreException: XML 吾罕茹fс障のはてなブックマーク被リンク数
Filed under: java — akky @ 12:00:56

タイトルの通りです。Tomcatのプロジェクト名(ディレクトリ名に?)漢字が含まれていると,eclipseプラグインからTomcatを起動できませんでした。エラーのスタックトレースはこちら↓。

eclipse.buildId=M20060629-1905
java.version=1.5.0_09
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=ja_JP
Command-line arguments:  -os win32 -ws win32 -arch x86

エラー
Sun Jan 13 00:31:35 JST 2008
org.eclipse.core.runtime.CoreException: XML 文書を構文解析できません。at org.eclipse.debug.core.DebugPlugin.abort(DebugPlugin.java:1202)
at org.eclipse.debug.core.DebugPlugin.parseDocument(DebugPlugin.java:1178)
at org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector.doInitializeFromMemento(AbstractSourceLookupDirector.java:410)
at org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector.initializeFromMemento(AbstractSourceLookupDirector.java:546)
at org.eclipse.debug.internal.core.LaunchConfiguration.initializeSourceLocator(LaunchConfiguration.java:523)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:638)
at com.sysdeo.eclipse.tomcat.VMLauncherUtility.runVM(VMLauncherUtility.java:95)
at com.sysdeo.eclipse.tomcat.TomcatBootstrap.runTomcatBootsrap(TomcatBootstrap.java:202)
at com.sysdeo.eclipse.tomcat.TomcatBootstrap.start(TomcatBootstrap.java:95)
at com.sysdeo.eclipse.tomcat.actions.StartActionDelegate.run(StartActionDelegate.java:38)
at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:254)
at org.eclipse.ui.internal.WWinPluginAction.runWithEvent(WWinPluginAction.java:229)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539)
at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:441)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1914)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1878)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:419)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)
org.eclipse.core.runtime.CoreException[120]: org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:215)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:386)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1810)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at org.eclipse.debug.core.DebugPlugin.parseDocument(DebugPlugin.java:1172)
at org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector.doInitializeFromMemento(AbstractSourceLookupDirector.java:410)
at org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector.initializeFromMemento(AbstractSourceLookupDirector.java:546)
at org.eclipse.debug.internal.core.LaunchConfiguration.initializeSourceLocator(LaunchConfiguration.java:523)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:638)
at com.sysdeo.eclipse.tomcat.VMLauncherUtility.runVM(VMLauncherUtility.java:95)
at com.sysdeo.eclipse.tomcat.TomcatBootstrap.runTomcatBootsrap(TomcatBootstrap.java:202)
at com.sysdeo.eclipse.tomcat.TomcatBootstrap.start(TomcatBootstrap.java:95)
at com.sysdeo.eclipse.tomcat.actions.StartActionDelegate.run(StartActionDelegate.java:38)
at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:254)
at org.eclipse.ui.internal.WWinPluginAction.runWithEvent(WWinPluginAction.java:229)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539)
at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:441)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1914)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1878)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:419)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)

このログ、ワークスペースの下にある.metadata/.log を見ると漢字が文字化けしています。「ウィンドウ」→「ビュー」→「エラー・ログ」から見ると文字化けしてないです。

いきなり、eclipseプラグインからTomcatが立ち上がらなくなったと感じてしまったが、プロジェクト名に漢字を含むものを作り、Tomcatのコンテキストに追加したのが原因でした。

2007/12/21 金曜日

Java を使って画面コピーを取得する

このエントリをはてなブックマークに追加Java 篏帥c脂≪潟若緇のはてなブックマーク被リンク数
Filed under: java — akky @ 11:41:14

タイトルの通り。
環境はこちら。

C:Documents and Settingsuser1>java -version
java version "1.5.0_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b03)
Java HotSpot(TM) Client VM (build 1.5.0_09-b03, mixed mode, sharing)

C:Documents and Settingsuser1>

コードはこれ。

// $Id$
package test;

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class Capture {

	public static void main(String[] args) throws Exception {
		Capture self = new Capture();
		self.screenCapture(new URL("http://www.akky.org/"),new File("test.png"));
	}
	/**
	 * IEを使ってキャプチャーする
	 * @param url 対象URL
	 * @param saveFile 保存ファイル名
	 * @throws AWTException java.awt.Robotクラスからの例外
	 * @throws IOException 画面イメージの保存中にエラー
	 * @throws InterruptedException ブラウザの描画待ちの間に割り込みが発生した
	 */
	private void screenCapture(URL url,File saveFile) throws AWTException, IOException, InterruptedException{
		// IEを起動
		String command = "C:\Program Files\Internet Explorer\IEXPLORE.EXE " + url.toString();
		Process process = Runtime.getRuntime().exec(command);
		// ブラウザの描画が終るであろう、30秒程度待つ
		Thread.sleep(1000 *10);
		// 画面キャプチャーを取得
		Robot robot = new Robot();
		Rectangle rect = new Rectangle(1024, 768);
		BufferedImage captured = robot.createScreenCapture(rect);
		// ConvolveOpを使ってボカシを掛ける
		float scale = 0.2f; // 縮小する比率
		int size = (int)(1.0/scale);
		float[] kernelData = new float[size*size];
		for (int i = 0; i > size * size; i++) {
			kernelData[i] = 1.0f / size / size;
		}
		Kernel kernel = new Kernel(size, size, kernelData);
		ConvolveOp coOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
		BufferedImage inter = new BufferedImage(captured.getWidth(), captured.getHeight(), captured.getType());
		coOp.filter(captured, inter);
             // ぼかした画像を縮小
                AffineTransformOp atOp = new AffineTransformOp(
                    AffineTransform.getScaleInstance(scale, scale), null);
                BufferedImage dest = new BufferedImage((int)(captured.getWidth() * scale),
                     (int)(captured.getHeight() * scale),
                    captured.getType());
                atOp.filter(inter, dest);
                // 保存
		saveFile.delete();
		ImageIO.write(dest, "png", saveFile);
		// IEを終了
		process.destroy();
	}

2007/12/6 木曜日

PostgreSQLとHibernateとトランザクション

このエントリをはてなブックマークに追加PostgreSQLHibernate潟吟激с海里呂討淵屮奪マーク被リンク数
Filed under: java — akky @ 22:17:59

DBアクセスにHiberanteをつかったJavaアプリを作ったときに発生した悩ましい問題。検索だけの画面の実装において、一連の処理が終わった後にはHibernateのセッションを閉じるためにfinallyでSession.close()を実行している。けど、pgAdminでPostgreSQLのロックの状態をみると、検索したテーブルの索引を排他ロックしたままになっている。明示的にトランザクションの開始をしていないけど、セッションを終了させているのだからトランザクションも終了させてロックを解除して欲しい。けど、ロックしたままになっている。poolしていないけどセッションも残っているが若干気になるが、ロックが残っているもが解せない。

試行錯誤の結果、検索だけであっても明示的にトランザクションを開始し、セッションを閉じる前にcommitする。そうすることで、ロックの残骸はなくなったけどすっきりしないな。これまでの開発ではセッションを閉じるタイミングで暗黙的に開始されているトランザクションであればロールバックされ、ロックも開放されるのだけどな。

PostgreSQLとHibernateとの相性が良くないのか、Hiernateの使い方が間違っているのか。

2007/11/30 金曜日

hiberanteとPostgreSQL

このエントリをはてなブックマークに追加hiberantePostgreSQLのはてなブックマーク被リンク数
Filed under: java — akky @ 18:24:17

仕事が忙しくて一月の間放置。久しぶりです。

で、忙しかった仕事はPostgreSQLのDBにHibernateを使ってDBアクセスする方式。初めてのHibernateであったけど、使い方は概ね障害となることもなく進んだのだが、いまだに解決できていない問題がある。それは、Hibernateのセッションはcloseしているのだけど、PostgreSQLから見るとトランザクションの途中で排他ロックしているオブジェクトが残ってしまう。PGの意図としてはセッションをcloseしたのだからトランザクションも終了して欲しいのだが、現実は残っている。

事象をもう少し説明すると、SELECTだけを実行しているのにトランザクションの途中になっている。まあ、暗黙的にトランザクションを開始しているのだろうけど、セッションを終了させたのだから暗黙的に開始されたトランザクションも終了して欲しいな。と。半月近く悩み続けているこの問題。ちょっと余裕が出てきたので考え直し。
これまでは、JDBC(というかjava.sql.*のクラスを直接実行する方式だけでしか業務アプリを作成したことがなく、これまではSELECTだけであればfinallyでjava.sql.Connectionをcloseすることでトランザクションも終了させていた。が、今回はそうもいかない。

余裕があることで、Hierbateのソースを持ってきてeclipseからふにふにとデバック実行ですよ。org.hibernate.impl.SessionImpl#Close()を追っていくと、java.sql.Connectionのセッションをクローズする分岐に入っていかないな。なんでだろう・・・

試しに明示的にトランザクションを開始させ、セッションをcloseするためにトランザクションをcommitするとPostgreSQLにトランザクション途中のものはなくなっている。

Webの記事を見ていると、Hibernate + PostgreSQLの例があるが、SELECTだけでも明示的にとトランザクションを開始/終了している記事は見つけられず。なにか、設定が足りないのか外れを引いてしまったのか・・・

2007/9/13 木曜日

プロパティファイルを編集するeclipseのエディタ

このエントリをはてなブックマークに追加c<ゃ膩eclipsec燭里呂討淵屮奪マーク被リンク数
Filed under: java — akky @ 1:00:59

eclipseを使い、プロパティファイルに定義したメッセージをResourceBundleを使って読み込むクラスをテストしている過程でプロパティファイルをeclipseから編集して、native2asciiを通さずともメッセージに含まれている漢字が文字化けせずに表示されて驚いていた。プロパティファイルで漢字を表すにはnative2asciiを使ってUnicode参照文字にする必要があるのだけど、それをやっていない。プロパティファイルを開きなおしても漢字がそのまま表示されている。

native2asciiを通していなくても文字化けしない気持ち悪さを解決するために記憶を手繰っていくと、どこかのWebサイトにプロパティファイルを編集するeclipseのプラグインがあることを思い出した。使っているeclipseはAll-In-Oneだ。きっとプラグインがインストールされているに違いない。
プロパティファイルをメモ帳で開くとUnicode参照文字になっていた。これですっきり。

これを書いている過程でAll-In-Oneのプロジェクトホーム http://aioec.sourceforge.jp/cgi-bin/wiki.cgi を見てみると画面が真っ白。約1年近く成果物がメンテナンスされていないみたい。休止しているのかな?

次のページ »