スポンサーサイト

上記の広告は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秒)


以上。
スポンサーサイト

typesafe Config で自動コメント無しに中身を出力したいとき

typesafe Config で中身を出力で読み取った情報は、render()で表示できるけど、コメントが自動でついてしまう。
コメントを消したい場合は、ConfigRenderOptionsを使えばよい。

何も設定しない場合


■読み込ませたコンフィグ
a {
#test
b.1{
c=1 ,
e=2
}
b.2{
d=2
}
}


■ソース

object Test1 extends App{
val conf = ConfigFactory.parseFile(new File("C:/temp/application.conf"))
println(conf.root().render())
}


■出力
{
# C:/temp/application.conf: 1
"a" : {
# C:/temp/application.conf: 3-7
"b" : {
# C:/temp/application.conf: 3
# test
"1" : {
# C:/temp/application.conf: 4
"c" : 1,
# C:/temp/application.conf: 5
"e" : 2
},
# C:/temp/application.conf: 7
"2" : {
# C:/temp/application.conf: 8
"d" : 2
}
}
}
}


自動で付くコメント消す場合


■ソース
 ConfigRenderOptionsでOriginCommentsをfalseにする。

object Test1 extends App{
val conf = ConfigFactory.parseFile(new File("C:/temp/application.conf"))
val option = ConfigRenderOptions.defaults().setOriginComments(false);
println(conf.root().render())
}


■出力
{
"a" : {
"b" : {
# test
"1" : {
"c" : 1,
"e" : 2
},
"2" : {
"d" : 2
}
}
}
}


HOCON拡張ありにする場合


もう少し元の形に近づけるなら、setJson(HOCON拡張の使用有無)もfalseにする。

object Test1 extends App{
val conf = ConfigFactory.parseFile(new File("C:/temp/application.conf"))
val option = ConfigRenderOptions.defaults().setOriginComments(false).setJson(false);
println(conf.root().render())
}


■出力

a {
b {
# test
"1" {
c=1
e=2
}
"2" {
d=2
}
}
}


補足


 ConfigRenderOptionsは他に、
 ・自分で書いたコメントの表示・非表示 setComments
 ・フォーマットするか否か       setFormatted
の設定も可能。

詳細はJavaDoc参照
http://typesafehub.github.io/config/latest/api/com/typesafe/config/ConfigRenderOptions.html



以上。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

sbtのcompile時のエンコード関係エラー

■JavaのソースがUTF-8


JavaのソースコードをUTF-8で書いていた場合に発生。

H:\temp\scala>sbt compile
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Java source to H:\temp\scala\target\scala-2.10\classes...
[error] H:\temp\scala\src\main\java\Test.java:3: エラー: この文字は、エンコーデ
ィングMS932にマップできません
[error] //繝?せ繝?
[error] ^
[error] H:\temp\scala\src\main\java\Test.java:3: エラー: この文字は、エンコーデ
ィングMS932にマップできません
[error] //繝?せ繝?
[error] ^
[error] エラー2個
[error] (compile:compile) javac returned nonzero exit code
[error] Total time: 1 s, completed 2014/11/07 23:56:02



対処方法


build.sbtに javacOptions ++= Seq("-encoding", "UTF-8") を加える。

name := "Hello World"

version := "1.0"

scalaVersion := "2.10.0"

scalacOptions ++= Seq("-encoding", "UTF-8")

javacOptions ++= Seq("-encoding", "UTF-8")

* 注意) 各行の間の空行は必要

なお、 javacOptions では、エンコード以外のjavacオプションも渡せる。


■scalaのソースがUTF-8ではない


scalaのソースコードをUTF-8以外で書いていた場合。
(scalacはデフォルトで UTF-8 )

H:\temp\scala>sbt compile
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Updating {file:/H:/temp/scala/}scala...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.0 ...
[info] Resolving org.scala-lang#scala-reflect;2.10.0 ...
[info] Resolving org.scala-lang#jline;2.10.0 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source and 1 Java source to H:\temp\scala\target\scala-
2.10\classes...
[error] IO error while decoding H:\temp\scala\src\main\java\Test.java with windo
ws-31j
[error] Please try specifying another one using the -encoding option
[error] IO error while decoding H:\temp\scala\src\main\scala\Hello.scala with wi
ndows-31j
[error] Please try specifying another one using the -encoding option
[error] two errors found
[error] (compile:compile) Compilation failed
[error] Total time: 1 s, completed 2014/11/07 23:59:28



