JPAã®åé¡ç¹
JPAã«ã¯é常ã«æå¾ ãã¦ãã人ãå¤ãã§ããããç§ããã®ä¸äººã§ããå®éã«ããã¸ã§ã¯ãã§ä½¿ã£ã¦ã¿ã¦ãè¦ãã¦ããåé¡ç¹ãæ¸ãã¦ã¿ã¾ããJPAã®å®è£ ã¨ãã¦ã¯ï½¤Hibernate3.2ã使ã£ã¦ãã¾ãã
- å¦ç¿ã³ã¹ããé«ãã
- JPAã®å ¨æ©è½ã®ãã¡ï½¤ããã¸ã§ã¯ãã§ä½¿ããã®ã«çµãè¾¼ãã§æè²ããã¨ã3æ¥ç¨åº¦ã§æãããã¨ãã§ããã®ã§ãã、ãããã使ããããã«ãªãã«ã¯ï½¤2ã4é±éãããã¾ããããã¯ãHibernate in Actionã«ãæ¸ãã¦ããã®ã§ãããããã®ãªãã§ãããã
- ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ãé£ããã
- å¤ãã®ããã¸ã§ã¯ãã§å®éã«ããã«ã®ã¯ããã§ãããããã¡ã®ããã¸ã§ã¯ãã§ã¯ï½¤Hibernateè·äººã§ããå°æãããããã«ããããããããããè¦å´ãã¾ãããHibernateè·äººã®ããªãããã¸ã§ã¯ãã§ä½¿ãã®ã¯å³ããã®ã§ã¯ãªããã¨æãã¾ãã
- SQLã®æ±ãã貧弱ã
- JPQLã¯ãSQLã®ããªã貧弱ãªãµãã»ãããªã®ã§ï½¤SQLã使ãå¿ è¦ãããå ´åãããããããã®ã§ãã、JPAã®SQLã®æ±ãã¯è²§å¼±ã§ããSQLã®çµæãåç¬ã®Entityã«ã¤ãã¦è¿ãå ´åã¯ããã®ã§ãã、è¤æ°ã®Entityãè¿ããã¨ããã¨Objectã®é åã«åã ã®Entityãã¤ãããã¦è¿ã£ã¦ããã®ã§ãEmployee emp = (Employee) obj[0];ã®ãããªæãã§ãã£ã¹ããã¦ä½¿ãã®ã§ããããã£ã¦ããã¾ãã ãããææªã¯ï½¤Entity以å¤ã«ãããã³ã°ããå ´åã§ï½¤ãªãã¨Objectã®é åã§è¿ã£ã¦ããã®ã§ããLong id = (Long) obj[0];String ename = (String) obj[1];ãªã£ã¦ããå¿ è¦ããããªãã¦ãè¶ ããã¾ããKuinaDaoã¯ãS2Daoã®ããã«SQLã®çµæãDTOã«ãããã³ã°ã§ããã®ã§ããã®ã±ã¼ã¹ã¯å¤§ä¸å¤«ãªã®ã§ããï½¤ç´ ã®JPAã使ãã¨ãã£ã¨å°ãã§ã¯ãªããã¨æãã¾ãã
- æ°è¦ã·ã¹ãã 以å¤ã§ä½¿ãã®ã¯é£ããã
- å®éã®éçºã§ã¯ï½¤æ¬å½ã«æ°è¦ã·ã¹ãã ã¨ãããã¨ã¯ãã¾ããªã、æ¢ã«ããã·ã¹ãã ãä½ãç´ãã±ã¼ã¹ãå¤ããã®ã§ãããã®ãããªå ´å、æ¢ã«ãã¼ãã«ãSQLã¯åå¨ããã®ã§ãã、ãããJPAãã¼ã¹ã«ç½®ãæããã®ã¯ï½¤å¤§å¤ã§ããç¹ã«SQLãJPQLã«å¤æ´ãããã¨ã¨ï½¤ã¬ã¬ã·ã¼ãªã·ã¹ãã ã§idã使ããã¦ããªãå ´åãªã©ãããªã大å¤ã
- ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ãå¾ããçºçããã
- JPAã使ãå ´åã¯ï½¤Entityéã®é¢é£ã¯lazyã«ããã®ãåºæ¬ã§ããããããã¨æåã«å°éã®ãã¼ã¿ã§éçºãã¦ããã¨ãã¯åé¡ãèµ·ãããªãã®ã§ãã、çµåãã¹ãã®ãã§ã¼ãºã«ãªã£ã¦æ¬çªã«è¿ããã¼ã¿ãæ±ãããã«ãªãã¨lazy loadingã«ããN+1 SELECTåé¡ãçºçã、ããã©ã¼ãã³ã¹ãå£åãã¾ããFetch Joinã§å¯¾å¿ã§ããã°ã¾ã 楽ãªã®ã§ãã、ããã¯è¡ããªãå ´å、SQLãæ¸ãå¿ è¦ããã、åã«æ¸ããSQLã®æ±ãã貧弱ãªåé¡ã«ã¶ã¡å½ããã¾ãã
- View層ã«ãããlazy loadingåé¡
- View層ã§Entityãç´æ¥æ±ãã¨ãView層ã§Entityã®é¢é£ããã©ãå¿ è¦ããã、ããã§lazy loading(SELECTæã®å®è¡)ãèµ·ããå¯è½æ§ãããã¾ããTransactionã¹ã³ã¼ããªEnityManagerã使ãå ´å、View層ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå¶å¾¡ããå¿ è¦ãããã¾ããããã£ã¦ããã¾ããããããSeasar2ã®å ´åã¯ï½¤S2Dxoã使ã£ã¦ã¹ãã¼ãã«ãã®åé¡ã解決ã§ãã¾ãã
- ç«ã¡ä¸ãæã®åæåãé
ã
- ãã¹ãããã¨ãã«ï½¤JPAã®ç°å¢ããã¹ããã¨ã«åæåããã¨ãã¾ãã«é ããã£ã¦ããã¾ãããSeasar2ã§ã¯ãã¹ãã£ã³ã°ãã¬ã¼ã ã¯ã¼ã¯å´ã§å¯¾å¿ãã¦ãã¾ãã、ããããã®ããªãã¨ãã¹ããããã®ã大å¤ã§ãã
- çç£æ§ãS2Daoããæªã
- æ¢åã®SQLãå©ç¨ã§ãããããªéçºã ã¨ï½¤å§åçã«S2Daoã®æ¹ããçç£æ§ãä¸ããã¾ããæ°è¦ã«éçºããå ´åã§ã、JPAã®æ¹ãè¤éãªãã、ãã©ãã«ã±ã¼ã¹ãå¤ãæå¤ã¨ã³ã¹ãããããã¾ããã¾ããæ¸ããªããã°ãããªãã³ã¼ãã®éãJPAã®æ¹ãå§åçã«å¤ããªãã¾ããKuinaDaoã使ãã°ï½¤æ¸ããªããã°ãããªãã³ã¼ãã®éã¯S2Dao並ã«å°ãªããªãã®ã§ãã、è¤éã ã¨ããåé¡ã¯è§£æ±ºã§ãã¾ããã
JPAã使ã£ã¦æã楽ãããã«ã¯ï½¤StatefulSessionBeanã¨ExtendedãªEntityManagerã使ããã¨ã§ããView層ã®lazy loadingã®åé¡ããªãã、detachãããEntityãmergeããå¿
è¦ããªãã、SessionBeanãçãã¦ããéã¯ï½¤ä¸åº¦ã¢ã¯ã»ã¹ããEntityã¯ãã£ãã·ã¥ããã¦ããã®ã§ï½¤ããã©ã¼ãã³ã¹ãåä¸ãã¾ããåé¡ç¹ã¯ï½¤ä¸åº¦ã¢ã¯ã»ã¹ããã¨ã³ãã£ãã£ããã£ãã·ã¥ãã¦ããã®ã§ï½¤ã¡ã¢ãªã大éã«æ¶è²»ãããã¨ã§ããç¾å¨ã®JPAã§ã¯ããã£ãã·ã¥ãå
¨é¨ã¯ãªã¢ããã¨ãã大éæãªã¡ã½ããããç¨æããã¦ããªãã®ã§å°ãè
ã§ããã¾ããStatefulSessionBeanããã¡ãã¨åé¤ãã¦ãããªãã¨ãã£ãã·ã¥ãããEntityã解æ¾ãããªãã¨è¨ãåé¡ãããã¾ããããã¯ãSeamã§ã¯ãStatefulSessionBeanã®ã©ã¤ããµã¤ã¯ã«ãèªåçã«ç®¡çããã®ã§ï½¤è§£æ±ºããã¦ããããã«æãã¾ãã、ã¦ã¼ã¶ãæå¾ã¾ã§å¦çãè¡ããã«ãéä¸ã§å¦çãæ¢ããå ´åã¯ï½¤StatefulSessionBeanãåé¤ãããã«æ®ã£ã¦ãã¾ãã®ã§ã¯ãªããã¨æãã¾ããSeamã«è©³ãã人、ééã£ã¦ãããæãã¦ãã ããã
çµè«ãæ¸ãã¨ãä»ã®JPAã¯ãããªãã®åé¡ãæ±ãã¦ãã¾ããç´ ã§ä½¿ãã®ã¯ãå§ããã¾ãããJPAã¯ãJPAã®ãã¨ãè¯ãç¥ã£ã¦ãããã¬ã¼ã ã¯ã¼ã¯ã¨çµã¿åããããã¨ããå§ããã¾ããä»ã®æç¹ã§ï½¤JPAã使ãã®ã«è¯ãã¨æããã¬ã¼ã ã¯ã¼ã¯ã¯ï½¤Seasar2ã®Easy Enterpriseãã¡ããªã¼ã¨Seamã§ããEasy Enterpriseãã¡ããªã¼ã¯ãSQLã®åé¡ãView層ã«ãããlazy loadingåé¡ã解決ãã¦ããã®ã§ãããæ大ã®åé¡ã¯ï½¤S2Hibernate-JPAã¨KuinaDaoãæ£å¼ãªãªã¼ã¹ããã¦ããªããã¨ãæ©ããªãªã¼ã¹ãã¦ãã ãã¼ã¼ãã
Seamã¯ã大éã«ã¡ã¢ãªã使ããã¨ãè¦ã«ãªããªããããªã·ã¹ãã ãªã、è¯ãã®ã§ã¯ãªãã§ãããããSQLã®æ±ãã貧弱ãªåé¡ç¹ã¯ï½¤Hibernateã®Sessionãç´ã«å¼ã¶ãã¨ã§è§£æ±ºã§ããã§ãããã