ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2Hibernate

S2Hibernateを作っていて、だいたいできているんですが、
Hibernateの基本的なところでつまづきました。
ラクルのサンプルデータのempテーブルのSCOTTの
データを読み込もうとしていてcommがnullのデータで
net.sf.hibernate.PropertyAccessException:
exception setting property value with CGLIB (
set hibernate.cglib.use_reflection_optimizer=false for more info)
setter of examples.hibernate.Emp.setComm
でエラー。最初は、プロパティの型がプリミティブ型だったので
それはそうだろうと思い、java.lang.Floatに変更。
うまくいきました。
emp.setEname("SCOTT2")ってやるだけで、
Session.flush()時に勝手にSQLはいてくれるのね。
というわけで、S2Hibernateの実装は完了。
S2Hibernateの使い方は簡単です。


class EmpDaoImpl implements EmpDao {
private S2SessionFactory sessionFactory_;

EmpDaoImpl(S2SessionFactory sessionFactory) {
sessionFactory_ = sessionFactory;
}

Emp getEmp(int empno) {
List result = sessionFactory_.getSession().find(
"from Emp where empno = ?",
new Integer(empno), Hibernate.INTEGER);
if (result.size() == 1) {
return (Emp) result.get(0);
} else {
return null;
}
}
}


class EmpServiceImpl implements EmpService {
private EmpDao empDao_;

EmpDaoImpl(EmpDao empDao) {
empDao_ = empDao;
}

Emp getEmp(int empno) {
return empDao_.getEmp(empno);
}
}



<component class="org.seasar.hibernate.impl.S2SessionFactoryImpl"/>


j2ee:requiredTx

トランザクションは自動的に処理されます。
Sessionもトランザクション中は自動的に維持され、
トランザクションが終了するときにflush(),close()されます。
S2SessionFactory.getSession()を呼び出すだけです。
設定ファイルも型によって自動解決されるので、かなりシンプル。