FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JPAで、シーケンスで採番された値をとる方法

 JDBCだと Statement.RETURN_GENERATED_KEYS を指定すればとれるけど、JPA(Java Persistence API)だとどうやって取るんだろうと思ったが、特に何も考えなくてもEntityクラスから取れた。
 EntityManagerでflushされたタイミングでEntityクラスに採番された値が入っているもよう。

■ソース(抜粋)
・main

public static void main(String[] args) throws Exception {
EntityManagerFactory emf = null;
try {
emf = Persistence.createEntityManagerFactory("JavaApplication1PU");

TestSeqJpaController tsj = new TestSeqJpaController(emf);
TestSeq ts = new TestSeq();
ts.setData1("test");
System.out.println("★before = " + ts.getKey1());
tsj.create(ts);
System.out.println("★after = " + ts.getKey1());

} finally {
if(null != emf)
emf.close();
}
}


・TestSeqJpaController

public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(TestSeq testSeq) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
em.persist(testSeq);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}


■SQL
create table TEST_SEQ (
KEY1 integer generated always as identity (start with 1, increment by 1),
DATA1 varchar(10),
constraint PK_TEST primary key (KEY1)
);


■実行結果
・実行
run:
★before = null
[EL Info]: 2014-11-10 22:12:11.907--ServerSession(60241307)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Info]: connection: 2014-11-10 22:12:12.316--ServerSession(60241307)--file:/C:/Users/a/Documents/NetBeansProjects/JavaApplication1/build/classes/_JavaApplication1PU login successful
★after = 1
[EL Info]: connection: 2014-11-10 22:12:12.452--ServerSession(60241307)--file:/C:/Users/a/Documents/NetBeansProjects/JavaApplication1/build/classes/_JavaApplication1PU logout successful
ビルド成功(合計時間: 1秒)

・再実行
run:
★before = null
[EL Info]: 2014-11-10 22:19:41.376--ServerSession(434944762)--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Info]: connection: 2014-11-10 22:19:41.577--ServerSession(434944762)--file:/C:/Users/a/Documents/NetBeansProjects/JavaApplication1/build/classes/_JavaApplication1PU login successful
★after = 2
[EL Info]: connection: 2014-11-10 22:19:41.646--ServerSession(434944762)--file:/C:/Users/a/Documents/NetBeansProjects/JavaApplication1/build/classes/_JavaApplication1PU logout successful
ビルド成功(合計時間: 1秒)


以上。
スポンサーサイト

jmxオプションつけたとき エラー: パスワード・ファイルが見つかりません

とあるJavaプログラムに jconsole で接続しようと思いJMXのオプション追加して起動したが下記のエラーが出た。

i:\temp>java -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false Hoge
エラー: パスワード・ファイルが見つかりません: C:\Program Files\Java\jre7\lib\management\jmxremote.password


com.sun.management.jmxremote.authenticate=false を忘れてた・・・


i:\temp>java -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false Hoge
start



当然、パスワードファイルを用意してもいいはず。
ということで試してみたが、そこでちょっと苦労したのでメモ。

続きを読む

テーマ : プログラミング
ジャンル : コンピュータ

replaceAllでドル記号がある場合のエラーと対処

String.replaceAllで下記のエラーが出た。

○ソースコード抜粋


String data = "dir=${HOME}";
String temp = "=${TEMP}";
System.out.println(data.replaceAll("=.*", temp));


○例外

Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:713)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2189)
at sandbox.ReplaceTest.main(ReplaceTest.java:10)


調べてみると、$ や \ が特殊扱いされているせいらしい

■対処
・単純な文字列置換なら、replaceAll を replace に置き換えればよい。

・今回みたいに正規表現を使いたい場合などは、$ や \ をエスケープする必要がある

import java.util.regex.Matcher;
・・・略・・・
String data = "dir=${HOME}";
String temp = "=${TEMP}";
temp = Matcher.quoteReplacement(temp);
System.out.println(data.replaceAll("=.*", temp));



以上。

テーマ : プログラミング
ジャンル : コンピュータ

-XX:NewSizeオプションを指定したらエラー発生

Javaプログラム起動時 -XX:NewSizeオプションを指定したら、エラーになった。

i:\temp>java -XX:NewSize=300m Hoge
Error occurred during initialization of VM
Too small initial heap for new size specified


メモリサイズが足りてない様子なので、Xmxを-XX:NewSize(Xmn)以上に設定したら起動できた。

i:\temp>java -Xmx600m -XX:NewSize=300m Hoge
start



なお、-XX:NewSizeオプションが無くても、Xmxの値が小さすぎると同じエラーがでるもよう。

i:\temp>java -Xmx1m Hoge
Error occurred during initialization of VM
Too small initial heap for new size specified



以上。

テーマ : プログラミング
ジャンル : コンピュータ

Java String.splitで最後の空文字データ取得


JavaのsplitメソッドでCSVを分割するとき、 "a,b,,," のように最後にカンマが連続している(空文字データがある)と配列に入れてくれない。

■ソース

 String str = "a,b,,,";

 String[] data = str.split(",");
 for(String s : data){
  System.out.println("data=" + s);
 }
 System.out.println("length=" + data.length);



■結果

data=a
data=b
length=2




しかし、値として取得したい場合がある。
こんなときはsplitの第2引数に-1を入れるといいらしい

■ソース

 String[] data2 = str.split("," , -1);
 for(String s : data2){
  System.out.println("data=" + s);
 }
 System.out.println("length=" + data2.length);



■結果

data=a
data=b
data=
data=
data=
length=5



以上。

テーマ : プログラミング
ジャンル : コンピュータ

検索フォーム
プロフィール

takuan93

Author:takuan93
本ブログの説明書→「ReadMe」

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。