S2Hibernate-JPA EA2 を試してみる
ADSLがつながったのでネットが快適。ダイアルアップではダウンロードが難しかったS2Hibernate-JPA EA2を試してみました。
久しぶりのSeasar、結構はまりましたけど何とか動きました。とにかくEntityManagerを使ってみました。以下そのコード。
まずはCustomerエンティティ:Idはマニュアルでセットすることにします。@EntityにAccessType指定しなくてもよくなったのは楽チン。
@Entity public class Customer { @Id int id; String name; public Customer(){ } public Customer(int id, String name){ this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Daoインタフェース
public interface CustomerDao { void insert(Customer c); Customer findCustomerById(int id); }
Daoクラス:EntityManagerのsetterを用意します。
public class CustomerDaoBean implements CustomerDao { private EntityManager em; public void setEm(EntityManager em) { this.em = em; } public void insert(Customer c) { em.persist(c); } public Customer findCustomerById(int id) { return em.find(Customer.class, id); } }
Logicインタフェース
public interface CustomerMain { void execute(); }
Logicクラス:Daoのsetterを用意します。mainメソッドではコンテナからコンポーネント取得してます。実は最初コンポーネントをJNDIで取得しようとしたんですけど、やり方がわからなくなってしまったので断念しました。そこで通常通りS2ContainerFactoryからS2Containerをcreateしてと進めようとしたんですがこれもうまくいかなかったので、最終的にSingletonS2ContainerFactory使うことにしました。S2ContainerFactoryはだめでSingletonS2ContainerFactoryはOKってなんでだろう?
public class CustomerMainBean implements CustomerMain { private CustomerDao customerDao; public void setCustomerDao(CustomerDao customerDao) { this.customerDao = customerDao; } public void execute() { customerDao.insert(new Customer(1, "nakamura")); Customer c = customerDao.findCustomerById(1); System.out.println(c.getName()); } public static void main(String[] args) throws Exception { SingletonS2ContainerFactory.init(); CustomerMainBean cm = (CustomerMainBean) SingletonS2ContainerFactory .getContainer().getComponent(CustomerMainBean.class); cm.execute(); } }
app.dicon:SingletonS2ContainerFactoryで読み込まれます。
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components namespace="app" > <include path="study/my.dicon"/> </components>
my.dicon:使い方をいまいち把握し切れていないですけどAutoRegisterを使います。instanceDefにprototypeを指定します。トランザクションにはEJBと同じ挙動をするejbtx.requiredTxというコンポーネントを使ってみます。
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components namespace="my"> <include path="s2hibernate-jpa.dicon"/> <include path="ejbtx.dicon"/> <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"> <property name="instanceDef"> @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE </property> <initMethod name="addClassPattern"> <arg>"study"</arg> <arg>".*Bean"</arg> </initMethod> </component> <component class="org.seasar.framework.container.autoregister.AspectAutoRegister"> <property name="interceptor">ejbtx.requiredTx</property> <initMethod name="addClassPattern"> <arg>"study"</arg> <arg>".*Bean"</arg> </initMethod> </component> </components>