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(在这种情况下使用吗啡)看起来像这样

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(在这种情况下使用休眠)看起来像这样

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 回答