【发布时间】:2016-11-20 21:51:15
【问题描述】:
我们开发了一个用 Java 编写并使用 Hibernate 映射的 HR 应用程序;其中一个特点是招聘阶段。
Candidate 类的建模如下:
public class Candidate {
private String id;
private Integer candidateCode;
private GregorianCalendar birthDate;
private String italianFiscalCode; //unique code for italian people
}
由于到目前为止我们只为市场开发代码非常依赖于特定法规,请查看 fiscalCode 类属性。
要求我们将这个概念推广到其他市场,例如唯一标识符可以不同,可以由多个字符串组成或根本不存在。
我想到的第一件事:
1 - 只需将该字段重命名为 countryIdentifier 并在需要时为特定国家添加其他字段。
private String countryIdentifier; //general unique code
private Integer greekAddedCode;
这意味着在需要的地方重构代码(所有使用旧 italianFiscalCode 的地方),重命名 DBMS 列(并最终添加其他列)并修改使用该字段的所有查询。
这在我看来是一个糟糕的实现
2 - 子类 Candidate 创建 ItalianCandidate 和 GreekCandidate 并在子类中移动特定字段。
问题是Candidate 类已经被HeavyCandidate 子类化了,它具有优化Hibernate 映射的唯一功能,因为我们将所有“重”属性(多对一和集合)移动到重类(这是我们所有 bean 都遵循的方法)。
在这种情况下,最正确的方法是什么?
【问题讨论】:
-
"问题是
Candidate类已经被HeavyCandidate子类化了"。不,Candidate应该有一个HeavyCandidate类型的字段 - 这不是 is a 关系。您当前的做法是对继承的严重滥用,也是为什么不应以这种方式滥用继承的一个很好的例子。 -
感谢您的回复@BoristheSpider。我想这种方法是为了能够通过 Hibernate 轻松映射 bean,但我同意它不是正确的。
标签: java hibernate oop inheritance design-patterns