0

現在、レガシー システムでいくつかのモデルと 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 形式を使用する利点があります。

この問題に対するよりエレガントな解決策はありますか?

4

1 に答える 1

0

両方のクラスに GUID を使用し、ID を読み取り専用にして、手元のデータベースが保存時にそれを生成できるようにします。Mongomodel の場合、プロパティ getter/setter で GUID を ObjectId に変換する必要があります。MongoDb の場合、ObjectId のバイトをパディングして GUID を作成し、リポジトリで使用する場合はパディングを削除します。

public interface Model
{
    public Guid getId ();
    public String getValue ();
    public void setValue (String value);
}
于 2012-07-31T12:26:29.507 に答える