¤³¤Î¥Ú¡¼¥¸¤òdel.icio.us¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤ò¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤à¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯ ¤³¤Î¥Ú¡¼¥¸¤òlivedoor ¥¯¥ê¥Ã¥×¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤òYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤àYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯
Top / Hibernate / Spring¤ÈGeneric¤ò»È¤Ã¤Æ¡¢ÈÆÍÑŪ¤ÊDAO¤òºîÀ®¤¹¤ë

IBM¤Î¥µ¥¤¥È¤ËHibernate¤ÈSpring AOP¤Ç¡¢ÈÆÍÑÀ­¤È·¿°ÂÁ´À­¤òÈ÷¤¨¤¿DAO¤òºî¤ë¤È¤¤¤¦Èó¾ï¤Ë¶½Ì£¿¼¤¤µ­»ö¤òȯ¸«¡£¤³¤ì¤Ï¶È̳¥¢¥×¥ê¤òºî¤ë¤È¤­¤Ë¤¤¤Ä¤âºîÀ®¤¹¤ëDAO¤ò¸úΨ¤è¤¯ºîÀ®¤¹¤ëÊýË¡¤ò¤Þ¤È¤á¤¿µ­»ö¤Ç¤¹¡£Ä̾ïDAO¤ÎºîÀ®¤Ã¤Æ¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤´¤È¤Ë»÷¤¿¤è¤¦¤Ê¥³¡¼¥Ç¥£¥ó¥°¤ò¤·¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¯¤Æ¤Ò¤¸¤ç¡¼¤ËÈѤ路¤¤¤Î¤Ç¤¹¤¬¡¢Generics¤ÈSpring¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¤³¤ÎÌÌÅݤʺî¶È¤«¤é²òÊü¤µ¤ì¤Þ¤¹¡£Ìܤ«¤é¥¦¥í¥³¤Ç¤¹¤Í¡£

¤ä¤Ã¤Æ¤ß¤ë

¥¨¥ó¥Æ¥£¥Æ¥£¤Ê¤É¤ÏHibernate/Spring¤ò»È¤Ã¤Æ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó½èÍý¤òµ­½Ò¤¹¤ë¤Î¤â¤Î¤ò¤½¤Î¤Þ¤ÞήÍѤ·¤Þ¤¹¡£

  • DDL
     create table MKINO.USER_ATTR (
     USERID varchar2(100) not null,
     NAME varchar2(1000), primary key (USERID)
    );
  • ¥¯¥é¥¹¿Þ
    classdiagram.png

¤³¤Î¥¯¥é¥¹¿Þ¤Ç¡¢UserDao?¤ËÅö¤¿¤ëÉôʬ¤Ï¥¨¥ó¥Æ¥£¥Æ¥£¤´¤È¤Ë¼ÂÁõ¤ò½ñ¤«¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¤Î¤Ç¤¹¤¬¡¢¥³¥³¤ò³Ú¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

¤Þ¤º¤Ï´ðÄ쥯¥é¥¹¤òºîÀ®

UserDao?¤Î´ûÄê¤È¤Ê¤ë¥¯¥é¥¹¤òºîÀ®¤·¤Þ¤¹¡£

import java.io.Serializable;

public interface GenericDao<T, PK extends Serializable> {
  PK create(T newInstance);
  T read(PK id);
  void update(T transientObject);
  void delete(T persistentObject);
}

¥¨¥ó¥Æ¥£¥Æ¥£¤ËÂФ¹¤ëCRUD¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄêµÁ¤·¤Þ¤·¤¿¡£Generics¤ò»È¤Ã¤Æ¥×¥é¥¤¥Þ¥ê¥­¡¼¤È¥¨¥ó¥Æ¥£¥Æ¥£¤ò¥Ñ¥é¥á¡¼¥¿²½¤·¤Æ¤¤¤ë¤Î¤¬¥Ý¥¤¥ó¥È¤Ç¤¹¡£

