我正在研究 Java 的 ORM,而Active Objects引起了我的注意。显然,它受到了 Rails 的 ActiveRecord 的启发。根据我所读到的内容,这种方法似乎通过采用约定优于配置来解决现有 Java ORM 的许多问题。
你有什么经验?
我正在研究 Java 的 ORM,而Active Objects引起了我的注意。显然,它受到了 Rails 的 ActiveRecord 的启发。根据我所读到的内容,这种方法似乎通过采用约定优于配置来解决现有 Java ORM 的许多问题。
你有什么经验?
小心不要陷入“银弹综合症”......我只是听到开发人员说“约定优于配置”并认为这是一件很棒的事情......
Daniel Spiewak是一位可靠的程序员,我从他的博客中学到了很多东西,但这是一个相当简单的 API。这意味着,不要期望在生产使用、在高负载环境中工作等方面拥有大量经验。但有时,您所需要的只是简单的,而且还有其他项目,例如与 Active Objects 集成的Databinder。(Wicket + Databinder 是一个非常不错的轻量级 Java 网络框架。)
但是,例如,如果我进行大量批处理,我会远离这样的持久性框架。主要是因为我想要:
COPY
我通过直接编写 SQL 代码解决了很多数据库性能问题,而不是使用不适合该任务的 ORM。
免责声明:我是一个名为ActiveJDBC的项目的主要开发人员,该项目与 ActiveRecord 共享一些设计目标,并且正在积极开发中:
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/ 了解这方面的进展。
这里引用了来自 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();