如何在model / dao接口中表示ID

时间:2012-07-30 17:48:33

标签: java hibernate mongodb

我目前正在遗留系统中重构一些模型和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格式会有好处。

这个问题有更优雅的解决方案吗?

1 个答案:

答案 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);
}