在ORM系统中实现事务

时间:2013-07-02 16:51:38

标签: java sql orm transactions innodb

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

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

  • Beans(数据存储在这些对象中)
  • 约束(这些与豆类绑在一起并用于搜索)
  • 经理(在这些对象上,您将插入/更新/删除/搜索数据)

现在我想添加一个额外的图层,即Transitions。我认为它们落在了Managers和正在使用的实际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;
}

现在我计划添加一个Transaction类,其前提是当你在那里输入两个insert / update / delete'语句'时,它们将被作为事务提交给数据库。

我怎样才能让它发挥作用? (给出的例子不是一个真实的例子,只是简单地编写一些东西)

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

问候。

0 个答案:

没有答案