JPA 実行SQLを出力する [Java]
JPA関連の情報が少ないので、試行錯誤をしてます。
一番やっかいなのは、正常にquery実行しているくせに何も取得できないケース。
本当に意図しているSQLが発行されていることを確認するには、、、
persistence.xmlにオプションを追加
<property name="eclipselink.logging.level.sql" value="fine"/>
これを使うとJUnitの裏で何やってるかも一目瞭然です。
DROP TABLE、CREATE TABLEを裏で実行しているんで、JUnit実行のたびにテーブルが空っぽになるんですね。
■追記
DROP TABLE、CREATE TABLEについては同じくpersistence.xmlでのオプション指示によるものです。
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
DBデータに対して何もしたくないときには、以下の記述を入れるか、同オプションを指定しないかで対応できます。
<property name="eclipselink.ddl-generation" value="none" />
JUnitなどのテスト時には"drop-and-create-tables"、実稼働時には"none"ということになりそうです。
NetBeansでMavenを使う(解決編) [Java]
Mavenプロジェクトを作成しようとするとこんなエラーが発生。
Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-clean-plugin:2.4.1: Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1
読み込みに失敗しているらしい。
怪しいのはネットワーク設定で、社内環境につきプロキシサーバ経由で外部サイトにアクセスしている。
NetBeansのプロキシ設定は「ツール⇒オプション⇒一般」からできる。
しかし「システムのプロキシ設定を使用」がすでに選択されており、問題ない。
仕方ないので、下記サイトから手動でMavenパッケージをダウンロードして、適当なところに解凍。
http://maven.apache.org/download.cgi
今回は apache-maven-3.3.3-bin.zip を選択。
NetBeansのMaven設定を変更する。
ツール⇒オプション⇒Java⇒Maven
Mavenのホームを解凍先に変更する。
これで問題ないはずと再度Mavenプロジェクト作成にチャレンジ!
しかし状況は変わらず。
そういえばどこかのサイトでMavenはMavenで独自にプロキシ指定があると読んだ気がする。
解凍先のファイルをあさっていくと、それらしいヤツを発見。
apache-maven-3.3.3\conf\settings.xml
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>
コメントアウトになっているが、明らかに怪しい。
さっそく設定して、Mavenプロジェクトを作成してみるとサクサク進むではないか!
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 01:25 min
Finished at: 2015-09-18T13:14:56+09:00
Final Memory: 17M/216M
------------------------------------------------------------------------
それではとサービスタグからMavenリポジトリを選択し、索引の更新を実行。
おー、こちらもIDE右下のプログレスバーは動き始めた。
いやー、2日もこんなことに時間を費やしてしまった。
情報が少ないところをみると、まだまだNetBeans IDEはメジャーになれないのかな。
NetBeans Mavenを使う [Java]
NetBeansのバージョンは8.0.2。
特に設定をしないまま、Mavenプロジェクトを作成しようとしたら大量のエラーが発生した。
Scanning for projects...
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom
Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-clean-plugin:2.4.1: Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1
事前にMavenリポジトリのセットアップが必要らしい。
「ウィンドウ」>「サービス」を選択し、「サービス」ウィンドウを開く。
「サービス」ウィンドウで「Mavenリポジトリ」ノードを展開する。
ローカルを右クリックし、ポップアップ・メニューで「索引の更新」を選択する。
これで最新の索引をMavenリポジトリからダウンロードしてくる。
完了にはそこそこ時間がかかります。
ってか、一晩たっても終わらない。これはこれで継続調査!
CentOSにjre7が認識されない [Java]
■正しくインストールされた場合(jre8)
# rpm -ivh jre-8u60-linux-x64.rpm
# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
# which java
/usr/bin/java
# ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 9月 3 17:20 2015 /usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 30 9月 3 17:20 2015 /etc/alternatives/java -> /usr/java/jre1.8.0_60/bin/java
■正しくインストールされなかった場合(jre7)
# rpm -ivh jre-7u80-linux-x64.rpm
# java -version
java version "1.5.0"
gij (GNU libgcj) version 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
バージョンがなぜか1.5
javaコマンドの在り処を調査。
# which java
/usr/bin/java
# ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 9月 3 17:23 2015 /usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 35 9月 3 17:23 2015 /etc/alternatives/java -> /usr/lib/jvm/jre-1.5.0-gcj/bin/java
jre5を指していたことが判明。
alternativesコマンドを使って、シンボリックリンクを設定する。
# alternatives --config java
1 プログラムがあり 'java' を提供します。
選択 コマンド
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.5.0-gcj/bin/java
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
# alternatives --install /usr/bin/java java /usr/java/jre1.7.0_80/bin/java 200000
# java -version
java version "1.5.0"
gij (GNU libgcj) version 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
alternativesコマンドを実行しただけでは反映されず、選択する必要がある。
# alternatives --config java
2 プログラムがあり 'java' を提供します。
選択 コマンド
-----------------------------------------------
+ 1 /usr/lib/jvm/jre-1.5.0-gcj/bin/java
* 2 /usr/java/jre1.7.0_80/bin/java
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
# java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
これでOK。
libとかは大丈夫なのかなぁ。
継続して検証!
readAllLinesで楽々ファイル読み込み [Java]
客先作業が続いていたため、ほとんどJavaEEに触れずにきたのですが、昨日開催されたJava Day Tokyoでいろいろ刺激を受けてきました。
今更感は多々ありますが、自分の備忘録ということでNIOについて触れていきます。
NIOを知るまではCSVファイルからの 読み込みは、以下のような実装をしていました。
String line;
try (InputStream is = new FileInputStream("data.csv");
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));) {
while ((line = in.readLine()) != null) {
String[] s = line.split(",");
// データをばらした後の処理
}
} catch (IOException e) {
// 例外処理
}
これに対して、nioのreadAllLinesを用いるとこんな感じになります。
try {
List<String> lines = Files.readAllLines(Paths.get("data.csv"), Charset.forName("UTF-8"));
for(String line: lines){
String[] s = line.split(",");
// データをばらした後の処理
}
} catch (IOException ex) {
// 例外処理
}
Readerだらけでいらっとしていたソースがとてもすっきり。
これから他のメソッドも試していきます。
JDBCとMySQLのtimstamp型 [Java]
前回に引き続き、JavaアプリケーションからMySQLのtimestampへのアクセス実行で嵌った。
hibernateを利用してのDBアクセス実装なのだが、以下のようなカラムが存在すると、Java実行時に例外が発生する。
create_date timestamp default '0000-00-00 00:00:00' not null ,
例外内容
情報: could not read column value from result set: create20_0_0_; Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
2013/05/22 14:15:51 org.hibernate.util.JDBCExceptionReporter logExceptions
警告: SQL Error: 0, SQLState: S1009
2013/05/22 14:15:51 org.hibernate.util.JDBCExceptionReporter logExceptions
致命的: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
org.hibernate.exception.GenericJDBCException: could not execute query
調べたところ、 JDBCのバージョンによっては、timestampにnullや'0000-00-00 00:00:00'が設定されていると、例外となるらしい。
実運用上は必ずシステム日時が設定されるので問題ないが、なんにせよ例外は許したくない。
例外キャッチして作り込みをする手もなくはないがあまり生産的とは言えない。まっとうな回避策はなさそうなのでカラムの型をdatetimeにし、not nullの制限もはずした。
すっきりしない…
Javaデータアクセス実践講座 (DB Magazine SELECTION)
- 作者: 松信 嘉範
- 出版社/メーカー: 翔泳社
- 発売日: 2008/02/28
- メディア: 単行本(ソフトカバー)
JavaでのWEBアプリ開発(予告) [Java]
先週Oracle主催のJavaセミナーに行きました。
私はWEB開発をJavaSE+struts2+hibernateという組み合わせで実装することを得意としているのですが、そのセミナーではオープンソース系フレームワークを使って、商用開発するのはNGと強く刷り込まれました。
確かに開発時はすべて最新バージョンもしくは枯れたものの組み合わせなので問題ないのですが、保守を考えるとリスクは高そうです。
ということで、 「JavaSE+struts2+hibernate」対「JavaEE6」で同じアプリを実装し、メリット/デメリットを評価していく予定うです。
Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)
- 作者: Antonio Goncalves
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/09
- メディア: 大型本
自作ログクラスを簡単に作成 [Java]
Log4jやslf4jを使えば、簡単にログ出力を実現できますが、それでもなお自作したい場合に、こんな機能を使うとすっきりしたプログラムを実装できます。
わざわざ呼び出し側でメソッド名や行番号を引数で渡すというのは、とても見苦しい。そこで呼び出されるログクラス側で呼出元の情報を取得します。理屈としてはスタックに積まれている情報を取得するだけ。
ログクラス
package sample.utils;
public class Logger {
static public void print() {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : elements) {
System.out.println("-----------------------------");
System.out.println("ClassName : " + element.getClassName());
System.out.println("FileName : " + element.getFileName());
System.out.println("MethodName : " + element.getMethodName());
System.out.println("LineNumber : " + element.getLineNumber());
System.out.println("-----------------------------");
}
}
}
呼び出し側
package sample;
import sample.utils.Logger;
public class Test01 {
/**
* @param args
*/
public static void main(String[] args) {
Logger.print();
}
}
実行結果
-----------------------------
ClassName : java.lang.Thread
FileName : null
MethodName : getStackTrace
LineNumber : -1
-----------------------------
-----------------------------
ClassName : sample.utils.Logger
FileName : Logger.java
MethodName : print
LineNumber : 6
-----------------------------
-----------------------------
ClassName : sample.Test01
FileName : Test01.java
MethodName : main
LineNumber : 12
-----------------------------
スタック3番目(配列で言うなら2)に呼出元の情報が入っています。
@SuppressWarnings [Java]
JDK1.6+JUnit4環境で、テストコードに
new Date(文字列)
を使ったところ「推奨されていない」という警告が発生。
アノテーション @SuppressWarnings("deprecation") でとりあえず回避。
eclipseの開発コード名 [Java]
JavaやらCでの開発に欠くことができない、IDE開発プラットホームEclipseですが、いつの間にやらバージョンだけでなく、開発コード名が公開されています。
3.6系 Helios
3.5系 Galileo
3.4系 Ganymede
3.3系 Europa
3.2系 Callisto