私は Java の ORM を調べていて、Active Objectsが私の目に留まりました。どうやら、Rails の ActiveRecord に触発されたようです。私が読んだことによると、このアプローチは、構成よりも規約を採用することで、既存の Java ORM に関する多くの問題を解決しているようです。
それについてあなたの経験は何ですか?
私は Java の ORM を調べていて、Active Objectsが私の目に留まりました。どうやら、Rails の ActiveRecord に触発されたようです。私が読んだことによると、このアプローチは、構成よりも規約を採用することで、既存の Java ORM に関する多くの問題を解決しているようです。
それについてあなたの経験は何ですか?
「銀の弾丸症候群」に陥らないように注意してください...開発者が「構成よりも慣習」と言っているのを聞いただけで、それは素晴らしいことだと思います...
Daniel Spiewakは堅実なプログラマーです。私は彼のブログから多くのことを学びましたが、これはかなり単純な API です。つまり、本番環境での使用や高負荷環境での作業などについて、大量の経験を期待しないでください。しかし、必要なのは単純なものだけである場合もあり、Databinderのように Active Objects と統合する他のプロジェクトもあります。(Wicket + Databinder は、Java 用の非常に優れた軽量の Web フレームワークです。)
しかし、たとえば、大量のバッチ処理を行っている場合、このような永続化フレームワークには近づかないでしょう。主に、私が欲しいからです:
COPY
タスクに適していない ORM の使用を置き換えて、単純な SQL コードを記述するだけで、多くの DB パフォーマンスの問題を解決しました。
免責事項: 私はActiveJDBCと呼ばれるプロジェクトに取り組んでいる主な開発者であり、ActiveRecord といくつかの設計目標を共有し、積極的に開発を行っています。
Active Objects は現在活発に開発されています。その理由の 1 つは、Atlassian が同社のエンタープライズ ソフトウェア スイートで使用する可能性のあるプラグイン データ永続化エンジンとして採用したことです。
Active Objects プロジェクトは現在、 http://java.net/projects/activeobjects/pages/Homeにあります。
アクティブ オブジェクトを使用する Atlassian プラグインは、https://studio.atlassian.com/browse/AOで追跡されます。
特に、アトラシアンはアクティブ オブジェクト ライブラリのドキュメントの作成を開始したばかりであることに注意してください ( 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 はデータベース開発をシンプルで楽しいものにしようと試みています。
JIRA で ActiveObjects を使用している Atlassian のような企業を考えてみてください。
ActiveObjects の使用例を次に示します。
リポジトリ:
https://maven2-repository.dev.java.net/
次の依存関係を使用します。
<dependency>
<groupId>net.java.dev.activeobjects</groupId>
<artifactId>activeobjects</artifactId>
<version>0.8.2</version>
</dependency>
次のファイルを作成します。
Entity.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();