DomaでSerializableなオブジェクトを永続化したり取得したりするには その2

DomaでSerializableなオブジェクトを永続化したり取得したりするにはで、Personオブジェクトをシリアライズする方法を説明しました。前回はPersonHolderというクラスでシリアライズ/デシリアライズしたのですが、Personクラス自体でシリアライズ/デシリアライズしてしまう方法もあります。


エンティティクラスはこんな感じで普通にPerson型のプロパティを持ちます。

@Entity
public class Hoge {

    @Id
    int id;

    Person person;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

}

Personクラスには@Domainをつけてこんなかんじで定義します。要するに自分でシリアライズとデシリアライズします。

@Domain(valueType = byte[].class)
public class Person implements Serializable {

    public String name;

    public Person(String name) {
        this.name = name;
    }

    // ResultSet.getBytes(int)で取得された値がこのコンストラクタで設定される
    Person(byte[] bytes) {
        Person person = (Person) SerializableUtil.deserialize(bytes);
        this.name = person.name;
    }

    // PreparedStatement.setBytes(int, bytes)へ設定する値がこのメソッドから取得される
    byte[] getValue() {
        return SerializableUtil.serialize(this);
    }
}

PersonHolderを使った場合とシリアライズ/デシリアライズされるタイミングが異なっていますが、結果としては同じになります。
Personオブジェクト全体ではなく、プロパティだけをシリアライズ/デシリアライズの対象にしてもいいですね(そのほうが無駄はなくなります)。