【发布时间】:2015-01-27 22:16:27
【问题描述】:
我整天都在试图找到这个问题的答案:
“如何在实体类中添加自动递增的“id”字段?”.
我正在使用 Morphia(Mongo DB 的类型安全 Java 库)。经过几个小时的源代码挖掘和谷歌搜索,我在org.mongodb.morphia.utils 包中找到了一个LongIdEntity 类。基于这个类,我实现了以下解决方案。见下文:
城市等级:
@Entity
public class City {
@Id
private Long id;
}
酒店等级:
@Entity
public class Hotel {
@Id
private Long id;
}
CityLongIdEntity 类:
public class CityLongIdEntity extends LongIdEntity {
public CityLongIdEntity(Datastore ds) {
super(ds);
}
}
HotelLongIdEntity 类:
public class HotelLongIdEntity extends LongIdEntity {
public HotelLongIdEntity(Datastore ds) {
super(ds);
}
}
DAO 实施:
CityDAO 类:
public class CityDAO extends BasicDAO<City, Long> {
public CityDAO(Datastore ds) {
super(ds);
}
@Override
public Key<City> save(City c) {
if (c.getId() == null) {
CityLongIdEntity ent = new CityLongIdEntity(getDs());
getDs().save(ent);
c.setId(ent.getMyLongId());
}
return getDs().save(c);
}
}
HotelDAO 类:
public class HotelDAO extends BasicDAO<Hotel, Long> {
public HotelDAO(Datastore ds) {
super(ds);
}
@Override
public Key<Hotel> save(Hotel h) {
if (h.getId() == null) {
HotelLongIdEntity ent = new HotelLongIdEntity(getDs());
getDs().save(ent);
h.setId(ent.getMyLongId());
}
return getDs().save(h);
}
}
或者你可以在Github看到所有这些代码
UML图也可以:
所有这些代码都按预期工作,我很高兴,但我有几个问题:
- 如您所见,我需要为每个实体创建额外的实体,例如:对于实体
City,我创建了CityLongIdEntity(该实体是自动递增功能的关键部分)。在这种情况下,如果我的应用程序将有 20 个实体(City、Address、Hotel、User、Room、Order等),我将需要创建 40 个类!我很害怕,但我认为这将是“代码气味”。 我说的对吗? - 另外,
Entity不知道EntityNameLongIdEntity和EntityNameLongIdEntity不知道Entity是谁。只有特定的EntityDAO类将 ans 组合在一起使用这些类。可以吗? 还是又是代码异味? - 每个
EntityDAO类覆盖扩展BasicDAO类并覆盖方法save()。不同DAO类的覆盖方法save()之间的差异很小。恐怕。那又是代码重复和代码异味。 我说的对吗?
请提供您的意见。
【问题讨论】:
-
您是否只需要
Long类型的ID?通常在 MongoDB 中,您使用ObjectId类型的 id 可以在客户端或服务器端(隐式)生成 -
+1 亚历克斯,每次使用递增的 id 保存也会导致额外的 findAndModify 调用。顺便说一句,Morphia 很好,但不灵活等,在使用了几年 Morphia 之后,我已经切换到 Jackson/MongoJack。
标签: java dao mongodb-java morphia