Activeobjectsって面白いな

RailsActiveRecordを意識して作られたと言われているjavaで作られた"Activeobjects"。
まだ触ったことなかったので、今日さっそく遊んでみた。

Activeobjectsはinterfaceからtableの生成からO/Rのマッピングをしているらしいので、まず
intefaceを書く。



UserInterface

package jp.my.test;

import net.java.ao.Entity;

public interface WebUser extends Entity{
	
	public String getUserId();
	public void setUserId(String s);
	
	public String getPassword();
	public void setPassword(String s);
}

NewsInterface

package jp.my.test;

import net.java.ao.Entity;
import net.java.ao.schema.*;


public interface News extends Entity {

	public void setTitle(String s);
	public String getTitle();
	
	public void setContents(String s);
	public String getContents();
	
	@SQLType(Types.DATE)
	public void setDate(java.util.Date date);
	public java.util.Date getDate();
	
	public WebUser getWriter();
	public void setWriter(WebUser wu);
}

testコード実行Main

package jp.my.test;

import java.sql.SQLException;
import net.java.ao.*;

import net.java.ao.schema.*;


public class Main {
	public static void main(String[] args) throws SQLException {
		EntityManager manager = 
		    new EntityManager("jdbc:postgresql:aotest","userid","password");
		
		//create table
		manager.migrate(WebUser.class);
		manager.migrate(News.class);
		
		
		//WebUserの登録
		WebUser wu = manager.create(WebUser.class);
		wu.setUserId("userId");
		wu.setPassword("password");
		wu.save();
		
		
		//find
		System.out.println("----- webUsers --------- ");
		WebUser[] wus = manager.find(WebUser.class);
		for (WebUser u : wus) {
			System.out.println("PrimaryKey:"+u.getID()+ "\nuserId:"+u.getUserId());
		}
		System.out.println("---");
		
		
		//記事の登録
		News news = manager.create(News.class);
		news.setTitle("Activeobjectsって面白いな");
		news.setContents("RailsのActiveRecordを意識....");
		news.setDate(new java.util.Date());
		news.setWriter(wu);
		news.save();
		
		
		//find
		System.out.println("----- 記事 --------- ");
		News[] nns = manager.find(News.class);
		for (News ns : nns) {
			System.out.println("PrimaryKey:"+ns.getID()+
					"\nTitle:"+ns.getTitle()+
					"\nContents:"+ns.getContents()+
					"\nDate    :"+ns.getDate() +
					"\nWriterId:"+ns.getWriter().getUserId());
		}
		System.out.println("---");
		
	}
}

実行結果

----- webUsers --------- 
PrimaryKey:1
userId:userId
---
----- 記事 --------- 
PrimaryKey:1
Title:Activeobjectsって面白いな
Contents:RailsのActiveRecordを意識....
Date    :2008-08-28 00:00:00.0
WriterId:userId
---

自動的に生成されたTable

TABLE webuser
(
  id serial NOT NULL,
  userid character varying(255),
  "password" character varying(255),
  CONSTRAINT webuser_pkey PRIMARY KEY (id)
)

TABLE news
(
  id serial NOT NULL,
  writerid integer,
  date date,
  title character varying(255),
  contents character varying(255),
  CONSTRAINT news_pkey PRIMARY KEY (id),
  CONSTRAINT fk_news_writerid FOREIGN KEY (writerid)
      REFERENCES webuser (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

となります。
XMLレス。interfaceのみでここまでとは。恐ろしし、面白いです。。。。しかも、まだ開発中(v0.8.2)なので、ActiveObject自体のソースの量が半端なく少ない。。。
うーん、これから実験的にこれ使ってみようかな。