jpa 2.2の新機能...jpa 2.2リリースは、java ee...

13
ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017 35 //java ee 8 / J ava Persistence API (JPA)は、業界全般で広く使われているJava EE仕様の土台です。Java EEプラットフォーム や、Javaで動作する代替フレームワークで開発を行う場合、データの永続化に使われる可能性がもっとも高い のがJPAです。JPA 2.1で、この仕様は新しい領域に踏み込みました。というのも、開発者がデータベース・スキーマの 自動生成、データベースのストアド・プロシージャの効率的な使用といったタスクを実行できるようになったからで す。最新リリースのJPA 2.2では、これらの改善をもとに、さらに仕様が強化されています。 本記事では、新機能の概略を説明しつつ、初めて使う方が参考にできる例を示します。例として、GitHubで公 開している「Java EE 8 Playground」というサンプル・プロジェクトを使用します。このサンプル・アプリケーション は、Java EE 8仕様に基づいて構築されており、JavaServer Faces(JSF)フレームワークを使用しています。永続化に は、Enterprise JavaBeans(EJB)とJPAを使っています。本記事の内容を理解するためには、JPAについての知識が 必要です。 JPA 2.2の使用 JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java EE 8対応のアプリケーション・サーバーのみです。本記事の執筆時点(2017年後半)では、Java EE 8対応 のアプリケーション・サーバーはそれほど多くありません。しかし、Java EE 7を使っている方であれば、JPA 2.2を使 うのは簡単です。最初のステップは、Maven Centralを使って適切なJARファイルをダウンロードし、プロジェクトに 含めることです。プロジェクトでMavenを使っている場合は、Mavenのプロジェクト・オブジェクト・モデル(POM) ファイルに次の座標を追加します。 <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> JPA 2.2の新機能 多くの便利な改善のごく一部である、結果のストリーム処理、日付変換の強化、 新しいアノテーションを紹介 JOSH JUNEAU

Upload: others

Post on 26-Apr-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

35

//java ee 8 /

Java Persistence API(JPA)は、業界全般で広く使われているJava EE仕様の土台です。Java EEプラットフォームや、Javaで動作する代替フレームワークで開発を行う場合、データの永続化に使われる可能性がもっとも高い

のがJPAです。JPA 2.1で、この仕様は新しい領域に踏み込みました。というのも、開発者がデータベース・スキーマの

自動生成、データベースのストアド・プロシージャの効率的な使用といったタスクを実行できるようになったからで

す。最新リリースのJPA 2.2では、これらの改善をもとに、さらに仕様が強化されています。

本記事では、新機能の概略を説明しつつ、初めて使う方が参考にできる例を示します。例として、GitHubで公

開している「Java EE 8 Playground」というサンプル・プロジェクトを使用します。このサンプル・アプリケーション

は、Java EE 8仕様に基づいて構築されており、JavaServer Faces(JSF)フレームワークを使用しています。永続化に

は、Enterprise JavaBeans(EJB)とJPAを使っています。本記事の内容を理解するためには、JPAについての知識が

必要です。

JPA 2.2の使用JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている

のは、Java EE 8対応のアプリケーション・サーバーのみです。本記事の執筆時点(2017年後半)では、Java EE 8対応

のアプリケーション・サーバーはそれほど多くありません。しかし、Java EE 7を使っている方であれば、JPA 2.2を使

うのは簡単です。最初のステップは、Maven Centralを使って適切なJARファイルをダウンロードし、プロジェクトに

含めることです。プロジェクトでMavenを使っている場合は、Mavenのプロジェクト・オブジェクト・モデル(POM)

ファイルに次の座標を追加します。

<dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId>

JPA 2.2の新機能多くの便利な改善のごく一部である、結果のストリーム処理、日付変換の強化、 新しいアノテーションを紹介

JOSH JUNEAU

Page 2: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

36

//java ee 8 /

<version>2.2</version></dependency>

次に、使用するJPA実装を選択します。JPA 2.2のリリース時点では、EclipseLinkとHibernateの両方に対応した実装

が含まれています。本記事の例では、次の依存性を追加して

EclipseLinkを使用します。

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.0 </version></dependency>

Java EE 8対応のサーバー(GlassFish 5やPayara 5など)を使っている場合は、POMファイルで依存性に「provided」

