13

我正在研究 Java 的 ORM,而Active Objects引起了我的注意。显然,它受到了 Rails 的 ActiveRecord 的启发。根据我所读到的内容,这种方法似乎通过采用约定优于配置来解决现有 Java ORM 的许多问题。

你有什么经验?

4

4 回答 4

9

小心不要陷入“银弹综合症”......我只是听到开发人员说“约定优于配置”并认为这是一件很棒的事情......

Daniel Spiewak是一位可靠的程序员,我从他的博客中学到了很多东西,但这是一个相当简单的 API。这意味着,不要期望在生产使用、在高负载环境中工作等方面拥有大量经验。但有时,您所需要的只是简单的,而且还有其他项目,例如与 Active Objects 集成的Databinder。(Wicket + Databinder 是一个非常不错的轻量级 Java 网络框架。)

但是,例如,如果我进行大量批处理,我会远离这样的持久性框架。主要是因为我想要:

  1. 默认情况下不可变对象,自然会流入多线程处理,因为你强迫人们使用“删除/创建新”而不是“更新”类型的范例,这在许多数据库中节省了大量的磁盘使用量。
  2. 考虑通过使用专门的命令来简化 IO 的数据库访问,例如COPY

我通过直接编写 SQL 代码解决了很多数据库性能问题,而不是使用不适合该任务的 ORM。

于 2009-01-19T20:30:29.353 回答
5

免责声明:我是一个名为ActiveJDBC的项目的主要开发人员,该项目与 ActiveRecord 共享一些设计目标,并且正在积极开发中:

http://javalite.io

于 2011-01-21T08:46:53.700 回答
4

Active Objects 目前正在积极开发中,部分原因是 Atlassian 将其作为可能的插件数据持久性引擎与其企业软件套件一起使用。

Active Objects 项目现在位于 http://java.net/projects/activeobjects/pages/Home

在https://studio.atlassian.com/browse/AO跟踪使用 Active Objects 的 Atlassian 插件

特别要注意的是,Atlassian 刚刚开始构建 Active Objects Library 的文档,位于https://developer.atlassian.com/display/AO/Active+Objects

代码托管正在迁移到 BitBucket,SCM 从 svn 迁移到 mercurial。观看 bitbucket.org/activeobjects/ 了解这方面的进展。

于 2011-06-09T05:26:54.947 回答
1

这里引用了来自 ActiveObjects-core 中的 why-another-orm.txt 的一些引用:ActiveObjects 从一开始就被设计为尽可能易于使用,并且配置最少......行业走向“约定优于配置”。...事实上,ActiveObjects 努力成为一个简单易用的持久性框架,以至于一些功能(如分布式事务)被简单地省略了。这背后的原因是 99% 的用例不需要这种极端措施。如果您的项目在 ORM 中确实需要如此复杂的行为,那么您应该使用 Hibernate。就这么简单。 ActiveObjects 并非旨在取代 Hibernate。 相反,它的目标是为许多不需要 Hibernate 强大功能的常见场景提供更简单、更轻便的替代方案。简而言之,ActiveObjects 试图让数据库开发再次变得简单而有趣。

考虑像 Atlassian 这样的公司在 JIRA 中使用 ActiveObjects。

下面是一个使用 ActiveObjects 的例子:

存储库:

https://maven2-repository.dev.java.net/

使用以下依赖项:

  <dependency>
      <groupId>net.java.dev.activeobjects</groupId>
      <artifactId>activeobjects</artifactId>
      <version>0.8.2</version>
  </dependency>

创建以下文件:

实体.java

    import net.java.ao.RawEntity;
    import net.java.ao.schema.AutoIncrement;
    import net.java.ao.schema.NotNull;
    import net.java.ao.schema.PrimaryKey;

    public interface Entity extends RawEntity<Integer>{

        @AutoIncrement
        @NotNull
        @PrimaryKey("id")
        Integer getExportId();
    }      

TestAO.java

    import net.java.ao.Preload;
    import java.sql.Timestamp;

    @Preload
    public interface TestAO extends Entity {

        String getFirstName();
        void setFirstName(String firstName);

        String getLastName();
        void setLastName(String lastName);

        Timestamp getUpdateTimestamp();
        void setUpdateTimestamp(Timestamp updateTimestamp);
    }

测试.java

    EntityManager entityManager = EntityManager("jdbc:mysql://localhost:3306/test","test","test");
    ao.migrate(TestAO.class);
    TestAO testAO = ao.create(TestAO.class);

    testAO.setFirstName("firstName");
    testAO.setLastName("lastName");
    testAO.save();
于 2014-04-21T07:44:35.580 回答