JSF2.0+JPA2.0+eclipse 構築編:JPAでの例外の解消(その1)

JPAを使おうとしたら例外が出たので原因を調査して解消を目指します。
なんで素直に動作してくれないんだろ?

例外スタックトレースの肝(と思われる)は以下。

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName null
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:121)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:162)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:883)
	at sandbox.bean.EmployeeService.getAll(EmployeeService.java:30)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)
...

例外メッセージを間に受けてみる

「Unable to retrieve EntityManagerFactory for unitName null」とメッセージにあります。
「nullってゆー名前のエンティティマネージャファクトリが取ってこれないよ」ぐらいの意味でしょう。

なんだかEmployeeServiceの@PersistenceContextのunitNameを省略しているのが悪い、というふうに取れます。
うーんでも、persistence.xmlに永続化ユニットが一つしか定義されていない場合はunitNameは省略できるんじゃないかなぁ。

ま、何はともあれunitNameをちゃんと書いてみましょう。

@PersistenceContext(unitName = "pu")
private EntityManager em;

さてglassfish-embeddedを起動して再度以下のURLにアクセスします。

・・・ダメです。
例外のスタックトレースが変わっていません。

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName pu
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:121)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:162)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:883)
	at sandbox.bean.EmployeeService.getAll(EmployeeService.java:30)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
...

状況は変わっていないようです。

うーん、どう調査したものか・・・


(追記)
変わってない、と思ったら一ヶ所変わってました。

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName null

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName pu

に。
最後がnullでなくてアノテーションに明示指定したunitNameの値になってます。だからって例外の原因が分かるわけではないのですが。。。