2014年11月8日土曜日

[Java SE 7] Java SE 7新機能: Project Coin

Java SE 7 の新機能は次の4つが目玉:
  • Project Coin: 言語仕様に関する小さな変更群
  • NIO.2: NIOの改良
  • Fork/Join Framework: 並列処理の実装を容易にするらしい
  • InvokeDynamic: 動的型付けでメソッド呼び出しをできるらしい
この内、Project Coinについて。

switch構文のスイッチにStringが使えるようになった

その他使えるのは(おおよそ)、整数型もろもろと列挙型。

数値リテラルに2進数表現が追加された

0b01110010

可読性向上のため、数値リテラルに_が挿入できるようになった

1234_5678
処理前にreplace("_","")される

例外のマルチキャッチ

これ知ってた。
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

例外の再スロー

再スローする例外を細かく指定できるようになった。
  static class FirstException extends Exception { }
  static class SecondException extends Exception { }
  public void rethrowException(String exceptionName) throws Exception -> FirstException, SecondException 
{
    try {
      if (exceptionName.equals("First")) {
        throw new FirstException();
      } else {
        throw new SecondException();
      }
    } catch (Exception e) {
      throw e;
    }
  }
catchしているのがExceptionになるため、Java SE 6まではthrows節にはExceptionwしか書けなかったんだそうな。

ダイヤモンド演算子

これも知ってた。例は略。

try-with-resources文

リソースのクローズを自動的にやってくれる。
try (
      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)

    ) {
      // Enumerate each entry
      for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {
        // Get the entry name and write it to the output file
        String newLine = System.getProperty("line.separator");
        String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
        writer.write(zipEntryName, 0, zipEntryName.length());
      }
    }
tryの()の中(=try-with-resources)で、java.lang.AutoCloseable インタフェースを実装しているオブジェクトの初期化をすると、自動的にclose()が呼ばれる。
クローズ処理は、catch, finallyブロックより先に呼ばれて、作成時と逆の順番で呼ばれる。

try-with-resources文のブロックでもtryブロックでも例外がスローされた場合、tryブロックの中の例外の方が優先されて、try-with-resources文の方の例外は抑制された例外というのになる。
(これによりどういうスニペットができるんだろう?)
詳しい動作についてはいつもの:
ひしだま's 技術メモページ: Javaステートメント リソース付きtry文
http://www.ne.jp/asahi/hishidama/home/tech/java/statement.html#try_with_resources_statement

記法、公募したんですね!pull request募集みたいな感じ?
あとJSRが何か分かってないです。仕様?RFC的な。

参考:

 slideshare: New Feature of Java SE 7 -Java SE 7で切り開く新しいJavaの世界について
(寺田佳央さん)
http://www.ne.jp/asahi/hishidama/home/tech/java/uptodate.html#JDK1.7

ORACLE: 複数の例外型のキャッチと型チェックが改善された例外再スロー
http://docs.oracle.com/javase/jp/7/technotes/guides/language/catch-multiple.html

ORACLE: try-with-resources 文
http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html

ITPro: Java SE 7の新機能を読み解く (桜庭祐一さん)
http://itpro.nikkeibp.co.jp/article/COLUMN/20120417/391316/

2014年1月28日火曜日

[Play Framework] [JPA] Play Framework1.2.xでJPAを利用してUPDATE処理を行う

JPAでは、Play Frameworkのモデルで行われているO/Rマッピングとは異なり、永続コンテキスト中のエンティティの状態はDBと自動的に同期される

JPAを使ったデータアクセスでポイントとなる永続コンテキストについて

管理されていない状態のオブジェクトを主導で更新することもできるし、JPQLを記述して、より柔軟な更新処理を発行することもできる


  • 管理された状態のオブジェクトの更新
  • 管理されていないオブジェクトの更新
  • JPQLを用いたUPDATE

Book: JPA CRUD Update

今回は、更新時のWHERE句指定を行いたいので、JPQLでクエリを記述する方法を取ることにする

JPAおよびJPQLの書き方について、公式のチュートリアル

英語だけど、JPQLの書き方だけならさほど読むのに時間はかからない。
Java EE6 Tutorial - Chapter 32 Introduction to the Java Persistence API (英語)
Java EE6 Tutorial - Chapter 34 The Java Persistence Query Language (英語)

Play Frameworkの中でJPA APIを使うには


  • JPA エンティティマネージャの取得
  • トランザクション管理

play Japan - Documentation - JPA 永続化

クエリ発行の主役になるのはjavax.persistence.Queryインタフェース

javax.persistence.Query

NamedQueryの定義方法

@Entityアノテーションとクラス定義の間で定義する
JPA注釈の参照情報

QuerySyntaxException: (object) is not mapped という例外でコンパイルできないけどどう見てもクエリ文には、問題がなさそうで困った場合、エンティティクラスを完全修飾クラス名で指定したらうまく行きました
Unable to query database - QuerySyntaxException: (object) is not mapped