スコープを指定できます。それ以外の場合は、「compile」スコープを指定してプロジェクトのビルドに依存性を含め

ます。

Java 8の日付と時間のサポートもっとも歓迎される追加機能の1つは、Java 8のDate and Time APIのサポートかもしれません。2014年にJava SE 8

がリリースされてから、開発者はJPAとDate and Time APIを併用するためにいくつかの回避策を使ってきました。

ほとんどの回避策はとてもシンプルなものですが、最新のDate and Time APIに基本的なサポートを提供するとい

う要求への対応は、長い間先送りになっていました。JPAのDate and Time APIサポートには、以下の共通型が含ま

れています。■■ java.time.LocalDate■■ java.time.LocalTime■■ java.time.LocalDateTime■■ java.time.OffsetTime■■ java.time.OffsetDateTimeこれを説明するにあたり、まずはJPA 2.2を使わずにDate and Time APIをサポートする方法を紹介します。JPA 2.1

Page 3: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

37

//java ee 8 /

では、java.util.Dateやjava.sql.Timestampといった旧式の日付構造にのみ対応しています。そのため、コンバータを使って、データベースに保存されているデータをJPA 2.1リリースでサポートされている旧式の日付構造に変換し、

その後、アプリケーションで使うために最新のDate and Time APIが扱う形式に変換する必要があります。このよ

うな変換が可能な、JPA 2.1の日付コンバータの例をリスト1に示します。このリストのコンバータは、LocalDateとjava.util.Dateの相互変換を行うものです。

リスト1:@Converter(autoApply = true)public class LocalDateTimeConverter implements AttributeConverter<LocalDate, Date> { @Override public Date convertToDatabaseColumn( LocalDate entityValue) { LocalTime time = LocalTime.now(); Instant instant = time.atDate(entityValue) .atZone(ZoneId.systemDefault()) .toInstant(); return Date.from(instant); }

@Override public LocalDate convertToEntityAttribute( Date databaseValue){ Instant instant = Instant .ofEpochMilli(databaseValue.getTime()); return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate(); }}

Page 4: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

38

//java ee 8 /

JPA 2.2では、サポートされている日時型を使っている場合、このようなコンバータのコーディングは必要なくなりま

す。

前述の型のサポートはすでに組み込まれているため、サポートされている型をエンティティ・クラスのフィールドで

指定するだけでよく、それ以上のコードを書く必要はありません。次のコードは、その考え方を示すために抜粋した

ものです。このコードには、@Temporalアノテーションを付加する必要がない点に注意してください。型マッピングは自動的に行われます。

public class Job implements Serializable { . . . @Column(name = "WORK_DATE") private LocalDate workDate; . . .}

サポートされている日時型は、JPAの第一級要素であるため、指定するだけでよく、他に何のおまじないも必要あり

ません。JPA 2.1では、永続化するすべてのjava.util.Date型およびjava.util.Calendar型のフィールドやプロパティには、@Temporalアノテーションを指定しなければなりません。

今回のリリースでサポートされたのは、一部の日時型のみですが、LocalDateTimeとZonedDateTimeの相互変換など、他の型を扱う属性コンバータは簡単に生成で

きます。そのようなコンバータを書く場合、最大の難題とな

るのは、どうすれば異なる型同士の変換が最適な形で行わ

れるかを判断することです。これをいっそう簡単に行えるよ

うに、属性コンバータを注入できるようになりました。次のセ

クションでは、注入を行う例を紹介します。

リスト2に示すコードは、LocalDateTimeとZonedDateTimeの相互変換を行う方法を示すものです。

リスト2:@Converter

JPA 2.2へのアップデートでは、属性コンバータの注入が可能になるという便利な追加機能が導入されています。

Page 5: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

39

//java ee 8 /

public class LocalToZonedConverter implements AttributeConverter<ZonedDateTime, LocalDateTime> { @Override public LocalDateTime convertToDatabaseColumn( ZonedDateTime entityValue) { return entityValue.toLocalDateTime(); }

@Override public ZonedDateTime convertToEntityAttribute( LocalDateTime databaseValue) { return ZonedDateTime.of(databaseValue, ZoneId.systemDefault()); }}

