解决方案 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
从数据库中删除任何已删除的对象,然后将其从集合中删除。如果isPersistent()
是假的,你创建一个新的,如果isModified()
是真的,你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。