¼¡¤Ë¼ÂÁõ¥¯¥é¥¹¤òHibernate¤ÈSpring¤ò»È¤Ã¤Æ¼ÂÁõ¤·¤Þ¤¹¡£

import java.io.Serializable;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class GenericDaoHibernateImpl<T, PK extends Serializable> extends
    HibernateDaoSupport implements GenericDao<T, PK> {
  private Class<T> type;

  public GenericDaoHibernateImpl(Class<T> type) {
    this.type = type;
  }

  public PK create(T o) {
    return (PK) getHibernateTemplate().save(o);
  }

  public T read(PK id) {
    return (T) getHibernateTemplate().get(type, id);
  }

  public void update(T o) {
    getHibernateTemplate().update(o);
  }

  public void delete(T o) {
    getHibernateTemplate().delete(o);
  }

}

¼ÂÁõ¥¯¥é¥¹¤Ç¤â·¿¤Ï¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤Þ¤¹¡£¤Þ¤¿¥µ¥Ö¥¯¥é¥¹¤Ç

return (T) getHibernateTemplate().get(type, id);

¤ÎÉôʬ¤¬

return (Hoge) getHibernateTemplate().get(Hoge.class, id);

¤È¤Ê¤é¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¤Î¤ÇClass¥¯¥é¥¹¤ò°ú¿ô¤Ë¼è¤ë¥³¥ó¥¹¥È¥é¥¯¥¿

public GenericDaoHibernateImpl(Class<T> type) {
  this.type = type;
}

¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤ó¤Ç¥á¥½¥Ã¥É¤Ï

return (T) getHibernateTemplate().get(type, id);

¤Èµ­½Ò¤·¤Æ¤ª¤¯¤ï¤±¤Ç¤¹¤Í¡£

¤µ¤Æ½àÈ÷¤Ï¤Ç¤­¤Þ¤·¤¿¡£

¥¤¥ó¥¿¥Õ¥§¡¼¥¹IUserDao?¤òºîÀ®¤¹¤ë

¼¡¤ËUserDao?¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹IUserDao?¤òºîÀ®¤·¤Þ¤¹¡£¤³¤ì¤Ï¥³¥³¤Î¤ä¤êÊý¤Ç¤Ê¤¯¤Æ¤âºîÀ®¤¹¤ë¤¤¤ï¤æ¤ëDAO¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£Ä̾ï¤Ï

import nu.mine.kino.entity.UserAttr;

public interface IUserDao {
  String create(UserAttr newInstance);
  void delete(UserAttr persistentObject);
  UserAttr read(String id);
  void update(UserAttr transientObject);
}

¤Ê¤ó¤Æ¤Î¤òÄêµÁ¤¹¤ë¤Î¤Ç¤¹¤¬¡¢¾å¤ÎGenericDao?¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òºîÀ®¤·¤¿¤Î¤Ç

import nu.mine.kino.entity.UserAttr;

public interface IUserDao extends GenericDao<UserAttr, String> {
}

¤È¥Æ¥ó¥×¥ì¡¼¥È²½¤µ¤ì¤¿·¿¤ò»ØÄꤹ¤ë¤À¤±¤Ç£Ï£Ë¤È¤Ê¤ê¤Þ¤¹¡£¤³¤³¤Ï¥¨¥ó¥Æ¥£¥Æ¥£¤´¤È¤Ë°ú¿ô¤äÌá¤êÃͤò¤Á¤ç¤³¤Á¤ç¤³½¤Àµ¤·¤ÆºîÀ®¤¹¤ë¤È¤¤¤¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ê¤Î¤Ç¡¢¥³¥³¤Îµ­½Ò¤¬³Ú¤Ë¤Ê¤ë¤Î¤Ï¤¹¤´¤¯¤¦¤ì¤·¤¤¤Ç¤¹¤Í¡£

IUserDao?¤Î¼ÂÁõ¥¯¥é¥¹¤òºîÀ®¤¹¤ë¡£

