我的问题更具体的是:
我希望多个前端的用户可以看到数据库行的“类型”。为了方便起见,假设我有一个person表,类型可以是Student、Teacher、Parent等。
具体的程序应该是带有hibernate的java,但是我怀疑这对这个问题是否重要,但是假设我的数据是在实体bean中建模的,一个Person“类型”字段是一个包含我的3个选项的枚举,理想情况下,我希望我的Person对象有一个getType()方法,我的前端可以使用它来显示类型,而且我还需要一种方法让我的前端知道潜在的类型。
使用enum方法,我有这个功能,但我没有的是无需重新编译就可以轻松添加新类型的能力。
因此,我的下一个想法是将我的类型放到一个配置文件中,并简单地将它们作为字符串存储在数据库中。我的getType()方法可以工作,但是现在我的前端必须加载一个配置文件来获取潜在的类型,现在没有什么可以让它们保持同步,我可以从我的配置文件中删除一个类型,数据库中的类型将不指向任何类型。我也不喜欢这样。
最后,我创建了一个PersonTypes数据库表,这个表有一个代表type_id的数字和一个定义类型的string。这是可以的,如果设置了外键,我不能删除我正在使用的类型,我的前端将需要看到潜在的类型,我想最好的方法是提供一个使用hibernate层的服务来做这件事。
这种方法的问题是,我的类型在数据库中都是英文的,并且我希望我的应用程序(最终)支持多种语言,因此我需要某种属性文件来存储这些类型的标签。那么,我是否有一个纯粹包含整数的PersonType表,然后是一个描述每个整数标签的属性文件?这似乎是倒退的?
有没有一个通用的设计模式来实现这种行为?或者,有没有人能建议一个好的方法来做到这一点?
致以敬意,
Glen x
发布于 2012-02-09 20:38:19
我会采用您所描述的最后一种方法。将类型信息放在单独的表中应该是足够好的,它可以让你利用SQL的所有好处来管理额外的约束(类型可能是唯一的,外键检查将保证你在删除一些记录时不会引入任何不正常的行为)。
当每种类型都有在属性文件中定义的i18n值时,你就是安全的。如果删除了该类型,则不会使用此值。如果需要,您可以在运行时更改属性文件。
但它会让你拥有这样的方法:
public String getName(PersonType type, Locale loc) {
if (loc.equals(Locale.EN)) {
return type.getEnglishName();
} else if (loc.equals(Locale.DE)){
return type.getGermanName();
} else {
return type.getDefaultName();
}
}发布于 2012-02-09 20:43:38
国际化动态值总是很困难的。存储类型的最后一个方法是正确的。
如果你想要i18n它们,你可以在你的应用中使用资源包作为属性文件。这会迫使您修改属性文件,并在每次添加新类型时重新部署和重新启动应用程序。如果在资源包中找不到类型,也可以回退到存储在数据库中的英文字符串。
或者,您可以实现一个自定义ResourceBundle类,它直接从数据库获取它的键和值,并有一个额外的PersonTypeI18n表,其中包含您希望支持的所有语言环境的翻译。
发布于 2012-02-09 20:40:27
您可以使用以下做法:
https://stackoverflow.com/questions/9210764
复制相似问题