私は Java アプリケーションを構築しており、DAO (データ アクセス オブジェクト) を提供する ORM (オブジェクト リレーショナル マッピング) も構築しています。既存のものを使用する方が賢明だったのかもしれませんが、ORM を設計するのはとても楽しいです。
現在、これらのクラスの cq 関数のうち非常に基本的なものがあります。
- Beans (データはこれらのオブジェクトに格納されます)
- 制約 (これらは Bean と結び付き、検索に使用されます)
- マネージャー (これらのオブジェクトでは、データを挿入/更新/削除/検索します)
次に、追加のレイヤー、つまりトランジションを追加します。それらは、使用されている Manager と実際の PreparedStatement の間のどこかにあると思います。SQL 接続を直接使用できることはわかっていますが、それはあまり良くなく、オブジェクト指向にも思えません。
最も重要なレイアウトは Manager クラスのものです:
public abstract class Manager<B extends Bean, C extends AbstractConstraint<B>> {
protected final Connection connection;
public Manager(final Connection con) {
this.connection = con;
}
public final int insert(B b) throws InsertException {
}
public final boolean update(B b) throws UpdateException {
}
public final boolean delete(B b) throws DeleteException {
}
public final B get(C... c) throws SearchException {
}
public final List<B> search(C... c) throws SearchException {
}
public final List<B> getAll() throws SearchException {
}
abstract protected PreparedStatement insertPS(B b) throws SQLException;
abstract protected PreparedStatement updatePS(B b) throws SQLException;
abstract protected PreparedStatement deletePS(B b) throws SQLException;
abstract protected String searchQuery();
abstract protected B createBean(ResultSet rs) throws SQLException;
}
ここで、2 つの挿入/更新/削除の「ステートメント」を入力すると、データベースへのトランザクションとしてコミットされるという前提で、トランザクション クラスを追加する予定です。
どうすれば機能しますか?(与えられた例は実際の例ではなく、単純なものを構成しているだけです)
Transaction transaction = new Transaction(SQL.getConnection());
//Normal execution
int insertedId = ManagerFactory.getAccountManager().insert(new Account(...));
boolean updateSucceeded = ManagerFactory.getGeneralManager().update(new General(...)); //with modified data to reflect insertion of an account
transaction.commit();
Transaction
の呼び出し関数を次のManager
ように直接することを考えていました:
Transaction transaction = new Transaction(SQL.getConnection());
transaction.add(ManagerFactory.getAccountManager(), Action.INSERT, new Account(...));
transaction.add(ManagerFactory.getGeneralManager(), Action.UPDATE, new General(...));
transaction.commit();
次のようなものがある場所:
public void add(Manager m, Action a, Bean b) { }
実行する必要があるそれぞれのアクションを呼び出します
戻り値を呼び出し元に返すにはどうすればよいですか?
そして、それを 、 、 に分割したとしてもaddInsert()
、が行われるまで戻り値を返すのをどのように遅らせるのでしょうaddUpdate()
か? そうして初めて値がわかるからです。addDelete()
commit()
よろしく。