Прежде всего, я бы посоветовал вам инкапсулировать ваши персистентные операции в какой-то объект репозитория, поэтому, если вы измените реализацию в будущем, у вас будет меньше работы. Если вы можете думать с точки зрения документов или каким-либо другим способом группировки связанных объектов («файл клиента», «сохраненная игра», «проект разработки»), то создайте интерфейс, который выглядит следующим образом:
public interface DocumentRepository {
public Document create();
public Document load(String id);
public void update(Document doc);
public Set<Document> findByCustomerNameFreeTextSearch(String query);
}
Это должно быть реализовано поверх множества бэкэндов.
Во-вторых, я бы изначально реализовал это с простой старой сериализацией. Что-то вроде:
public class SerializingDocumentRepository implements DocumentRepository {
private final File persistenceDir;
public Document create() {
return new Document();
}
public Document load(String id) {
ObjectInputStream in = new ObjectInputStream(persistenceDir, new File(id));
try {
return (Document)in.readObject();
}
finally {
in.close();
}
}
public void update(Document doc) {
ObjectOutputStream out = new ObjectOutputStream(persistenceDir, new File(id)).writeObject(doc);
try {
out.writeObject(doc);
}
finally {
in.close();
}
}
public Set<Document> findByCustomerNameFreeTextSearch(String query) {
Set<Document> hits = new HashSet<Document>();
for (String filename: persistenceDir.list()) {
Document doc = load(filename);
if (doc.getCustomer().getName().contains(query)) hits.add(doc);
}
return hits;
}
}
Только с обработкой исключений.
Эта реализация должна быть очень, очень простой для написания. Это может быть не очень быстро (по крайней мере, для поиска), но это будет достаточно быстро, чтобы позволить вам написать остальную часть приложения. После того как вы напишите остальную часть приложения, вы сможете сгенерировать достаточно данных, чтобы сделать лучший выбор в отношении сохранения.