アーキテクトになりたくて このページをアンテナに追加 RSSフィード

2006-02-22

[] hibernate2 から hibernate3 の変更点 ネイティブSQL

hibernateネイティブSQLを発行したい場合 Session クラスの createSQLQuery を使用する。

hibernate2 の場合は下記の通りだった。

net.sf.hibernate.Session
    public Query createSQLQuery(String sql, String returnAlias, Class returnClass);
    public Query createSQLQuery(String sql, String[] returnAliases, Class[] returnClasses);

これが hibernate3 になって createSQLQuery の引数戻り値が変更された。

org.hibernate.Session
    public SQLQuery createSQLQuery(String queryString) throws HibernateException;

hibernate2 の createSQLQuery の引数は、新設された SQLQuery クラスを使用する方法へと変更になった。

org.hibernate.SQLQuery
    public SQLQuery addEntity(String entityName);
    public SQLQuery addEntity(String alias, String entityName);
    public SQLQuery addEntity(String alias, String entityName, LockMode lockMode);
    public SQLQuery addEntity(Class entityClass);
    public SQLQuery addEntity(String alias, Class entityClass);
    public SQLQuery addEntity(String alias, Class entityClass, LockMode lockMode);

使用方法の例としては以下のようになる。

hibernate2

    Query query = getSession().createSQLQuery(sql, "abc", Abc.class);

hibernate3

    SQLQuery query = getSession().createSQLQuery(sql);
    query.addEntity("abc", Abc.class);

2006-02-18

[] トラックバックの受信処理で文字化け

現象

request の setCharacterEncoding を設定しているのに文字化けしてしまう。

原因

setCharacterEncoding より前に getParameter を行っていた為に文字エンコーディングが確定してしまい、設定した文字エンコーディング意味を成していなかった。

対応

トラックバックの(過渡期の)仕様として charset パラメータにて文字エンコーディングを指定するというものがあるが、Servlet 的には getParameter (正確には getReader)を呼んだ時点でエンコーディングが確定してしまう。手動でエンコーディングするしかないか。

2006-02-17

[][] Struts 1.2.8で使用されているCommons Validator 1.1.4のバグ


現象

Struts 1.2.8のURLバリデーションで正しいURLがエラーになってしまう。

原因

Struts 1.2.8で使用されているCommons Validator 1.1.4のURLバリデータ(正確には UrlValidator クラス)のバグ

対応

UrlValidator だけ Commons Validator 1.2 のクラスと置き換えることで対応


validatorのソースを読んでやっと問題が分かりました。もっと早くググっとけば・・・

2006-02-15

[] Hibernate で LazyInitializationException

現象

sessionは閉じていないのに、遅延初期化のオブジェクトを呼び出すと LazyInitializationException が発生する。

原因

遅延初期化のオブジェクトを呼び出す前に、親となるオブジェクトを evict していた為に発生していた。

対応

evict しないことで対応。


考えれてみれば納得なのだが、しばらく気がつかず悩んでしまった。盲目的に evict しちゃダメですね。