この例はとても単純です。ZonedDateTimeには、簡単に使える変換メソッドが含まれているからです。変換は、toLocalDateTime()メソッドを呼び出すことによって行っています。LocalDateTimeの値と、使用するタイムゾーンを示すZoneIdを渡してZonedDateTime.of()メソッドを呼び出すと、逆方向の変換を行うことができます。

注入可能な属性コンバータ属性コンバータは、JPA 2.1で追加されました。この追加により、エンティティの属性型をはるかに柔軟に扱えるよう

になったため、とても重宝されることになりました。JPA 2.2へのアップデートでは、属性コンバータの注入が可能に

なるという便利な追加機能が導入されています。これによって、Contexts and Dependency Injection(CDI)リソー

スを属性コンバータに注入できるようになりました。この変更は、Java EE 8仕様全般にわたって行われているCDIの

改善に分類されるものです。同様に、JSFコンバータもCDI注入ができるように強化されています。

この新機能を使用するためには、必要に応じて、単純に属性コンバータにCDIリソースを注入します。

リスト2に、属性コンバータの例を示します。この例をたどりながら、重要なポイントを説明します。コンバータのクラスでは、パラメータとしてXとYの値を指定してjavax.persistence.AttributeConverterイ

ンタフェースを実装する必要があります。Xの値はJavaオブジェクトのデータ型に、Yの値はデータベースの列

Page 6: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

40

//java ee 8 /

の型に対応します。次に、コンバータのクラスに@Converterアノテーションを付加します。最後に、クラスでconvertToDatabaseColumn()メソッドとconvertToEntityAttribute()メソッドをオーバーライドします。それぞれのメソッドの実装では、指定された型の値が変換されます。

指定されたデータ型が使われるたびに自動的にコンバータが適用されるようにする場合

は、@Converter(autoApply=true)と記述して自動変換を指定します。コンバータを単一の属

性に適用する場合は、次のようにして属性レベル

で@Converterアノテーションを使用します。

@Convert(converter=LocalDateConverter.java)private LocalDate workDate;

コンバータは、クラス・レベルで適用することもで

きます。次に例を示します。

