1

私は 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()

よろしく。

4

0 に答える 0