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()を呼び出すだけです。
設定ファイルも型によって自動解決されるので、かなりシンプル。