@Convert(attributeName="workDate", converter = LocalDateConverter.class)public class Job implements Serializable { . . .

CustomerエンティティのcreditLimitフィールドに含まれる値を永続化する際に暗号化する場合を考えてみます。このような処理を実装するためには、永続化する前に値を暗号化し、値をデータベースから取得する際に復号化

する必要があります。これは、コンバータの中で行うことができます。JPA 2.2を使うと、コンバータに暗号化オブジ

ェクトを注入して目的の結果を得ることができます。リスト3にその例を示します。

リスト3:@Converterpublic class CreditLimitConverter implements

スクロール可能なResultSetとページ区切りを用いた手法で一度にフェッチされるのは、一部のデータのみです。データセットが大きい場合は、こちらの方が適切かもしれません。

Page 7: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

41

//java ee 8 /

AttributeConverter<BigDecimal, BigDecimal> { @Inject CreditLimitEncryptor encryptor; @Override public BigDecimal convertToDatabaseColumn (BigDecimal entityValue) { String encryptedFormat = encryptor.base64encode( entityValue.toString()); return BigDecimal.valueOf( Long.valueOf(encryptedFormat)); }

. . .}

このコードでは、コンバータにCreditLimitEncryptorクラスを注入して利用することにより、前述の処理を実行しています。

問合せの実行結果のストリーム処理問合せの実行結果を処理する際に、非常に簡単に、Java SE 8のストリーム機能を最大限に活用できるようになり

ました。ストリームは、コードの読みやすさや書きやすさ、保守性の向上に貢献するだけでなく、状況次第で問合せ

のパフォーマンス向上にもつながります。ストリームの実装によっては、一度に大量のデータを問い合わせるのを防

ぐこともできます。ただし、ResultSetのページ区切りを使用する方がストリームよりもパフォーマンスが優れている場合もあります。

問合せの実行結果のストリーム処理を行うために、QueryインタフェースとTypedQueryインタフェースの両方にgetResultStream()メソッドが追加されました。この小さな変更によって、JPAが結果のリストではなくストリームを返せるようになっています。以上の点を考慮すると、大きなResultSetを扱っている場合は、新しいストリーム

Page 8: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

42

//java ee 8 /

実装と、スクロール可能なResultSetおよびページ区切りとでパフォーマンスを比較してみた方がよいでしょう。このストリーム実装では、すべてのレコードが一度にフェッチされ、リストに格納されてから返されるからです。スクロ

ール可能なResultSetとページ区切りを用いた手法で一度にフェッチされるのは、一部のデータのみです。データセットが大きい場合は、こちらの方が適切かもしれません。

永続化プロバイダは、新しく追加されたgetResultStream()メソッドをよりよい実装でオーバーライドすることもできます。Hibernateには、すでにstream()メソッドが含まれています。このメソッドは、すべてを返すのではなく、スクロール可能なResultSetを使って結果のレコードを解析します。これによって、Hibernateでは巨大なデータセットを優れたパフォーマンスで扱えるようになっています。他のプロバイダが、このメソッドをオーバーライドし

て、JPAにメリットをもたらす同様の機能を提供することが想定されます。

パフォーマンスを横に置けば、とても簡単に結果をストリーム処理できるという選択肢は、JPAにとってすば

らしい追加機能であり、データを扱う便利な方法を提

供するものです。その可能性は無限大ですが、ここで

は、役立つかもしれない使用例を2つ紹介します。い

ずれの使用例でも、Jobエンティティを問い合わせており、ストリームが返されます。まずは、次のコードを

ご覧ください。このコードでは、QueryインタフェースのgetResultStream()メソッドを呼び出し、指定したCustomerについてのJobストリームを解析しています。次に、そのストリームを使って、Jobの顧客と作業日についての詳しい情報を出力しています。

public void findByCustomer(PoolCustomer customer){ Stream<Job> jobList = em.createQuery( "select object(o) from Job o " + "where o.customer = :customer") .getResultStream(); jobList.map(j -> j.getCustomerId() .getCustomerId().getCustomerId() + " ordered job " + j.getId() + " - Starting " + j.getWorkDate())

大量のデータが返される場合は、パフォーマンスを意識することが重要です。

Page 9: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

43

//java ee 8 /

.forEach(jm -> System.out.println(jm));}

このメソッドを次のように少し変更し、Collectors .toList()ユーティリティ・メソッドを使って結果のリストを返すことができます。

public List<Job> findByCustomer( PoolCustomer customer){ Stream<Job> jobList = em.createQuery( "select object(o) from Job o " + "where o.customerId = :customer") .setParameter("customer", customer) .getResultStream(); return jobList.collect(Collectors.toList());}

次に示すのは、もう1つの使用例です。ここで扱うのは、特定の形状のプールに関連するジョブのListです。この例では、文字列として渡された形状に一致するすべてのジョブを返します。最初の例と同じように、まず、Jobレコードのストリームを返しています。次に、顧客のプールの形状に基づいてレコードをフィルタリングしています。おわかりの

ように、このコードは簡潔で、とても読みやすいものになっています。

public List<Job> findByCustPoolShape( String poolShape){ Stream<Job> jobstream = em.createQuery( "select object(o) from Job o") .getResultStream(); return jobstream.filter( c -> poolShape.equals(c.getCustomerId() .getPoolId().getShape())) .collect(Collectors.toList());

Page 10: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

44

//java ee 8 /

}

最初に述べたように、大量のデータが返される場合は、パフォーマンスを意識することが重要です。状況により、

データベースに問合せを行う際にストリームが有益な場合も、ストリームでパフォーマンスの低下が発生する可能

性がある場合もあります。目安として、データの問合せがSQL問合せの範囲内でとどまる場合は、それだけで済ま

せるとよいでしょう。優雅なストリーム構文を使っても、そのメリットが標準のSQLフィルタリングを使用することで

得られる、より優れたパフォーマンスに及ばないこともあります。

繰返し可能アノテーションのサポートJava SE 8がリリースされたとき、繰返し可能アノテーションが導入され、1つの宣言に対して同じアノテーションを複

数回繰り返すことができるようになりました。状況によっては、クラスやフィールドに同じアノテーションを複数回使

わなければならない場合があります。たとえば、あるエンティティ・クラスに@SqlResultSetMappingアノテーションを複数回付加するような場合です。繰返し可能アノテーションがサポートされる前は、このような状況に対応する

ために、コンテナ・アノテーションを使用する必要がありま

した。繰返し可能アノテーションによって、同じアノテーショ

ンのコレクションをコンテナ・アノテーションでラップしなけ

ればならないという要件がなくなるだけでなく、コードが読

みやすくもなります。

これは、以下のような仕組みで実現されています。ま

ず、アノテーション・クラスの実装に@Repeatableメタアノテーションをあらかじめ付加し、複数回利用可能であるこ

とを明示しておく必要があります。@Repeatableメタアノテーションは、コンテナ・アノテーションのクラス型を受け取ります。たとえば、NamedQueryアノテーション・クラスには、@Repeatable(NamedQueries.class)アノテーションが付加されるようになりました。こうすると、コンテナ・アノテーションが使われ続けても、それを意識する必要なしに、宣言やクラスに同じアノテーションを追加できま

す。@Repeatableがコンテナ・アノテーションの詳細を抽象化してくれるからです。 次に例を示します。JPA 2.1では、エンティティ・クラスに複数の@NamedQueryアノテーションを付加する場

合、リスト4のように@NamedQueriesアノテーションを使ってカプセル化する必要がありました。

繰返し可能アノテーションが導入され、1つの宣言に対して同じアノテーションを複数回繰り返すことができるようになりました。

Page 11: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

45

//java ee 8 /

リスト4:@Entity@Table(name = "CUSTOMER")@XmlRootElement@NamedQueries({ @NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c") , @NamedQuery(name = "Customer.findByCustomerId", query = "SELECT c FROM Customer c " + "WHERE c.customerId = :customerId") , @NamedQuery(name = "Customer.findByName", query = "SELECT c FROM Customer c " + "WHERE c.name = :name"). . .)})public class Customer implements Serializable {. . .}

しかし、JPA 2.2では、そうではなくなっています。@NamedQueryが繰返し可能アノテーションになったため、リスト5のように、エンティティ・クラスに複数回記述できます。

リスト5:@Entity@Table(name = "CUSTOMER")@XmlRootElement@NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c")@NamedQuery(name = "Customer.findByCustomerId", query = "SELECT c FROM Customer c " + "WHERE c.customerId = :customerId")

Page 12: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

46

//java ee 8 /

@NamedQuery(name = "Customer.findByName", query = "SELECT c FROM Customer c " + "WHERE c.name = :name"). . .public class Customer implements Serializable {. . .}

表1(次ページ)に繰返し可能アノテーションを示します。

表1:

JPA 2.2リリースで繰返し可能になったアノテーションASSOCIATIONOVERRIDE

ATTRIBUTEOVERRIDE

CONVERT

JOINCOLUMN

MAPKEYJOINCOLUMN

NAMEDENTITYGRAPH

NAMEDNATIVEQUERY

NAMEDQUERY

NAMEDSTOREDPROCEDUREQUERY

PERSISTENCECONTEXT

PERSISTENCEUNIT

PRIMARYKEYJOINCOLUMN

SECONDARYTABLE

SQLRESULTSETMAPPING

Page 13: JPA 2.2の新機能...JPA 2.2リリースは、Java EE 8プラットフォームの一部です。すなわち、JPA 2.2をすぐに使用できる仕様になっている のは、Java

ORACLE.COM/JAVAMAGAZINE /////////////////// NOVEMBER/DECEMBER 2017

47

//java ee 8 /

まとめJPA 2.2リリースでは、それほど多くの変更が行われているわけではありませんが、重要な機能強化が含まれていま

す。ついにJPAがJava SE 8に対応し、開発者はDate and Time API、問合せ結果のストリーム処理、繰返し可能アノ

テーションなどの機能を利用できます。今回のリリースでは、CDIリソースを属性コンバータに注入する機能も追加

されており、CDIとの連携もいっそう強化されています。JPA 2.2がJava EE 8の一部となり、利用できるようになった

今、ぜひ使ってみてください。</article>

Josh Juneau:アプリケーション開発者、システム・アナリスト、データベース管理者。おもに、Javaやその他のJVM言語を使った開発に従事。Oracle Technology NetworkやJava Magazineで多くの記事を執筆している。JavaやJava EEに関する複数の著書をApressから出版しており、JSR 372およびJSR 378についてJCPの専門家グループのメンバーを務めた。NetBeans Dream Teamメンバー、Java Championであり、Java Off Heapポッドキャストにレギュラー出演中。