GlassFish V3 + EJB3.1 + JPAを試してみる

NetBeans6.1でGlassfish V3プラグインのアップデートが表示されていた.どこが変わったのだろう.変更点はどこで調べればいいのかな?とりあえず何も考えずアップデートする.


あんまりV3は立ち上げないからわからなかったがV3のアップデートセンターをたちあげて検索してみたらglassfishv3-ejbがアップデートされていた.これもどこが変わったのだろう・・・.

とりあえずアップデートしてみる.


せっかくなので今まで試していなかったものを試す.

まずVisualWebJSFは動かない.残念.


ではJPAEJB3.1 Liteからアクセスができるのだろうか.これを試す・・・お,うまくいった.

Glassfish V3 + EJB3.1 + JPAの手軽さは異常.earやejb-jarアレルギーの人も安心してほしい.warアーカイブだから.
そしてGlassfishV3の起動時間は手元のマシンで375ms.Tomcat並みといっていいだろう.

必要なソースコードをさらす.

web.xml抜粋

    <persistence-context-ref>
        <persistence-context-ref-name>persistence/em</persistence-context-ref-name>
        <persistence-unit-name>WebApplication4PU</persistence-unit-name>
    </persistence-context-ref>


何の変哲もないpersistence.xml.V3に付属のEclipseLinkにしているくらい.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 
xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="WebApplication4PU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/bookmark</jta-data-source>
    <properties/>
  </persistence-unit>
</persistence>


JPAのエンティティクラス抜粋.NetBeansがDBの構成を元に自動生成してくれる.その後@GeneratedValueをつけただけ.

public class Bookmark implements Serializable {
    private static final long serialVersionUID = 1L;
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Id
    @Column(name = "ID", nullable = false)
    private Integer id;
    @Column(name = "TITLE")
    private String title;
    @Column(name = "URL")
    private String url;


servlet抜粋.自動生成された雛形をいじっただけ.

public class NewServlet extends HttpServlet {
   
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet NewServlet</title>");  
            out.println("</head>");
            out.println("<body>");
            try {
                out.println(hello.hello());
            } catch (Exception ex) {
                out.println("れいがいがでました");
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            }
            out.println("</body>");
            out.println("</html>");
            
            
        } finally { 
            out.close();
        }
    } 
    
    @EJB
    private Hello hello;


EJB3.1のソース.

@Stateless
public class Hello {
    @PersistenceContext
    private EntityManager em;
    
    public String hello() throws Exception{
    
        Bookmark bookmark = new Bookmark();
        bookmark.setTitle("ぐーぐる");
        bookmark.setURL("http://www.google.co.jp/);
        em.persist(bookmark);
        
        if(true){
//            throw new RuntimeException("ひけんされいがい");
//            throw new Exception("れいがい");
        }
        
        return "はろー:"+bookmark.getTitle();
    }
}

EJBのコメントを有効にしたりしてテストをしてみる.


ちゃんと例外なしと検査例外はコミット,非検査例外はロールバックがされているようだ.
デフォルトだとサーブレットからEJBを呼び出すときがトランザクション境界ですんなりうけいれられる.


JavaEE6は開発の敷居がすさまじく下がりますね,こりゃ.Glassfish上でVisualWebJSFが動くようになればさらにお手軽になるでしょう.

あれ?ステートレスだとWebBeansあんまりいらない?