私はこれを行うために全く別の構造を持っているでしょう:
public interface ITreeSaver {
public void save(Tree t);
public Tree load(String treeId);
}
あなたは、あなたが好きなように、この(プリミティブDAO)を実装することができます。 Hibernateを使用して、MySQLドライバ、XStream、またはその他のものへの生の呼び出し。
ツリー、アップル、または他のモデルオブジェクトが、どのように保存またはロードされるかを知っている/理解する必要はありません。
は、次のようなものを取るストレートSQLの呼び出しでこれを実装するには:私はちょうどポイントを説明しようとしているので、
public class SQLTreeSaver implements ITreeSaver {
public void save(Tree t) {
String id = t.getId();
if(id == null || id.isEmpty()) {
id = /*generate Id here*/;
}
SQL.execute("delete from TREES where id="+id);
SQL.execute("insert into TREES values (id, prop1, prop2) ("+id+",'"+t.getProp2()+"','"+t.getProp3()+"'");
SQL.execute("delete from APPLES where treeId="+id);
for(Apple a : t.getApples()) {
String appleId = a.getId();
if(appleId == null || appleId.isEmpty()) {
appleId = /*generate Id here*/;
}
SQL.execute("insert into APPLES values (id, tree, prop1) ("+appleId+","+id+",'"+a.getProp1()+"'");
}
}
public Tree load(String id) {
Tree t = new Tree();
if(id == null || id.isEmpty()) return t;
ResultSet treeSet = SQL.execute("select top 1 * from TREES where id="+id);
while(treeSet.hasNext()) {
t.setId(treeSet.getString("id"));
t.setProp1(treeSet.getString("prop1"));
t.setProp2(treeSet.getString("prop2"));
ResultSet appleSet = SQL.execute("select * from APPLES where tree="+id);
ArrayList<Apple> appleList = new ArrayList<Apple>();
while(appleSet.hasNext()) {
Apple a = new Apple();
a.setId(appleSet.getString("id");
/* omit the following if your apples have no idea who they belong to */
a.setTree(id);
a.setProp1(appleSet.getString("prop1"));
appleList.add(a);
}
if(appleList.size() > 0) {
treeSet.setApples(appleList);
}
}
return t;
}
}
悪いSQL呼び出しを許しなさい。あなたが抽象化したのは、オブジェクトが保存/読み込みインターフェイスからどのように保存されるのかということです。あなたは簡単にいくつかの休止状態に入ることができます。
public class HibernateTreeSaver implements ITreeSaver {
public void save(Tree t) {
HibernateHelper.getSession().save(t);
}
public Tree load(String id) {
Tree t = (Tree)HibernateHelper.getSession.load(id);
return t;
}
}
今、私は何が起こっているか見ることができます。あなたは、使用するITreeSaverの実装を選択するためのいくつかの並べ替えの方法を入れ、次にいくつかの柔軟性や適応性を持っています。クライアントがHibernateでサポートされていないデータベースを使用している場合はどうなりますか?フラットファイルを使用する場合はどうなりますか?ちょっとした努力のために、懸念事項と、システム上の新しい状況やニーズに容易に対応したり変更したりする能力がかなり優れていると感じています。
ORMなしではどうですか? – Dewayne
ORMがなければそれはあまり変わらないとは思いません。オブジェクトを保存すると、ツリーを永続化した後で、すべてのリンゴをリストに残します。私は、すべての言語がこの時点で何らかのORMを持っていると思います。本当に簡単です。 – stevedbrown
はい、ここでの全体的な質問は、リスト内のオブジェクトを持続するコードをどこに置いてテーブルtree_applesにしますか? – Dewayne