現在、レガシー システムでいくつかのモデルと DAO クラスをリファクタリングしており、MongoDB とさまざまなリレーショナル データベース オプションを使用して永続性についてパフォーマンスをテストしたいと考えています。インターフェイスでIDを表す最良の方法に苦労しています。私は次のパッケージ構造を持っています
mypackage.model.Model
mypackage.model.mongo.MongoModel
mypackage.model.mysql.MySQLModel
モデル インターフェイスは次のようになります。
public interface Model {
public String getValue();
public void setValue (String value);
}
MongoModel (この場合は morphia を使用) は次のようになります。
import mypackage.model.Model
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.Property;
import org.bson.types.ObjectId;
@Entity(value="collectionname")
public class MongoModel implements Model {
@Id private ObjectId id;
@Property("value") String value;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
MySQLModel (この場合は hibernate を使用) は次のようになります。
import mypackage.model.Model
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="tablename")
public class MySQLModel implements Model {
@Id @GeneratedValue private Long id;
@Column(name="value") private String value;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
ID のデータ型が異なる可能性があるため (この場合は Long と ObjectId)、Model インターフェイスで ID を表すにはどうすればよいでしょうか?
同じ問題が私の DAO にも当てはまります。
mypackage.dao/ModelDAO
mypackage.dao.mongo.MongoModelDAO
mypackage.dao.mysql.MySQLModelDAO
次のように、IDへのアップキャスト参照を追加することを検討しました
public interface Model {
public Object getId ();
public void setId (Object id);
public String getValue ();
public void setValue (String value);
}
次に、InvalidKeyFormat 例外を作成し、不正な ID が提供された場合にそれをスローします。ただし、これには ID 型のコンパイル時のチェックが欠けています。
キー生成メカニズムを構築し、データストア テクノロジ間でキー値を正規化することもできますが、MongoDB のデフォルトである ObjectId 形式を使用する利点があります。
この問題に対するよりエレガントな解決策はありますか?