Hibernate/SpringとGenericを使って、汎用的なDAOを作成する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
#contents
//ここにコンテンツを記述します。
IBMのサイトに[[HibernateとSpring AOPで、汎用性と型安全性...
**やってみる [#ae529dac]
エンティティなどは[[Hibernate/Springを使ってトランザクシ...
-DDL
create table MKINO.USER_ATTR (
USERID varchar2(100) not null,
NAME varchar2(1000), primary key (USERID)
);
-クラス図
#ref(classdiagram.png)
このクラス図で、UserDaoに当たる部分はエンティティごとに実...
***まずは基底クラスを作成 [#h38acb25]
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のインタフェースを定義しました。G...
次に実装クラスをHibernateとSpringを使って実装します。
import java.io.Serializable;
import org.springframework.orm.hibernate3.support.Hibern...
public class GenericDaoHibernateImpl<T, PK extends Seria...
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を作成する [#w8c722bf]
次にUserDaoのインタフェースIUserDaoを作成します。これはコ...
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, S...
}
とテンプレート化された型を指定するだけでOKとなります。...
***IUserDaoの実装クラスを作成する。 [#ff4e04f7]
次にIUserDaoの実装を作成します。ココも通常は
import java.util.List;
import nu.mine.kino.entity.UserAttr;
import org.springframework.orm.hibernate3.support.Hibern...
/**
* @author Masatomi KINO
* @version $Revision: 1.2 $
*/
public class UserDao extends HibernateDaoSupport impleme...
public String create(UserAttr newInstance) {
return (String) getHibernateTemplate().save(newInsta...
}
public void delete(UserAttr persistentObject) {
getHibernateTemplate().delete(persistentObject);
}
public UserAttr read(String id) {
return (UserAttr) getHibernateTemplate().get(UserAtt...
}
public void update(UserAttr transientObject) {
getHibernateTemplate().update(transientObject);
}
}
などとやるわけですが((これ、ホントめんどくさいっ))、Gener...
import java.util.List;
import nu.mine.kino.entity.UserAttr;
/**
* とりあえず、IUserDaoの実装クラスとして作成したDAOクラ...
* 実際は、IUserDao (とextends GenericDao<UserAttr,Strin...
* の指定だけで十分なので、このクラスは必要ない。
*
* @author Masatomi KINO
* @version $Revision: 1.1 $
*/
public class UserDao extends GenericDaoHibernateImpl<Use...
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してあげればよいわけです。
***実行する [#nb7490a9]
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...
public void delete(UserAttr persistentObject) {dao.del...
public UserAttr read(String id) {return dao.read(id);}
public void update(UserAttr transientObject) {dao.upda...
public void setDao(IUserDao dao) {this.dao = dao;}
}
となります。実行するメインクラスは以下の通り。
public class GenericSpringMain {
public static void main(String[] args) throws IOExcept...
DOMConfigurator.configure("log4j.xml");
ApplicationContext context = new FileSystemXmlApplic...
new String[] { "beans.xml", "hibernate-spring_te...
String name = getUniqueKey();
IUserBL bl = (IUserBL) context.getBean("genericUserB...
bl.someMethod();//なんかBL
}
/**
* PKを生成したいだけ。本質的な意味ナシ
*/
private static String getUniqueKey() throws IOExceptio...
File temp = File.createTempFile("abc", "");
temp.deleteOnExit();
String name = temp.getName();
return name;
}
}
***これだけでも楽になったけど。 [#af494cd8]
これだけでも楽になったけど実はUserDaoの部分はSpringを使っ...
<bean id="userGenericDao"
class="nu.mine.kino.genericdao.GenericDaoHibernate...
<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を...
//IUserDaoをGenericDaoに変更
public void setDao(GenericDao<UserAttr, String> dao) {
this.dao = dao;
}
// あとは同じ
}
と変更すればOKです。もはやUserDao/IUserDaoは必要ナシで...
**DAOに個別のメソッドを定義したい [#pf40a7d6]
ここまでのサンプルで、DAOにCRUDを実装する限りはDAOの実装...
さて通常DAOにはそのエンティティ固有の検索機能を実装したい...
----
この記事は
#vote(おもしろかった[62],そうでもない[8])
- 後半が難しい。。これだけややこしいと、人海戦術で開発し...
- GenericDaoHibernateImplのprivate Class<T> typeについて...
- GenericDaoHibernateImplのprivate Class<T> typeについて...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
#contents
//ここにコンテンツを記述します。
IBMのサイトに[[HibernateとSpring AOPで、汎用性と型安全性...
**やってみる [#ae529dac]
エンティティなどは[[Hibernate/Springを使ってトランザクシ...
-DDL
create table MKINO.USER_ATTR (
USERID varchar2(100) not null,
NAME varchar2(1000), primary key (USERID)
);
-クラス図
#ref(classdiagram.png)
このクラス図で、UserDaoに当たる部分はエンティティごとに実...
***まずは基底クラスを作成 [#h38acb25]
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のインタフェースを定義しました。G...
次に実装クラスをHibernateとSpringを使って実装します。
import java.io.Serializable;
import org.springframework.orm.hibernate3.support.Hibern...
public class GenericDaoHibernateImpl<T, PK extends Seria...
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を作成する [#w8c722bf]
次にUserDaoのインタフェースIUserDaoを作成します。これはコ...
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, S...
}
とテンプレート化された型を指定するだけでOKとなります。...
***IUserDaoの実装クラスを作成する。 [#ff4e04f7]
次にIUserDaoの実装を作成します。ココも通常は
import java.util.List;
import nu.mine.kino.entity.UserAttr;
import org.springframework.orm.hibernate3.support.Hibern...
/**
* @author Masatomi KINO
* @version $Revision: 1.2 $
*/
public class UserDao extends HibernateDaoSupport impleme...
public String create(UserAttr newInstance) {
return (String) getHibernateTemplate().save(newInsta...
}
public void delete(UserAttr persistentObject) {
getHibernateTemplate().delete(persistentObject);
}
public UserAttr read(String id) {
return (UserAttr) getHibernateTemplate().get(UserAtt...
}
public void update(UserAttr transientObject) {
getHibernateTemplate().update(transientObject);
}
}
などとやるわけですが((これ、ホントめんどくさいっ))、Gener...
import java.util.List;
import nu.mine.kino.entity.UserAttr;
/**
* とりあえず、IUserDaoの実装クラスとして作成したDAOクラ...
* 実際は、IUserDao (とextends GenericDao<UserAttr,Strin...
* の指定だけで十分なので、このクラスは必要ない。
*
* @author Masatomi KINO
* @version $Revision: 1.1 $
*/
public class UserDao extends GenericDaoHibernateImpl<Use...
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してあげればよいわけです。
***実行する [#nb7490a9]
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...
public void delete(UserAttr persistentObject) {dao.del...
public UserAttr read(String id) {return dao.read(id);}
public void update(UserAttr transientObject) {dao.upda...
public void setDao(IUserDao dao) {this.dao = dao;}
}
となります。実行するメインクラスは以下の通り。
public class GenericSpringMain {
public static void main(String[] args) throws IOExcept...
DOMConfigurator.configure("log4j.xml");
ApplicationContext context = new FileSystemXmlApplic...
new String[] { "beans.xml", "hibernate-spring_te...
String name = getUniqueKey();
IUserBL bl = (IUserBL) context.getBean("genericUserB...
bl.someMethod();//なんかBL
}
/**
* PKを生成したいだけ。本質的な意味ナシ
*/
private static String getUniqueKey() throws IOExceptio...
File temp = File.createTempFile("abc", "");
temp.deleteOnExit();
String name = temp.getName();
return name;
}
}
***これだけでも楽になったけど。 [#af494cd8]
これだけでも楽になったけど実はUserDaoの部分はSpringを使っ...
<bean id="userGenericDao"
class="nu.mine.kino.genericdao.GenericDaoHibernate...
<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を...
//IUserDaoをGenericDaoに変更
public void setDao(GenericDao<UserAttr, String> dao) {
this.dao = dao;
}
// あとは同じ
}
と変更すればOKです。もはやUserDao/IUserDaoは必要ナシで...
**DAOに個別のメソッドを定義したい [#pf40a7d6]
ここまでのサンプルで、DAOにCRUDを実装する限りはDAOの実装...
さて通常DAOにはそのエンティティ固有の検索機能を実装したい...
----
この記事は
#vote(おもしろかった[62],そうでもない[8])
- 後半が難しい。。これだけややこしいと、人海戦術で開発し...
- GenericDaoHibernateImplのprivate Class<T> typeについて...
- GenericDaoHibernateImplのprivate Class<T> typeについて...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: