解決策 1
オブジェクトは、次のような基本型から継承できます。
abstract class PersistentObject {
private boolean persistent; // true if exists in database
private boolean modified; // true if modified
private boolean deleted; // true if deleted
public boolean isPersistent() { return persistent; }
protected void setPersistent() { persistent = true; }
public boolean isModified() { return modified; }
protected void setModified() { modified = true; }
public boolean isDeleted() { return deleted; }
protected void setDeleted() { deleted = true; }
}
また、オブジェクトを操作するときに、オブジェクトの状態を呼び出したり変更したりします。例えば :
public void setSomeIntvalue(int value) {
this.value = value;
setModified();
}
変更をコミットする (セットを反復処理する) と、DELETE
削除されたオブジェクトがデータベースから削除され、セットから削除されます。が false の場合isPersistent()
は新しいものを作成し、isModified()
true の場合はそれを作成UPDATE
し、それ以外の場合は何もしません。
解決策 2
オブジェクトのセットを管理するためのラッパーを持つことができます。何かのようなもの :
abstract class AbstractEntitySet<E> {
private HashSet<E> createdSet = new HashSet<E>();
private HashSet<E> modifiedSet = new HashSet<E>();
private HashSet<E> deletedSet = new HashSet<E>();
public void add(E e) {
add(e, false);
}
public void add(E e, boolean modified) {
if (modified) {
createdSet.remove(e);
modifiedSet.add(e);
deletedSet.remove(e);
} else {
createdSet.add(e);
modifiedSet.remove(e);
deletedSet.remove(e);
}
}
public void remove(E e) {
createdSet.remove(e);
modifiedSet.remove(e);
deletedSet.add(e);
}
public void applyChanges() {
for (E e : createdSet) {
createEntity(e);
}
createdSet.clear();
for (E e : modifiedSet) {
updateEntity(e);
}
modifiedSet.clear();
for (E e : deletedSet) {
deleteEntity(e);
}
deletedSet.clear();
}
protected abstract void createEntity(E e);
protected abstract void updateEntity(E e);
protected abstract void deleteEntity(E e);
}
このセットをオブジェクトに直接バインドすることもできます:
abstract class BaseEntity<E> {
private AbstractEntitySet<E> connectedSet;
@SuppressWarnings("unchecked")
public E bindTo(AbstractEntitySet<E> set) {
connectedSet = set;
return (E) this;
}
@SuppressWarnings("unchecked")
public void setCreated() { connectedSet.add((E) this, false); }
@SuppressWarnings("unchecked")
public void setModified() { connectedSet.add((E) this, true); }
@SuppressWarnings("unchecked")
public void setDeleted() { connectedSet.remove((E) this); }
}
オブジェクトを宣言する場所(たとえば):
class SomeObject extends BaseEntity<SomeObject> {
public void setSomeThing(...) {
...
setModified();
}
}
次のような新しいインスタンスを作成します
AbstractEntitySet<SomeObject> entitySet = ...;
...
SomeObject obj = new SomeObject().bindTo(entitySet);
次に、オブジェクトを更新し、次のようなすべての変更を適用します
obj.setSomeThing(...);
...
entitySet.applyChanges();
解決策 3
アプリケーションでHibernateやJPAなどの既存の永続化レイヤーを使用することもできます。