なるほど。@Ignoreか。
なるほど。setterやgetterメソッドに@IgnoreをつけるとDBのスキーマに変換しない対象になるのか。それで代わりに実装の方でデータを保持すれば良いと。気をつけないといけないのは、DBからデータを取り直しても実装の方のフィールドの値が初期化されるわけではないと言う点。同じレコードを取得しようとした場合はキャッシュされています。前述したとおり、他のプロセスから値が書き換えられる場合は@Transientをつけるルールなので、これは別に悪いことではないです。が、ちょっとハマっていました。
import net.java.ao.Entity; import net.java.ao.Implementation; import net.java.ao.schema.Ignore; @Implementation(NonPersistableFieldImpl.class) public interface NonPersistableField extends Entity{ @Ignore public void setDeleted(boolean deleted); @Ignore public boolean getDeleted(); public void setName(String name); public String getName(); }
public class NonPersistableFieldImpl { private boolean deleted = false; public NonPersistableFieldImpl(NonPersistableField delegated){ } public void setDeleted(boolean deleted){ this.deleted = deleted; } public boolean getDeleted(){ return deleted; } }
@Test public void notPersistant() throws Exception { NonPersistableField model = manager.create(NonPersistableField.class); model.setName("fool"); model.setDeleted(true); model.save(); model = manager.get(NonPersistableField.class, 1); assertTrue(model.getDeleted()); }
ActiveObjectsのアノテーションについてはまとめていきますかね。