対処方法

build.sbt の scalacOptions ++= Seq("-encoding", "エンコード") でエンコードを指定する



■ファイルにUTF-8のBOMがある場合


Windowsのメモ帳でUTF-8で保存してしまったときなんかに発生する。
ソースファイルにUTF-8のBOMがあることが原因。

H:\temp\scala>sbt compile
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Scala source to H:\temp\scala\target\scala-2.10\classes...
[error] H:\temp\scala\src\main\scala\Hello.scala:1: illegal character '\ufeff'
[error] ?object HelloWorld {
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 1 s, completed 2014/11/07 23:53:23



対処方法

BOMを削除すればよい。
簡単な方法としては、下記のような方法
・サクラエディタなどのエディタで開いて先頭部分を削除する。
・エンコードを変えていいなら、メモ帳で開いてSJISで保存しなおす。


■関連

sbtでjavaとscalaが混在したプロジェクトのjarを作成してみる
\65279 は不正な文字です というエラーが出た


以上。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

sbtでjavaとscalaが混在したプロジェクトのjarを作成してみる

sbtでjavaとscalaが混在したプロジェクトのjarを作成してみる。

環境はWindows8.1

ほとんどの部分は下記を参考にさせていただいた。
Scala初心者の俺が「Hello World」する jar を作るまで

インストール


sbtを下記からダウンロード
http://www.scala-sbt.org/download.html

Windowsなのでmsiを使った。
msiは特に注意するところもなく、実行してウィザードを進めるだけでOK。

インストールが終わったら、コマンドプロンプトを起動し sbt を実行。
初回起動時には必要なファイルがいろいろダウンロードされるので、結構時間がかかる。

C:\Users\>sbt
Getting org.fusesource.jansi jansi 1.11 ...
downloading https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.11/jansi
-1.11.jar ...
[SUCCESSFUL ] org.fusesource.jansi#jansi;1.11!jansi.jar (1735ms)
:: retrieving :: org.scala-sbt#boot-jansi
confs: [default]
1 artifacts copied, 0 already retrieved (111kB/15ms)
Getting org.scala-sbt sbt 0.13.6 ...
・・・中略・・・
confs: [default]
5 artifacts copied, 0 already retrieved (24459kB/43ms)
[info] Set current project to t (in build file:/C:/Users/t/)
>
> exit
C:\Users\>


起動が終わったら、exit で一旦抜ける。


Hellow world を実行する


任意の場所に build.sbt というファイルを作成。1行ごとに必ず空行を入れる必要あり。

name := "Hello World"

version := "1.0"

scalaVersion := "2.10.0"



build.sbt を作成したディレクトリにソースを置くために src\main\scala というディレクトリを作成する。

src\main\scala の下にHello.scala というファイル名でscala のコードを書く。
object HelloWorld {
def main(args: Array[String]) {
println("Hello World!")
}
}


実行してみる。

H:\temp\scala>sbt run
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Updating {file:/H:/temp/scala/}scala...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
・・・中略・・・
[info] Compilation completed in 11.843 s
[info] Running HelloWorld
Hello World!
[success] Total time: 43 s, completed 2014/10/22 23:19:26

H:\temp\scala>


Running HelloWorldというメッセージの後に、Hellow World! が出力されればOK。

scalaのソースからjarを作る


sbt-assemblyを使ってjarを作る。
sbt-assemblyについては下記のREADME.mdを参照。
https://github.com/sbt/sbt-assembly

project/assembly.sbt というファイルを作り、下記を記載する。

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")



assembly.sbt というファイルを build.sbt と同じディレクトリ作成。
下の2行を追加する

import AssemblyKeys._

assemblySettings



実行。

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Including: scala-library-2.10.0.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1: 24c
[info] Packaging H:\temp\scala\target\scala-2.10\Hello World-assembly-1.0.jar ..
.
[info] Done packaging.
[success] Total time: 6 s, completed 2014/10/22 23:32:20



実行時のメッセージにも出ているが、作成されたJarはtarget\scala-2.10\ の下にできている。

作成したjar を実行。

H:\temp\scala>java -jar "target/scala-2.10/Hello World-assembly-1.0.jar"
Hello World!



Javaのソースも含めてjarを作る


Java ソースを追加する。

src\main\javaを作成。
その下に Test.java という名前で下記のソースを作成。

public class Test {
public static void print() {
System.out.println("Hello Java");
}
}


src\main\scala\Hello.scala を下記のように変更

object HelloWorld {
def main(args: Array[String]) {
//println("Hello World!")
Test.print()
}
}


コマンドプロンプトを管理者で起動して実行。

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Scala source and 1 Java source to H:\temp\scala\target\scala-
2.10\classes...
[info] Including from cache: scala-library-2.10.0.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1:
[info] Packaging H:\temp\scala\target\scala-2.10\Hello World-assembly-1.0.jar ..
.
[info] Done packaging.
[success] Total time: 5 s, completed 2014/10/22 23:51:19

H:\temp\scala>


無事成功。

できた jar を実行。

H:\temp\scala>java -jar "target/scala-2.10/Hello World-assembly-1.0.jar"
Hello Java



ちゃんと、scalaからjavaを呼べている。
target\scala-2.10\classes を確認すると、javaのソースもscalaのソースもclassファイルが生成されている。


エラーと対処方法


scalaのみの時の sbt assembly で失敗


エラー

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Updating {file:/H:/temp/scala/project/}scala-build...
・・・中略・・・
[info] Done updating.
H:\temp\scala\build.sbt:7: error: illegal start of simple expression
import AssemblyKeys._ // put this at the top of the file
^
[error] Error parsing expression. Ensure that there are no blank lines within a
setting.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? i
[warn] Ignoring load failure: no project loaded.
[error] Not a valid command: assembly
[error] assembly
[error]



対処

設定を記載しているファイルや、記載内容が間違えていないか確認する。
特に、sbt-assembly 0.9.1 では、 project/puglin.sbt やbuild.sbtを編集するように指示があるが、0.11.2 では project/assembly.sbt と assembly.sbt を編集するというように、バージョン間で差異がある。

使用するバージョンのREADMEを参照すること。
sbt-assemblyのREADMEは下記から参照可能。
https://github.com/sbt/sbt-assembly


javaを加えた時の sbt assembly で失敗


エラー

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Java source to H:\temp\scala\target\scala-2.10\classes...
java.io.IOException: Cannot run program "javac": CreateProcess error=2, ?w?????t
?@?
at java.lang.ProcessBuilder.start(Unknown Source)
at sbt.SimpleProcessBuilder.run(ProcessImpl.scala:349)
at sbt.AbstractProcessBuilder.run(ProcessImpl.scala:128)
・・・中略・・・
at java.lang.Thread.run(Unknown Source)
[error] (compile:compile) java.io.IOException: Cannot run program "javac": Creat
eProcess error=2, ?w?????t?@?
[error] Total time: 0 s, completed 2014/10/22 23:38:42

H:\temp\scala>



対処

コマンドプロンプトを管理者で起動して実行する。

以上。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

SyntaxHighighter Can't find brush for: xxx の原因

最近気づいたが、自分のブログをIEで開くと

SyntaxHighighter
Can't find brush for: shell


というエラーが出続けてしまう。

しかも、OKを押しても再度同じエラーがでてしまうので、強制終了するしかなさそう。
我ながら、なんて悪質なページだ・・・

普段使っているChromeならエラーは出なかったのだが・・・

調べてみると単純に、shellに対応するjsのアップロードが漏れているだけだったもよう。
ファイルをアップロードして、ブログのテンプレートに書いてあるSyntaxHighighterのjsのURLをアップロードした場所のものに修正したら直った。
(テンプレートをスマホ用のページにもセットしている場合は、そっちも忘れずに修正必要)


参考までに、同様の現象は shCore.js を書いている場所によっても発生するらしい。
Syntax Highlighterの設定 Can’t find brush for XXX

■環境
Windows 8.1
IE 11.0.12

■関連
SyntaxHighlighter の導入メモ

以上。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

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

takuan93

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

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
03 | 2018/04 | 05
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 - - - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。