Polymorphicの実験(2) @Polymorphicを使用する。
ActiveObjectsのPolymorphicアノテーションの挙動を理解するために、・・・の第二回。
でも、じつは第一回の前に試していたのを忘れていただけです。
順序が逆です。
それはともかく、今回はシンプルなPolymorphicです。
概要
まず、UserとComputerが関連するとします。
Userが一台のComputerだけを使用するような場合です。
さらに、Computerには具体的にいくつかの種類があるとします。
Computerというのは大雑把な言い方で、もっと具体的に言えばPCやMacになるというような場合です。
このような条件から、ActiveObjectsのエンティティを作成し、さらにそのエンティティを操作するプログラムを作成しました。
記載項目
エンティティの関連図 | 作成したエンティティの関連図。上記の条件を満たします。 |
---|---|
DBに格納されたデータ | エンティティ関連を反映したテーブル構造とデータ内容になっています。 |
ソースファイル | 実行したプログラムです。 |
System.out.println()の出力結果 | プログラムの出力結果です。 |
SQLが発行された順序 | プログラムの実行により発行されたSQLを順に並べています。 |
以下、上記の表に挙げた項目が、続きます。
DBに格納されたデータ
mac
id | speed |
---|---|
1 | 150 |
pc
id | speed |
---|---|
1 | 80 |
person
id | computerID | computerType |
---|---|---|
1 | 1 | ao_test.Mac |
2 | 1 | ao_test.PC |
ソースファイル
package ao_test; import net.java.ao.EntityManager; import java.sql.SQLException; public class Driver { public static void main( String args ) throws SQLException { EntityManager manager = new EntityManager("jdbc:mysql://192.168.1.19/ao_test", "root", "root"); // ログ出力 java.util.logging.Logger.getLogger("net.java.ao").setLevel(java.util.logging.Level.FINE); // 1.マイグレーション manager.migrate( Person.class, Computer.class, Mac.class, PC.class ); // 2.エンティティを作成する。 create( manager ); // 3.エンティティを取得して表示する。 print( manager ); } // 2.エンティティを作成する。 private static void create( EntityManager manager ) throws SQLException { // 2.1.Macのエンティティを作成する。 Mac mac = manager.create( Mac.class ); mac.setSpeed( 150 ); mac.save(); // 2.2.PCをのエンティティ作成する。 PC pc = manager.create( PC.class ); pc.setSpeed( 80 ); pc.save(); // 2.3.Personのエンティティ作成する。 Person macUser = manager.create( Person.class ); macUser.setComputer( mac ); macUser.save(); Person pcUser = manager.create( Person.class ); pcUser.setComputer( pc ); pcUser.save(); } // 3.エンティティを取得して表示する。 private static void print( EntityManager manager ) throws SQLException { // 3.1.Personのエンティティをすべて取得する。 Person people = manager.find( Person.class ); // 3.2.Personのエンティティについて繰り返す。 for ( Person person : people ) { System.out.println( "person.toString() : " + person.toString() ); // 3.2.1.Personのエンティティに関連するComputerのエンティティを取得する。 Computer computer = person.getComputer(); System.out.prinltn( "\tcomputer.toString() : " + computer.toString() ); System.out.println( "\tcomputer.getSpeed() : " + computer.getSpeed() ); } } }
System.out.println()の出力結果
person.toString() : person {id = 1} computer.toString() : mac {id = 1} computer.getSpeed() : 150.0 person.toString() : person {id = 2} computer.toString() : pC {id = 1} computer.getSpeed() : 80.0
SQLが発行された順序
// 1.マイグレーション CREATE TABLE person ( id INTEGER AUTO_INCREMENT NOT NULL, computerID INTEGER, computerType VARCHAR(127), PRIMARY KEY(id) ) ENGINE=InnoDB CREATE INDEX index_person_computerid ON person(computerID) CREATE TABLE pC ( id INTEGER AUTO_INCREMENT NOT NULL, speed FLOAT, PRIMARY KEY(id) ) ENGINE=InnoDB CREATE TABLE mac ( id INTEGER AUTO_INCREMENT NOT NULL, speed FLOAT, PRIMARY KEY(id) ) ENGINE=InnoDB // 2.エンティティを作成する。 // 2.1.Macのエンティティを作成する。 INSERT INTO mac (id) VALUES (DEFAULT) UPDATE mac SET speed = ? WHERE id = ? // 2.2.PCをのエンティティ作成する。 INSERT INTO pC (id) VALUES (DEFAULT) UPDATE pC SET speed = ? WHERE id = ? // 2.3.Personのエンティティ作成する。 INSERT INTO person (id) VALUES (DEFAULT) UPDATE person SET computerid = ?,computertype = ? WHERE id = ? INSERT INTO person (id) VALUES (DEFAULT) UPDATE person SET computerid = ?,computertype = ? WHERE id = ? // 3.エンティティを取得して表示する。 // 3.1.Personのエンティティをすべて取得する。 SELECT id FROM person // 3.2.Personのエンティティについて繰り返す。 // 3.2.1.Personのエンティティに関連するComputerのエンティティを取得する。