¼¡¤ËIUserDao?¤Î¼ÂÁõ¤òºîÀ®¤·¤Þ¤¹¡£¥³¥³¤âÄ̾ï¤Ï

import java.util.List;
import nu.mine.kino.entity.UserAttr;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * @author Masatomi KINO
 * @version $Revision: 1.2 $
 */
public class UserDao extends HibernateDaoSupport implements IUserDao {
  public String create(UserAttr newInstance) {
    return (String) getHibernateTemplate().save(newInstance);
  }

  public void delete(UserAttr persistentObject) {
    getHibernateTemplate().delete(persistentObject);
  }

  public UserAttr read(String id) {
    return (UserAttr) getHibernateTemplate().get(UserAttr.class, id);
  }

  public void update(UserAttr transientObject) {
    getHibernateTemplate().update(transientObject);
  }
}

¤Ê¤É¤È¤ä¤ë¤ï¤±¤Ç¤¹¤¬*1¡¢GenericDaoHibernateImpl?¤¬¤¢¤ë¤ª¤«¤²¤Ç

import java.util.List;
import nu.mine.kino.entity.UserAttr;

/**
 * ¤È¤ê¤¢¤¨¤º¡¢IUserDao¤Î¼ÂÁõ¥¯¥é¥¹¤È¤·¤ÆºîÀ®¤·¤¿DAO¥¯¥é¥¹¡£ 
 * ¼ÂºÝ¤Ï¡¢IUserDao (¤Èextends GenericDao<UserAttr,String>)
 * ¤Î»ØÄê¤À¤±¤Ç½½Ê¬¤Ê¤Î¤Ç¡¢¤³¤Î¥¯¥é¥¹¤ÏɬÍפʤ¤¡£
 * 
 * @author Masatomi KINO
 * @version $Revision: 1.1 $
 */
public class UserDao extends GenericDaoHibernateImpl<UserAttr, String>
    implements IUserDao {

  public UserDao(Class<UserAttr> type) {
    super(type);
  }
}

¤È¤Ê¤ë¤À¤±¤Ç¤¹¡£

¤µ¤ÆSpring¤ÎBeanÄêµÁ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

<beans default-autowire="no" default-lazy-init="false"
  default-dependency-check="none">

  <bean id="genericUserBL"
      class="nu.mine.kino.genericbl.UserBL">
    <property name="dao">
      <ref bean="userGenericDao"/>
    </property>
  </bean>

  <bean id="userGenericDao"
      class="nu.mine.kino.genericdao.UserDao">
    <constructor-arg>
      <value>nu.mine.kino.entity.UserAttr</value>
    </constructor-arg>
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>
</beans>

¤³¤Î¤è¤¦¤ËBL¤ËInjection¤·¤Æ¤¢¤²¤ì¤Ð¤è¤¤¤ï¤±¤Ç¤¹¡£

¼Â¹Ô¤¹¤ë

BL¤Ïº£¤Þ¤ÇÄ̤êºî¤ì¤Ð¤è¤¤¤Ç¤¹¡£

public interface IUserBL {
  String create(UserAttr newInstance);
  void delete(UserAttr persistentObject);
  UserAttr read(String id);
  void update(UserAttr transientObject);
}

¤È¼ÂÁõ¥¯¥é¥¹¤Ï

public class UserBL implements IUserBL {
  private IUserDao dao;
  public String create(UserAttr newInstance) {return dao.create(newInstance);}
  public void delete(UserAttr persistentObject) {dao.delete(persistentObject);}
  public UserAttr read(String id) {return dao.read(id);}
  public void update(UserAttr transientObject) {dao.update(transientObject);}
  public void setDao(IUserDao dao) {this.dao = dao;}
}

¤È¤Ê¤ê¤Þ¤¹¡£¼Â¹Ô¤¹¤ë¥á¥¤¥ó¥¯¥é¥¹¤Ï°Ê²¼¤ÎÄ̤ꡣ

