整天我都试图在这个问题上找到答案:
"如何添加自动递增" id"实体类中的字段?" 。
我正在使用Morphia(Mongo DB的类型安全的java库)。经过几个小时的挖掘源代码和谷歌搜索后,我在LongIdEntity包中找到了org.mongodb.morphia.utils类。基于这个课程,我实现了以下解决方案。见下文:
城市类:
@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 class:
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个课程!我很害怕,但我认为这将是&#34; Code smell&#34;。 我是对的吗??Entity
并不了解EntityNameLongIdEntity
而EntityNameLongIdEntity
不知道谁是Entity
。并且只有特定的EntityDAO
类结合使用这些类。好吗? 或者又是代码味道? EntityDAO
类覆盖扩展BasicDAO
类并覆盖方法save()
。不同save()
类的覆盖方法DAO
之间的差异很小。我害怕。这是代码重复和代码再次闻到。 我是对的? 请提供您的意见。
答案 0 :(得分:2)
我们在某些实体上需要数字ID,但我们的实现略有不同:
我的实施还有两件事情,可能有点令人困惑:
employee-A
,公司B company-B
,...