スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

Datastoreに長い文字列を保存する

Datastoreのエンティティでは、String型のフィールドに500文字バイト以上の文字列を保存することができません。代わりに「com.google.appengine.api.datastore.Text」型を使います(この型のフィールドにはインデックスを張れません)。

しかし、いま作っているシステムではBeanUtils.copyPropertiesでMapからエンティティへ値を詰め込むことをよくやっているので、そのままではStringをTextフィールドに型変換してくれません。BeansUtilsのConverterとかをカスタマイズすれば対応できるかもしれませんが、もっと簡単に、

@Persistent
private Text body;

public String getBody() {
    return body == null ? null : body.getValue();
}

public void setBody(String body) {
    this.body = body == null ? null : new Text(body);
}

って書いたらうまく動きました。

もしくは、フィールドをString型のままにしておいて、@Persistent(serialized = "true")とするだけでも行けそうな気がします(Blog型で保存されるはず)。

追記:結局selializedに..

結局serialized方式にしました。なんだかText型のフィールドにnullを入れておくと本番ではエラーが出るようなので。。しかしserializedにすると、Data Viewerで中身が見られなくなります。