Java 在ORM系统中实现事务

Java 在ORM系统中实现事务,java,sql,orm,transactions,innodb,Java,Sql,Orm,Transactions,Innodb,我正在构建一个Java应用程序,同时也在构建一个ORM(对象关系映射),它提供DAO(数据访问对象)。也许使用其中一个现有的更聪明,但是我在尝试设计ORM方面很有趣 目前,在这些类别cq功能中存在非常基本的功能: bean(数据存储在这些对象中) 约束(这些约束与bean结合在一起,用于搜索) 管理器(您将在这些对象上插入/更新/删除/搜索数据) 现在我想添加一个额外的层,即过渡层。我认为它们介于经理和正在使用的实际准备报表之间。我知道我可以直接使用SQL连接,但对我来说,这似乎不是很好,也

我正在构建一个Java应用程序,同时也在构建一个ORM(对象关系映射),它提供DAO(数据访问对象)。也许使用其中一个现有的更聪明,但是我在尝试设计ORM方面很有趣

目前,在这些类别cq功能中存在非常基本的功能:

  • bean(数据存储在这些对象中)
  • 约束(这些约束与bean结合在一起,用于搜索)
  • 管理器(您将在这些对象上插入/更新/删除/搜索数据)
现在我想添加一个额外的层,即过渡层。我认为它们介于经理和正在使用的实际准备报表之间。我知道我可以直接使用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;
}
我在考虑让
事务
直接像这样调用
管理器的函数

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()
?因为只有这样才能知道这些值

问候

public void add(Manager m, Action a, Bean b) { }