カスタム検索

2008年8月4日月曜日

「Grails+BlazeDS」を鍛える

Grails+BlazeDSでデータを取得する時の話

・hasManyしているドメインをとろうとすると、型をキャストしようとした所でFlexからSessionナイヨーって怒られる

基本lazyモードなんで、データを取得しようとした時にFlex側からHibernateのSessionがとれないっぽい
web.xmlに以下の内容を追記してやる事で解決


<filter>
<filter-name>sessionView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>sessionView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


他にも criteria を使って eager で読み込んでやるとか、domainでeager にしておくとかでも良い、メモメモ

def criteria = Item.createCriteria()
def items = criteria.listDistinct{
fetchMode('contents', FM.EAGER)
}


・hasManyしたフィールドの扱い

hasManyしたドメインはarrayCollectionとしてくるので、Flex側のクラスを合わせておく。


public var contents:ArrayCollection;


他にも grails的にくっつくものをつけておくと、警告が出なくて幸せ。

public var id:int;
public var version:int;
public var metaClass:Object;


・hasManyしたドメインがオートキャストされない

Object扱いになっている、自前でキャストしてやる事は可能

for(var c:Number=0;item.contents.length > c; c++) {
var contents:Content = Content(item.contents[c]);
}

なぜかこのコードは書いておくだけで、実行される前にキャストされている。謎い。キモい。