public class GenericSpringMain {
  public static void main(String[] args) throws IOException {
    DOMConfigurator.configure("log4j.xml");
    ApplicationContext context = new FileSystemXmlApplicationContext(
        new String[] { "beans.xml", "hibernate-spring_test.xml" });
    String name = getUniqueKey();
    IUserBL bl = (IUserBL) context.getBean("genericUserBL");
    bl.someMethod();//¤Ê¤ó¤«BL 
  }

  /**
   * PK¤òÀ¸À®¤·¤¿¤¤¤À¤±¡£ËܼÁŪ¤Ê°ÕÌ£¥Ê¥·
   */
  private static String getUniqueKey() throws IOException {
    File temp = File.createTempFile("abc", "");
    temp.deleteOnExit();
    String name = temp.getName();
    return name;
  }
}

¤³¤ì¤À¤±¤Ç¤â³Ú¤Ë¤Ê¤Ã¤¿¤±¤É¡£

¤³¤ì¤À¤±¤Ç¤â³Ú¤Ë¤Ê¤Ã¤¿¤±¤É¼Â¤ÏUserDao?¤ÎÉôʬ¤ÏSpring¤ò»È¤Ã¤Æ¤ë¤Î¤ÇºîÀ®¤¹¤ëɬÍפϤʤ¤¤ß¤¿¤¤¤Ç¤¹¡£¤è¤¦¤¹¤ë¤ËBeanÄêµÁ¤ò

  <bean id="userGenericDao"
      class="nu.mine.kino.genericdao.GenericDaoHibernateImpl"> <-Êѹ¹
    <constructor-arg>
      <value>nu.mine.kino.entity.UserAttr</value>
    </constructor-arg>
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>

¤ËÊѹ¹¤·¡¢BL¤ò

public class UserBL implements IUserBL {
  private GenericDao<UserAttr, String> dao; //IUserDao¤òGenericDao¤ËÊѹ¹

  //IUserDao¤òGenericDao¤ËÊѹ¹
  public void setDao(GenericDao<UserAttr, String> dao) {
    this.dao = dao;
  }
  // ¤¢¤È¤ÏƱ¤¸
}

¤ÈÊѹ¹¤¹¤ì¤Ð£Ï£Ë¤Ç¤¹¡£¤â¤Ï¤äUserDao?/IUserDao?¤ÏɬÍץʥ·¤Ç¤¹¡£CRUD¤À¤±¤Ê¤éÈÆÍÑŪ¤ÊDAO¤ÈSpring¤ÎBean»ØÄê¤À¤±¤Ç½½Ê¬¤Ê¤ó¤Ç¤¹¤Í¡£

DAO¤Ë¸ÄÊ̤Υ᥽¥Ã¥É¤òÄêµÁ¤·¤¿¤¤

¤³¤³¤Þ¤Ç¤Î¥µ¥ó¥×¥ë¤Ç¡¢DAO¤ËCRUD¤ò¼ÂÁõ¤¹¤ë¸Â¤ê¤ÏDAO¤Î¼ÂÁõ¥¯¥é¥¹¤ÏɬÍפʤ¤¤È¤¤¤¦¤³¤È¡¢DAO¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤â¤½¤ì¤¾¤ìCRUD¤òÄêµÁ¤·¤Ê¤¤¤Ç¤âGenerics¤ò»È¤Ã¤Æ¥Ñ¥é¥á¡¼¥¿²½¤Ç¤­¤ë¤³¤È¤¬Ê¬¤«¤ê¤Þ¤·¤¿¡£

