初めてのActiveObjects

activeobjectsjavadb

公式ドキュメントのソースの写経です。

利用したライブラリ

Person.java

package sample;

import java.sql.Types;

import net.java.ao.Entity;
import net.java.ao.ManyToMany;
import net.java.ao.schema.SQLType;

public interface Person extends Entity{
	
	public String getName();
	public void setName(String name);
	
	public int getAge();
	public void setAge(int age);
	
	public String getEmail();
	public void setEmail(String email);
	
	@SQLType(Types.CLOB)
	public String getComment();
	
	@SQLType(Types.CLOB)
	public void setComment(String comment);
	
	public Family getFamily();
	public void setFamily(Family family);
	
	@ManyToMany(PersonToPerson.class)
	public Person[] getPeople();
}

Family.java

package sample;

import net.java.ao.Entity;
import net.java.ao.OneToMany;

public interface Family extends Entity{
	
	public String getName();
	public void setName(String name);
	
	@OneToMany
	public Person[] getPeople();

}

PersonToPerson.java

package sample;

import net.java.ao.Entity;

public interface PersonToPerson extends Entity {

	public Person getPersonA();
	public void setPersonA(Person person);
	
	public Person getPersonB();
	public void setPersonB(Person person);
}

Main.java

package sample;

import java.sql.SQLException;

import net.java.ao.EntityManager;

public class Main {

	public static void main(String[] args) throws SQLException {
		EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root");

		manager.migrate(Person.class);
		manager.migrate(Family.class);
		manager.migrate(PersonToPerson.class);
		
		Family family = manager.create(Family.class);
		family.setName("Spiewak");
		family.save();

		Person me = manager.create(Person.class);
		me.setName("Daniel Spiewak");
		me.setAge(27);
		me.setComment("I love databasing");
		me.setFamily(family);
		me.save();

		Person you = manager.create(Person.class);
		you.setName("Joe Blow");
		you.setAge(23);
		you.setComment("Guess who?");
		you.setFamily(family);
		you.save();

		PersonToPerson relation = manager.create(PersonToPerson.class);
		relation.setPersonA(me);
		relation.setPersonB(you);
		relation.save();

		family.getPeople(); // ...returns new Person[] {you, me}
		you.getPeople(); // ...returns new Person[] {me}

		/*
		 * SQLを使用する最初の例
		 */
		Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person");

		// ageが18以上のすべてのpersonを返す。
		Person[] overAge = manager.find(Person.class, "age >= ?", 18);

		/*
		 * 可変長パラメータと、ID値を意識しない、エンティティインスタンスの直接的な使用
		 */
		Person[] inFamilyOver21 = manager.find(Person.class, "age >= ? AND familyID = ?", 21, family);
		
	}
}

myBatis、Hibernateと違ってxml書かないのはとても楽。SQLも書けるみたいだし。これでいこう。
でもテーブル追加しようとして

Sample.java

package sample;

import net.java.ao.Entity;

public interface Sample extends Entity{

	public String getHoge();
	public void setHoge(String hoge);
}

これ追加して
Main.java

public static void main(String[] args) throws SQLException {
		EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root");
		
		manager.migrate(Sample.class);
		
		Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person");

		Person[] overAge = manager.find(Person.class, "age >= ?", 18);
		Person[] inFamilyOver21 = manager.find(Person.class, "age >= ?", 21);
		
		for(Person person : inFamilyOver21){
			System.out.println(person.getName());
		}
		
	}

で書き換えて実行したらPerson,Family,PersonToPersonのテーブルが全部消えた。なんでだろう