我目前正在重构遗留系统中的一些模型和 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 格式有好处。
这个问题有更优雅的解决方案吗?