導入
hibernate-toolsでリバースエンジニアリングする際に「EJB3」「JPA」「POJO」らへんの単語がでてきたが、関係性がちゃんと理解できなかったので記事にまとめる。
まず結論(EJB・EJB3・JPAの関係性)
・EJB3は「EJBの上位互換」
・EJBでは「POJOを使えない」 EJB3から「POJOを使える」
・JPAは「EJB3でPOJOを使うために利用されているもの」。JPA単体では1つの技術として独立しており、EJB3がJPAという技術に依存している関係性
JPA
「JavaでORMを使うための仕様」
・Java Persistence API
・Java標準のORMの仕様(specification)
・**実装(implementation)**が別で提供されている。Springはデフォルト実装として「Hibernate」を利用する。
https://stackoverflow.com/questions/41902856/spring-boot-jpa-hibernate-as-default
・Beanクラスにある下記のようなアノテーションがJPAで定義されているもの
import javax.persistence.Entity;
@Entity
public class SampleBean {
public String field1;
public int field2;
}
Hibernate
「JPA(仕様)の実装」
・沼なのでここでは詳しい説明割愛
・JPAの実装ということだけ理解しておけばとりあえずいい。
EJB(Enterprise Java Beans)
「エンタープライズアプリケーション用の仕組み/フレームワーク」
もしくは
「EJBコンテナに登録するオブジェクト(POJOと対極にあるもの)」
を指す
「POJOが使えない(=EJBを利用する)フレームワーク」
■ EJBとはどんな仕組み?
EJBコンテナと呼ばれるところにオブジェクトをプールし、そのコンテナからオブジェクトを取り出して物理的に離れたところにあるオブジェクトにアクセスできるようにする仕組み
http://lasaya.blog129.fc2.com/blog-entry-17.html
・このフレームワークを使うにあたり、オブジェクトは一定の決まりに従って実装する必要がある(フレームワーク側で用意されたインタフェースをimplementsする必要があったりなど)
==こういう「フレームワークに縛られた実装/コーディング」をする必要がないものが「Plain(単純な) Old Java Object(POJO)」と呼ばれる。
EJB3
「POJOを使えるEJB」
・EJB2までは「javax.ejb.EntityBeanインタフェースをimplmentsしたBeanクラス」のようにフレームワークに縛られた状態にあった。
・「Bean1つ定義するたびに毎回javax.ejb.EntityBeanインタフェースに沿って実装するのだるくね?」という流れでEJB3ではPOJOとして扱えるようにアップデートされた。
=EJB2まで=
javax.ejb.EntityBeanインタフェースをimplments
=EJB3=
JPAの@Entity(javax.persistence.entity)等のアノテーションをつけるだけでOK
まとめ(EJB・EJB3・JPAの関係性)
・EJB3は「EJBの上位互換」
・EJBでは「POJOを使えない」 EJB3では「POJOを使える」
・JPAは「EJB3でPOJOを使うために利用されているもの」。JPA単体では1つの技術として独立しており、EJB3がJPAという技術に依存している関係性
自分用MEMO
・hibernate-toolsのreverse engineeringでEntityクラスを自動生成する時に「ejb3」というオプションがある。この意味は「(ejb3で利用している)JPA・Hibernateのアノテーション等を利用してEntityクラスを生成するかどうか」である。Spring Data JPA等のJPAを利用するアプリケーションの場合はこいつを「true」に設定する必要がある。