我目前正在遗留系统中重构一些模型和DAO类,并希望使用MongoDB和各种关系数据库选项测试持久性的性能。我正在努力寻找在界面中表示ID的最佳方式。我有以下包结构
mypackage.model.Model
mypackage.model.mongo.MongoModel
mypackage.model.mysql.MySQLModel
Model接口看起来像这样
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格式会有好处。
这个问题有更优雅的解决方案吗?
答案 0 :(得分: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);
}