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>