¤µ¤ÆÄ̾ïDAO¤Ë¤Ï¤½¤Î¥¨¥ó¥Æ¥£¥Æ¥£¸ÇÍ­¤Î¸¡º÷µ¡Ç½¤ò¼ÂÁõ¤·¤¿¤¤¤Ç¤¹¤Í¡£¤¿¤È¤¨¤ÐÉôʬ°ìÃפ¹¤ë¸¡º÷¤Ê¤É¤Ç¤¹¤Í¡£¤½¤ì¤é¤Ï¤É¤¦¤¹¤ë¤Î¤Ç¤·¤ç¤¦¤«¡£


¤³¤Îµ­»ö¤Ï

ÁªÂò»è Åêɼ
¤ª¤â¤·¤í¤«¤Ã¤¿ 48  
¤½¤¦¤Ç¤â¤Ê¤¤ 8  
  • ¸åȾ¤¬Æñ¤·¤¤¡£¡£¤³¤ì¤À¤±¤ä¤ä¤³¤·¤¤¤È¡¢¿Í³¤Àï½Ñ¤Ç³«È¯¤·¤Æ¤ë¤È¤­¤Ï̵Íý¤«¤Ê¤¢¡©¡© -- ¤­¤Î? 2007-05-09 (¿å) 11:35:38
  • GenericDaoHibernateImpl?¤Îprivate Class<T> type¤Ë¤Ä¤¤¤Æ¤Ê¤ó¤Ç¤¹¤¬¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î°ú¿ô¤Ç½é´ü²½¤·¤Ê¤¯¤Æ¤â¡¢this.type = (Class<T>) ( (ParameterizedType?) getClass().getGenericSuperclass?() ).getActualTypeArguments?()[0]¤ò°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÃæ¤Ë½ñ¤±¤Ð½é´ü²½¤Ç¤­¤ë¤È¡¢[Java Persistence with Hibernate]¤ÎËܤ˽ñ¤«¤ì¤Æ¤¤¤ë¤é¤·¤¤¤Ç¤¹ -- ¤·¤ç¤¦¤·¤ç¤¦? 2008-10-14 (²Ð) 23:34:33
  • GenericDaoHibernateImpl?¤Îprivate Class<T> type¤Ë¤Ä¤¤¤Æ¤Ê¤ó¤Ç¤¹¤¬¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î°ú¿ô¤Ç½é´ü²½¤·¤Ê¤¯¤Æ¤â¡¢this.type = (Class<T>) ( (ParameterizedType?) getClass().getGenericSuperclass?() ).getActualTypeArguments?()[0]¤ò°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÃæ¤Ë½ñ¤±¤Ð½é´ü²½¤Ç¤­¤ë¤È¡¢[Java Persistence with Hibernate]¤ÎËܤ˽ñ¤«¤ì¤Æ¤¤¤ë¤é¤·¤¤¤Ç¤¹ -- ¤·¤ç¤¦¤·¤ç¤¦? 2008-10-15 (¿å) 00:59:05

¤³¤Î¥Ú¡¼¥¸¤òdel.icio.us¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤ò¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤à¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯ ¤³¤Î¥Ú¡¼¥¸¤òlivedoor ¥¯¥ê¥Ã¥×¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤òYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤àYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯
Top / Hibernate / Spring¤ÈGeneric¤ò»È¤Ã¤Æ¡¢ÈÆÍÑŪ¤ÊDAO¤òºîÀ®¤¹¤ë

¸½ºß¤Î¥¢¥¯¥»¥¹:30420


*1 ¤³¤ì¡¢¥Û¥ó¥È¤á¤ó¤É¤¯¤µ¤¤¤Ã

źÉÕ¥Õ¥¡¥¤¥ë: fileclassdiagram.png 1271·ï [¾ÜºÙ]

¥È¥Ã¥×   ÊÔ½¸ Åà·ë º¹Ê¬ ¥Ð¥Ã¥¯¥¢¥Ã¥× źÉÕ Ê£À½ ̾Á°Êѹ¹ ¥ê¥í¡¼¥É   ¿·µ¬ °ìÍ÷ ñ¸ì¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS
Last-modified: 2012-03-22 (ÌÚ) 11:41:23 (58d)