我正在尝试向数据库中插入一些代码。但是,在使用彼此为子类的模型时遇到了一个问题。我有一个包含所有这些小节的列表。
List<Metric> metrics = experiment.getMetrics();
for(Metric m : metrics) {
int id = m.getId();
// type checking code
}
指标包含“等级”和“数量”的小写字母。每个反过来都有自己唯一定义的表。我对使用类型检查的想法感到矛盾。但是我看不到任何立即的解决方案。一种似乎似乎没有更好的替代方法是在Metric表中创建一个称为metric_type的新列。但这将导致与类型检查非常相似的事情。有什么建议吗?
答案 0 :(得分:4)
由于不完全兼容的系统之间的映射,您遇到了Object-relational impedance mismatch。由于关系模型中的表之间无法进行继承,因此您将不得不在对象模型中牺牲一些使用继承的东西。除非您切换到object database,否则无论做什么都可能会出现边缘情况。
如果您在扩展Metric
的类中定义自定义CRUD操作,则加载实体可能会很棘手。如果每个表都有自己的PK序列,并且Metric.get(id)
和Rating
可以具有相同的数字PK值,则Quantity
会确切加载什么。
您可以看一下JPA如何解决此问题。它使用自定义注释,例如@MappedSuperclass
和@Entity
。我想这是类型检查的一种形式。
答案 1 :(得分:1)
我不建议您键入check
解决这个问题的OOP方法是在insert
类中创建一个Metric
方法。
然后使用将对象插入相应表的适当代码覆盖Rating
和Quality
中的方法。
for(Metric m : metrics) {
int id = m.getId();
m.insert();
}
在循环内部,只需调用insert
,由于后期绑定,将调用适当的方法并执行正确的代码。